基於 CODING 的 Spring Boot 持續集成項目

本文做者:CODING 用戶 - 廖石榮

持續集成的概念

持續集成(Continuous integration,簡稱 CI)是一種軟件開發實踐,即團隊開發成員常常集成他們的工做,一般每一個成員天天至少集成一次,也就意味着天天可能會發生屢次集成。每次集成都經過自動化的構建(包括編譯,發佈,自動化測試)來驗證,從而儘早地發現集成錯誤。

持續集成的模式

如圖所示:
圖片php

  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 持續集成」java

CODING 提供的集成服務是什麼

「CODING 持續集成」是基於 Jenkins 的,兼容 Jenkinsfile 配置文件,若是您以前有使用過或者寫過 Jenkinsfile 相信您會很快上手。node

如何使用CODING持續集成服務

「CODING 持續集成」是基於 Jenkins 的,經過 Jenkinsfile 配置文件完成 CI 的步驟,接下來將引導您一步步建立一個持續集成示例。python

  • 登陸 CODING,進入項目中心,點擊左邊菜單集成服務,開通集成服務,配置完成以後會手動觸發第一次構建過程。

2.png

  • 找到或者建立 Jenkinsfile,若是你對於 Jenkins 比較熟悉的話,能夠本身編寫 Jenkinsfile 配置文件,也能夠採用 CODING 提供的模板文件,以下我就採用了 Jenkinsfile 模板文件來實行自動化持續集成服務,您能夠在修改 Jenkinsfile 的時候修改觸發方式,您能夠自行選擇是推送到某個標籤或者某個分支時間觸發構建。Jenkins 以及可以爲 agent 默認配置好 timezone 和 localtime (默認中國上海)。

3.png

  • 配置好 Jenkinsfile 文件以及配置好環境變量,點擊保存,即可以進行持續集成項目了。

如圖所示,集成步驟分爲拉取代碼-》構建-》測試-》部署等步驟,點擊每一個步驟能夠看到相應的命令執行狀況,下面來一個一個步驟配合 Jenkinsfile 文件解釋命令的一些執行狀況:git

代碼工程結構如圖所示:
image.pngweb

1.檢出項目,以下所示 Jenkinsfile 配置文件第一步經過 Git 檢出在遠程倉庫分支的代碼,至於哪一個分支能夠經過環境變量配置讀取 REF 這個環境變量shell

stage("檢出") {
            steps {
                sh 'ci-init'
                checkout(
                  [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], 
                  userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
                )
            }
        }

4.png
如上圖所示,第一步主要是執行從 Git 倉庫遠程拉取代碼,因此命令都是 Git 裏面的,包括讀取 Git 配置的環境變量包括更新 Jenkinsfile 文件apache

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 等。若有須要能夠聯繫客服開通其它語言環境。segmentfault

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 命令便可。緩存

第一次構建失敗:
image.png
如上圖所示,第一次執行執行構建 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>

成功構建結果以下
image.png

3.測試項目,以下所示,咱們 SpringBoot 工程經過 mvn test 測試命令便可,好比下面咱們測試其中一個用戶信息相關的單元測試:

stage("測試") {
            steps {
                echo "單元測試中..."
                // 請在這裏放置您項目代碼的單元測試調用過程,例如:
                sh 'mvn test -Dtest=com.my.segmentfault.website.Pwdtest'  //測試其中一個單元測試
                echo "單元測試完成."
            }
        }

第一次失敗測試結果以下:
image.png
image.png

後來經檢查,是單元測試代碼其中存在 bug,修正以後,正確的第二次測試結果以下:
圖片

4.部署項目,以下所示,部署項目命令能夠執行本身寫的部署腳本文件。各位能夠結合本身項目的真實環境,編寫簡單的部署腳本,好比上傳 jar 包到服務器,而後經過 java - jar XXXX.jar 包執行方式,以及上傳 war 包到 tomcat 服務器,而後啓動 tomcat 服務器等,也能夠結合本身公司項目須要編寫複雜的執行腳本文件,而後調用執行腳本命令,好比下面舉一個簡單的執行腳本例子。

部署命令:

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 上面實現團隊協做開發,一鍵部署做爲團隊以及公司文檔共享社區論壇等做用。

本文適量引用:「持續集成」詞條的百度百科
相關文章
相關標籤/搜索