基於 CODING 的 Spring Boot 持續整合專案
本文作者:CODING 使用者 - 廖石榮
持續整合的概念
持續整合的模式
如圖所示:
1. CI 過程:程式碼編寫 -> 原始碼庫(GitHub or gitlab)-> CI 伺服器(程式碼構建、自動化測試、結果反饋【構建結果】)
2. 涉及 CI 工具:Jenkins、Travis CI、TeamCity、Gitlab CI、CircleCI、Codeship 等,相關資料可以查詢對應的官網,其中應用廣泛的 Jenkins 和 Travis CI,市場上也推出了智慧化的持續整合服務商,比如「CODING 持續整合」,它是基於 Jenkins 配置整合服務,真正實現了一鍵提交程式碼,持續整合,部署服務。
持續整合的優點
1.解放了重複性勞動。
自動化部署工作可以解放整合、測試、部署等重複性勞動,而機器整合的頻率明顯比手工高很多。
2.更快地修復問題。
持續整合更早的獲取變更,更早的進入測試,更早的發現問題,解決問題的成本顯著下降。
3.更快的交付成果。
更早發現錯誤減少解決錯誤所需的工作量。整合伺服器在構建環節發現錯誤可以及時通知開發人員修復。整合伺服器在部署環節發現錯誤可以回退到上一版本,伺服器始終有一個可用的版本。
4.減少手工的錯誤。
在重複性動作上,人容易犯錯,而機器犯錯的機率幾乎為零。
5.減少了等待時間。
縮短了從開發、整合、測試、部署各個環節的時間,從而也就縮短了中間可以出現的等待時機。持續整合,意味著開發、整合、測試、部署也得以持續。
6.更高的產品質量。
整合伺服器往往提供程式碼質量檢測等功能,對不規範或有錯誤的地方會進行標緻,也可以設定郵件和簡訊等進行警告。
持續整合服務的選擇
關於網上整合服務的工具很多,其中尤其以 Jenkins 服務最受歡迎,但是 Jenkins 服務需要在自己伺服器上進行配置安裝,以及安裝各種外掛,對於剛上手的小白來說,可能存在一定的門檻,操作步驟繁多,操作不夠智慧,不是真正的自動化運維,缺少一鍵釋出構建服務。所以我們選擇了「CODING 持續整合」。
CODING 提供的整合服務是什麼
「CODING 持續整合」是基於 Jenkins 的,相容 Jenkinsfile 配置檔案,如果您之前有使用過或者寫過 Jenkinsfile 相信您會很快上手。
如何使用CODING持續整合服務
「CODING 持續整合」是基於 Jenkins 的,通過 Jenkinsfile 配置檔案完成 CI 的步驟,接下來將引導您一步步建立一個持續整合示例。
* 登入 CODING,進入專案中心,點選左邊選單整合服務,開通整合服務,配置完成之後會手動觸發第一次構建過程。
* 找到或者建立 Jenkinsfile,如果你對於 Jenkins 比較熟悉的話,可以自己編寫 Jenkinsfile 配置檔案,也可以採用 CODING 提供的模板檔案,如下我就採用了 Jenkinsfile 模板檔案來實行自動化持續整合服務,您可以在修改 Jenkinsfile 的時候修改觸發方式,您可以自行選擇是推送到某個標籤或者某個分支時間觸發構建。Jenkins 以及能夠為 agent 預設配置好 timezone 和 localtime (預設中國上海)。
* 配置好 Jenkinsfile 檔案以及配置好環境變數,點選儲存,便可以進行持續整合專案了。
如圖所示,整合步驟分為拉取程式碼-》構建-》測試-》部署等步驟,點選每個步驟可以看到相應的命令執行情況,下面來一個一個步驟配合 Jenkinsfile 檔案解釋命令的一些執行情況:
程式碼工程結構如圖所示:

