javascript
持续集成之 Spring Boot 实战篇
本文作者: CODING 用戶 - 何健
這次實(shí)戰(zhàn)篇,我們借助「CODING 持續(xù)集成」,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 Spring Boot 項(xiàng)目從編碼到最后部署的完整過(guò)程。本教程還有 B 站視頻版,幫助讀者更好地學(xué)習(xí)理解。
思路
在線上環(huán)境構(gòu)建、測(cè)試、部署
這種情況,通常會(huì)將 jenkins 安裝在服務(wù)器上,確保構(gòu)建測(cè)試等操作環(huán)境和線上環(huán)境一致。
此時(shí)通常會(huì)在 jenkins 中配置好需要持續(xù)集成的倉(cāng)庫(kù),以及具體流程。
這種方式非常簡(jiǎn)單粗暴,也非常有效,但是缺點(diǎn)也很明顯??赡?jenkins 會(huì)成為線上環(huán)境的旁站漏洞,這是非常不安全的。
那么,我們就需要更高級(jí)的方式,可以線上環(huán)境之外的構(gòu)建測(cè)試,最終部署到線上環(huán)境?!窩ODING 持續(xù)集成」正是提供這類持續(xù)集成模式的平臺(tái)。
不在實(shí)際部署服務(wù)器上構(gòu)建、測(cè)試
為了避免占用線上服務(wù)器的資源,也為了避免安全問(wèn)題,我們可以使用單獨(dú)的 jenkins (或者其它此類軟件)完成構(gòu)建、測(cè)試、分發(fā),實(shí)際部署通過(guò)單獨(dú)的 webhook 實(shí)現(xiàn)。這樣就可以避免在線上環(huán)境安裝 Jenkins,還可以避免更復(fù)雜的系統(tǒng)安全維護(hù)。
這樣做的優(yōu)點(diǎn):不會(huì)影響在線服務(wù); 缺點(diǎn):部署地機(jī)器最好是可以公網(wǎng)訪問(wèn)的,否則會(huì)無(wú)法完成后續(xù)分發(fā)步驟。
終極解決方案:使用 SaaS 化的 Jenkins
Software as a Service,軟件即服務(wù)?!窩ODING 持續(xù)集成」集成了 SaaS 化的?Jenkins 等主流企業(yè)開(kāi)發(fā)流程工具,實(shí)現(xiàn)了 DevOps 流程全自動(dòng)化。開(kāi)箱即用,直接用它就好!
捋一下思路
我們這次實(shí)戰(zhàn)針對(duì)后一種思路
檢出代碼
構(gòu)建
測(cè)試
分發(fā)
觸發(fā)部署
實(shí)戰(zhàn)
實(shí)際體驗(yàn),還是很不錯(cuò)的。
視頻地址:CODING 持續(xù)集成 - Spring Boot 項(xiàng)目
第一步:初始化一個(gè)持續(xù)集成
首先,我們需要進(jìn)入準(zhǔn)備持續(xù)集成的項(xiàng)目。
這里我用 start.spring.io 初始化一個(gè) demo 示例項(xiàng)目,并推送到倉(cāng)庫(kù)。 為了方便大家,親自體驗(yàn),我準(zhǔn)備了一個(gè)現(xiàn)成的倉(cāng)庫(kù),可以直接 git clone 下來(lái)再 git push 到自己賬戶下使用。倉(cāng)庫(kù)地址:demoForCI
解壓 demo 項(xiàng)目,進(jìn)入 demo 目錄,初始化倉(cāng)庫(kù)。
別忘了 git config user.name yourname 和 git config user.email youremail
開(kāi)始體驗(yàn) 倉(cāng)庫(kù)準(zhǔn)備好后,就可以開(kāi)始體驗(yàn)「CODING 持續(xù)集成」。
第一次的使用,需要先創(chuàng)建一個(gè) Jenkinsfile,很多小伙伴會(huì)說(shuō),第一次用,不知道是啥。
沒(méi)關(guān)系,「CODING 持續(xù)集成」已經(jīng)給我們準(zhǔn)備好了模板,非常容易理解,可以認(rèn)為是特定格式語(yǔ)法寫一套 task 流程。
點(diǎn)擊一下 “簡(jiǎn)易模板”,更具實(shí)際情況修改一下就可以。
第二步:編寫 Jenkinsfile
為了方便理解,我們從簡(jiǎn)易模板開(kāi)始,分別修改對(duì)應(yīng)階段的任務(wù)。
檢出 這里不得不說(shuō),「CODING 持續(xù)集成」這里做的還是很方便的,提供了適用于好幾種不同場(chǎng)景的模板。默認(rèn)簡(jiǎn)易模板是帶有檢出部分的,我們可以根據(jù)實(shí)際情況進(jìn)行修改。默認(rèn)情況下,env.GIT_BUILD_REF 的值就是 master 主分支,實(shí)際上我們可以定制為其它專門用于構(gòu)建發(fā)的分支。
這里,大家可以自己修改具體要檢出的分支。
這里需要注意,Spring Boot 的 pom 中需要添加一個(gè)插件。 修改后:
<plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!-- 下面是添加的插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.6</version><configuration><skipTests>true</skipTests></configuration></plugin> 復(fù)制代碼分發(fā) jar 包到目標(biāo)服務(wù)器 這里比較無(wú)奈,我沒(méi)有單獨(dú)針對(duì)這次演示寫部署 jar 包和上傳 jar 包的 webhookApi,但是構(gòu)建好的 jar 包需要要放置到待部署的服務(wù)器。
于是有了這個(gè)過(guò)程,借助 scp 和私鑰來(lái)上傳構(gòu)建好的jar包。
這里千萬(wàn)記著提前部署好密鑰。并且將密鑰放到倉(cāng)庫(kù)一份,用于分發(fā)jar包。
部署
前面有提到,這里部署仍然需要觸發(fā)一個(gè)鉤子,否則只能手動(dòng)部署了。 這里我寫了一個(gè)最簡(jiǎn)單的,實(shí)際上我們可以寫細(xì)致一點(diǎn),判斷一下接口返回的結(jié)果再根據(jù)結(jié)果輸出部署情況。
第三步:保存 Jenkinsfile 并運(yùn)行
修改好 Jenkinsfile 和 pom.xml。
我們要保存 Jenkinsfile,編輯框可以直接編輯內(nèi)容,編輯好可以直接提交到倉(cāng)庫(kù)下的 ./Jenkinsfile
接下來(lái), 平臺(tái)會(huì)自動(dòng)讀取 Jenkinsfile 并開(kāi)始走持續(xù)集成的流程:
持續(xù)集成的流程是可以看到的:
每個(gè)階段都對(duì)應(yīng) Jenkinsfile 一個(gè) stage, 我們可以點(diǎn)擊查看對(duì)應(yīng)階段的構(gòu)建結(jié)果。
第四步:排查持續(xù)集成的報(bào)錯(cuò)
如果某個(gè)過(guò)程出錯(cuò),「CODING 持續(xù)集成」的流程會(huì)停止,并提示失敗。此時(shí)我們可以進(jìn)入具體節(jié)點(diǎn)查看具體失敗原因。
比如現(xiàn)在是提示“分發(fā) jar 包失敗”,那么我們可以點(diǎn)擊對(duì)應(yīng)節(jié)點(diǎn)展開(kāi)看看日志,排查具體分發(fā)失敗的原因。
現(xiàn)在可以清晰地看到,報(bào)錯(cuò)原因是我沒(méi)有填寫正確的主機(jī) ip。
文中涉及的文件及代碼
Jenkinsfile
pipeline {agent {// 此處設(shè)定構(gòu)建環(huán)境,目前可選有// default, java-8, python-3.5, ruby-2.3, go-1.11 等// 詳情請(qǐng)閱 https://dev.tencent.com/help/knowledge-base/how-to-use-ci#agentslabel "java-8"}stages {// 檢出倉(cāng)庫(kù)stage("檢出") {steps {// 這里sh調(diào)用ci-init 初始化sh 'ci-init'// 這里檢出倉(cāng)庫(kù),默認(rèn)檢出分支為環(huán)境變量中的GIT_BUILD_REFcheckout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]])}}// 構(gòu)建jar包stage("構(gòu)建") {steps {echo "構(gòu)建中..."// 輸出java版本sh 'java -version'// 調(diào)用maven 構(gòu)建jar包sh 'mvn package'echo "構(gòu)建完成."//收集構(gòu)建產(chǎn)物,這一步成功,我們就可以在平臺(tái)上看到構(gòu)建產(chǎn)物archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集構(gòu)建產(chǎn)物}}// 測(cè)試stage("測(cè)試") {steps {echo "單元測(cè)試中..."// 做單元測(cè)試sh 'mvn test'echo "單元測(cè)試完成."}}// 分發(fā)jar包,這里只是簡(jiǎn)單的通過(guò)scp分發(fā)jar包到目標(biāo)機(jī)器指定目錄stage("分發(fā)jar包") {steps {echo "分發(fā)中..."echo "chmod 600 pkey"sh 'chmod 600 authorized_keys.pem'echo "upload"sh 'scp -i authorized_keys.pem ./target/*.jar root@youip:/root/'echo "準(zhǔn)備部署"}}// 部署jar包stage("部署") {// 這里需要觸發(fā)一個(gè)部署的webhook,可以是一個(gè)很簡(jiǎn)單的重啟java進(jìn)程的操作steps {// 用curl 來(lái)觸發(fā)hooksh 'curl http://baidu.com'echo "請(qǐng)登錄服務(wù)器手動(dòng)部署"}}} } 復(fù)制代碼pom.xml
文中所用 Spring Boot 示例項(xiàng)目的 pom.xml
實(shí)際上,大家可以直接去 start.spring.io 參考照這份 pom 來(lái)創(chuàng)建一個(gè) demo。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>tech.hejian</groupId><artifactId>codingj8</artifactId><version>0.0.1-SNAPSHOT</version><name>codingj8</name><description>coding project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.6</version><configuration><skipTests>true</skipTests></configuration></plugin></plugins></build></project> 復(fù)制代碼總結(jié)
CODING?是一個(gè)面向開(kāi)發(fā)者的云端開(kāi)發(fā)平臺(tái),提供 Git/SVN 代碼托管、任務(wù)管理、在線 WebIDE、Cloud Studio、開(kāi)發(fā)協(xié)作、文件管理、Wiki 管理、提供個(gè)人服務(wù)及企業(yè)服務(wù),其中「CODING 持續(xù)集成」集成了 SaaS 化的?Jenkins 等主流企業(yè)開(kāi)發(fā)流程工具,實(shí)現(xiàn)了 DevOps 流程全自動(dòng)化,為企業(yè)提供軟件研發(fā)全流程管理工具,打通了從團(tuán)隊(duì)構(gòu)建、產(chǎn)品策劃、開(kāi)發(fā)測(cè)試到部署上線的全過(guò)程。
總結(jié)
以上是生活随笔為你收集整理的持续集成之 Spring Boot 实战篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网络初识
- 下一篇: centos挂载windows共享目录