一 背景
項目采用SpringBoot架構,如果用傳統的構建+發布的模式,QA要記錄很多的環境配置,做很多機械的操作,容易增加出錯的可能,工作效率比較低。
為了解決這個問題,我使用Jenkins作為持續集成工具,寫了一個Shell腳本,可以自動清理服務器環境和啟動對應的服務,大大提高了QA部署服務的工作效率。
二 使用資源
1)Gitee工程、Gitee賬號。(公司項目是用codehub維護,我這里使用碼雲來演示)
2)Ubuntu18測試環境服務器。
3)Windows10 開發機器。
4)Shell腳本,主要功能清理服務器部署環境、啟動服務。
4)Jenkin的web程序包。
三 操作時序圖
四 安裝和設置Jenkins
1)下載jenkins.war
下載地址:https://jenkins.io/download/
頁面下部,點擊紅框里面的文件下載。
2)啟動Jenkins
在任一安裝了java環境的機器上都可以啟動jenkins程序包
java -jar jenkins.war
在控制台會jenkins會輸出初始化密鑰
同樣可以去電腦對應的文件目錄里面找到這個key
b111033f1a404d799251929b4db3e14f
3)安裝Jenkins
jenkins默認8080端口,訪問 http://127.0.0.1:8080,輸入上面的初始化密鑰
點擊繼續,
選擇安裝推薦的插件
網絡快的話,大概幾分鍾
創建一個自己的用戶,保存並繼續,
保存繼續,
完成設置。
4)設置Jenkins
- 安裝擴展插件
選擇 可選插件
安裝這幾個[Pipeline Maven Integration]、[Maven Integration]、[Publish Over SSH]和[Gitee]。
勾選並選擇直接安裝。
- 系統設置
拉到頁面的下部,配置遠程測試服務器,
增加服務配置,
- 全局工具配置
分配設置maven配置文件、jdk目錄、git安裝目錄和maven目錄。
自己電腦上安裝了git后,會默認讀取git的安裝進程的
- 創建構建任務
輸入一個名字,例如我輸入:helloPudding
進入配置頁面,配置源代碼,
構建環境中,選擇 [Send files or execute commands over SSH after the build runs]
分兩步操作
第一步 清理服務器環境 和 第二步 啟動服務
服務器opt目錄的樹形結構是
goaloneService.sh 的腳步內容如下:
#!/bin/sh ## java env export JAVA_HOME=/lib/jvm/jdk1.8.0_181 export JRE_HOME=$JAVA_HOME/jre ## exec shell name EXEC_SHELL_NAME=$1\.sh ## service name SERVICE_NAME=$1 SERVICE_DIR=/opt JAR_NAME=$SERVICE_NAME\-0.0.1-SNAPSHOT.jar TIME_STR=$(date +%Y%m%d%H%M%S) PID=pid/$SERVICE_NAME\.pid WORK_DIR=$SERVICE_DIR/servicespace/$1 #function start start(){ cd $WORK_DIR if [ ! -d "log" ]; then mkdir log fi nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $JAR_NAME > log/$SERVICE_NAME.out 2>&1 & echo $! > $PID echo "**************** start $SERVICE_NAME success ****************" } # function stop stop(){ cd $WORK_DIR if [ -f "$PID" ]; then kill `cat $PID` rm -rf $PID fi echo "**************** stop $SERVICE_NAME ****************" sleep 6 TEMP_PID=`ps -ef | grep -w "$SERVICE_NAME" | grep "java" | awk '{print $2}'` if [ "$TEMP_PID" = "" ]; then echo "**************** $SERVICE_NAME process not exists or stop success ****************" else echo "**************** $SERVICE_NAME process pid is [$TEMP_PID] ****************" kill -9 $TEMP_PID fi echo "**************** stop $SERVICE_NAME success ****************" } # function clean clean(){ cd $WORK_DIR if [ ! -d "lastDeploy" ]; then mkdir lastDeploy fi if [ -f "$JAR_NAME" ]; then mv $JAR_NAME lastDeploy/$JAR_NAME$TIME_STR fi } case "$2" in start) start ;; stop) stop ;; restart) stop sleep 2 start echo "**************** restart $SERVICE_NAME success ****************" ;; clean) stop sleep 2 clean echo "**************** clean $SERVICE_NAME success ****************" ;; *) ## restart stop sleep 2 start ;; esac exit 0
配置maven打包命令,並跳過單元測試。
- 執行構建任務
控制台輸出部分日志:
[INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.670 s [INFO] Finished at: 2018-08-30T18:25:56+08:00 [INFO] Final Memory: 35M/333M [INFO] ------------------------------------------------------------------------ Waiting for Jenkins to finish collecting data [JENKINS] Archiving C:\Users\xxx\.jenkins\workspace\helloPudding\pom.xml to com.goalone/helloPudding/0.0.1-SNAPSHOT/helloPudding-0.0.1-SNAPSHOT.pom [JENKINS] Archiving C:\Users\xxx\.jenkins\workspace\helloPudding\target\helloPudding-0.0.1-SNAPSHOT.jar to com.goalone/helloPudding/0.0.1-SNAPSHOT/helloPudding-0.0.1-SNAPSHOT.jar SSH: Connecting from host [DESKTOP-DFCKDKK] SSH: Connecting with configuration [Test182] ... channel stopped SSH: EXEC: STDOUT/STDERR from command [cd /opt sh ./goaloneService.sh helloPudding clean] ... **************** stop helloPudding **************** **************** helloPudding process not exists or stop success **************** **************** stop helloPudding success **************** **************** clean helloPudding success **************** SSH: EXEC: completed after 8,230 ms SSH: EXEC: STDOUT/STDERR from command [cd /opt sh ./goaloneService.sh helloPudding start] ... **************** start helloPudding success **************** SSH: EXEC: completed after 202 ms SSH: Disconnecting configuration [Test182] ... SSH: Transferred 1 ( 0 + 1 ) file(s) Finished: SUCCESS
部署成功。
五 討論擴展
- jenkins是主流的持續集成工具,配置簡單,使用方便,配合shell腳本很容易操作服務器。類似的產品也有很多,詳情請來 https://www.oschina.net/p/jenkins/related 了解。
- 這里是通過java命令啟動jar包,現在虛擬化技術比較流行,可以配合docker進行持續集成。
- jenkins的功能還有很多,有時間可以詳細挖掘一下。
六 參考資料
https://www.jianshu.com/p/ba09cdc53343