1.檢出專案,如下所示 Jenkinsfile 配置檔案第一步通過 Git 檢出在遠端倉庫分支的程式碼,至於哪個分支可以通過環境變數配置讀取 REF 這個環境變數
stage("檢出") { steps { sh 'ci-init' checkout( [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]] ) } }
如上圖所示,第一步主要是執行從 Git 倉庫遠端拉取程式碼,所以命令都是 Git 裡面的,包括讀取 Git 配置的環境變數包括更新 Jenkinsfile 檔案
2.構建專案,如下命令所示構建這一步主要是初始化程式碼和打包程式碼,因為我們這個工程是以 Java 為主要開發語言,所以重點關注 Java 版本和安裝 Maven 命令即可打包,目前 CODING 提供的語言環境包括了 java-1.8.0_181, go-1.7.4, node-10.11.0, php-7.0.30, ruby-2.3, python-2.7.13 等。如有需要可以聯絡客服開通其它語言環境。
stage("構建") { steps { echo "構建中..." sh 'go version' sh 'node -v' sh 'java -version' // sh 'php -v' // sh 'python -V' // sh 'gcc -v' // sh 'make -v' // 請在這裡放置您專案程式碼的單元測試呼叫過程,例如: sh 'mvn clean' // mvn 清除快取 sh 'mvn install' // 構建 Maven 工程 // sh 'make' // make 示例 echo "構建完成." // archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集構建產物 } }
因為這個 SpringBoot 專案是以 Java 為主的專案,所以在 Jenkinsfile 檔案命令裡面其實可以把其它語言的檢查版本命令去掉,只需要執行 java -version 命令即可。
第一次構建失敗:
如上圖所示,第一次執行執行構建 jar 包失敗,因為在本地可以正常 mvn install,所以起初我百思不得其解,上網找了很多資料,經過多番查詢,最後在 Stack Overflow 找到了答案,這是由於 OpenJDK 1.8.0_181 這個版本中存在的一個 bug 所致,原文如下: 連結 最終解決方案採用更改 pom.xml 檔案:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <useSystemClassLoader>false</useSystemClassLoader> <skipTests>true</skipTests> </configuration> </plugin>
成功構建結果如下:

3.測試專案,如下所示,我們 SpringBoot 工程通過 mvn test 測試命令即可,比如下面我們測試其中一個使用者資訊相關的單元測試:
stage("測試") { steps { echo "單元測試中..." // 請在這裡放置您專案程式碼的單元測試呼叫過程,例如: sh 'mvn test -Dtest=com.my.blog.website.Pwdtest'//測試其中一個單元測試 echo "單元測試完成." } }
第一次失敗測試結果如下:

後來經檢查,是單元測試程式碼其中存在 bug,修正之後,正確的第二次測試結果如下:

4.部署專案,如下所示,部署專案命令可以執行自己寫的部署指令碼檔案。各位可以結合自己專案的真實環境,編寫簡單的部署指令碼,比如上傳 jar 包到伺服器,然後通過 java - jar XXXX.jar 包執行方式,以及上傳 war 包到 tomcat 伺服器,然後啟動 tomcat 伺服器等,也可以結合自己公司專案需要編寫複雜的執行指令碼檔案,然後呼叫執行指令碼命令,比如下面舉一個簡單的執行指令碼例子。
部署命令:
bash stage("部署") { steps { echo "部署中..." sh './deploy.sh start' // 啟動 tomcat 服務 // sh './deploy.sh stop' // 停止 tomcat 服務 echo "部署完成" } }
deploy.sh 指令碼:(其中一些 tomcat 服務路徑配置根據自己需要進行修改)
#!/bin/bash tomcat_home=/usr/tomcat/apache-tomcat-8.0.48//修改為自己伺服器的 tomcat 路徑 SHUTDOWN=$tomcat_home/bin/shutdown.sh STARTTOMCAT=$tomcat_home/bin/startup.sh case $1 in start) echo "啟動$tomcat_home" $STARTTOMCAT ;; stop) echo "關閉$tomcat_home" $SHUTDOWN pidlist=`ps -ef |grep tomcat |grep -v "grep"|awk '{print $2}'` kill -9 $pidlist #!/bin/bash tomcat_home=/usr/tomcat/apache-tomcat-8.0.48 SHUTDOWN=$tomcat_home/bin/shutdown.sh STARTTOMCAT=$tomcat_home/bin/startup.sh case $1 in start) echo "啟動$tomcat_home" $STARTTOMCAT ;; stop) echo "關閉$tomcat_home" $SHUTDOWN pidlist=`ps -ef |grep tomcat |grep -v "grep"|awk '{print $2}'` kill -9 $pidlist stop) echo "關閉$tomcat_home" $SHUTDOWN pidlist=`ps -ef |grep tomcat |grep -v "grep"|awk '{print $2}'` kill -9 $pidlist #刪除日誌檔案,如果你不先刪除可以不要下面一行 rm $tomcat_home/logs/* -rf #刪除tomcat的臨時目錄 rm $tomcat_home/work/* -rf ;; restart) echo "關閉$tomcat_home" $SHUTDOWN pidlist=`ps -ef |grep tomcat |grep -v "grep"|awk '{print $2}'` kill -9 $pidlist #刪除日誌檔案,如果你不先刪除可以不要下面一行 rm $tomcat_home/logs/* -rf #刪除tomcat的臨時目錄 rm $tomcat_home/work/* -rf sleep 5 echo "啟動$tomcat_home" $STARTTOMCAT #看啟動日誌 #tail -f $tomcat_home/logs/catalina.out ;; logs) cd /mnt/alidata/apache-tomcat-7.0.68/logs tail -f catalina.out ;; esac
服務啟動展示
系統主頁如下圖所示:

文章詳情如下圖所示:

歸檔頁面如下圖所示:

系統後臺管理如圖所示:

總結
CODING是一個面向開發者的雲端開發平臺,提供 Git/SVN 程式碼託管、任務管理、線上 WebIDE、Cloud Studio、開發協作、檔案管理、Wiki 管理、提供個人服務及企業服務,其中實現了 DevOps 流程全自動化,為企業提供軟體研發全流程管理工具,打通了從團隊構建、產品策劃、開發測試到部署上線的全過程。「CODING 持續整合」集成了 Jenkins 等主流企業開發流程工具,如上所示,這個以 SpringBoot 打造的 CMS 社群系統便可以在 CODING 上面實現團隊協作開發,一鍵部署作為團隊以及公司文件共享社群論壇等作用。
本文適量引用:“持續整合”詞條的百度百科