在未使用Jenkins自動化部署工具之前,我們部署使用gradle構建的單個springboot應用的流程大致如下:
1、在idea使用gradle build命令編譯打包jar包;
2、打開jar包存放的windows目錄窗口;
3、打開訪問服務端機器的SSH工具軟件並前進到部署目錄;
4、上傳第2步jar包到第3步目錄
5、停止當前應用進程;
6、備份當前應用jar包;
7、修改將要部署的jar包名稱為當前環境指定的文件名;
8、啟動應用
上面部署方式對於只有1、2個環境的應用來說還可以接受,不算太麻煩,但是對超過3個以上環境的部署會導致以下問題:
1、步驟繁瑣、多環境打包前要臨時調整端口、數據庫服務器配置,導致部署耗時較多;
2、全部手工操作容易出錯。
為解決上面兩個問題我研究了gradle的自定義task的相關配置知識,設計了一個一鍵部署到多個環境的task任務,此task的特點 如下:
1、只需要通過點擊一次idea gradle插件自定義的deploy命令即可實現編譯、打jar包、批量部署到多個環境
2、部署時會實時顯示簡單的部署日志,便於監控部署情況;
3、模塊化,方便添加新部署環境
3、節約部署時間,一旦配置測試好就可以避免手動操作易出錯的問題;
假設我們要部署的應用叫“養護管理”(簡稱“養管”),它是一個包含spring application啟動器的bimgis-mms-app模塊+N個業務模塊組成的應用,
我們以此為例演示如何一鍵部署到服務端,養管有dev(開發)、test(測試)兩個環境需要部署:
step1 打開idea gradle插件面板
step2 雙擊下圖中的deploy命令(路徑:bimgis-mms-app/Tasks/other/deploy)
step3 查看部署日志,確認部署是否成功
上面deploy命令內部運行流程如下:
上圖運行流程中涉及的8個步驟,依賴四類配置文件:
(1)build.gradle:存放在本地PC項目目錄,負責完成第1、2步驟;
(2)restart.sh:存放在服務主機的部署目錄,負責完成第3、4、5、6步驟;
(3) application.yml:springboot通用配置文件,負責完成第7步,設置加載哪個特定配置文件(profiles.active)、數據庫連接池配置、mybatis配置等;
(4)appliction-envName.yml:springboot特定環境配置文件,負責完成第8步,“envName“指環境名稱,例如appliction-dev.yml,spring容器會先加載第(3)類文件然后根據其
配置的profiles.active=dev,再加載appliction-dev.yml的配置,所以此文件用來保存不同環境的應用端口號、數據庫服務器配置等差異化配置信息。
以養管平台為例,進一步說明配置方法,養管有dev、test兩個部署環境,這兩個環境應用端口號、數據庫配置如下:
一、dev環境
- 應用端口號:8383
-
數據庫IP/端口號:192.168.201.156:3306
- 數據名稱:bim_mms_0
二、test環境
- 應用端口號:8282
-
數據庫IP/端口號:192.168.201.155:3306
- 數據名稱:bimgis_mms_lexi
我們將以上具有差異的配置信息分別存放到appliction-dev.yml、appliction-test.yml:
接着在appliction.yml里的profiles.active屬性配置默認加載appliction-dev.yml文件配置,即啟用應用時會加載dev環境的配置:
然后在build.gradle添加自定義任務deploy腳本:
//##############部署Jar包到服務端腳本 start ############### //引用與服務端通信插件 buildscript { repositories { jcenter() } dependencies { classpath 'org.hidetake:gradle-ssh-plugin:2.9.0' } } apply plugin: 'org.hidetake.ssh' //部署環境IP及登錄賬號 remotes { webServerDev { host = '192.168.201.156' user = 'accountName' password = 'password' } webServerTest { host = '192.168.201.155' user = 'accountName' password = 'password' } } def HOST_LIST = ["dev","test"]//部署環境列表 //部署文件存放位置及部署shell命令 def SSH_RUN (String host) { ssh.settings { knownHosts = allowAnyHosts } ssh.run { if("dev" == host){ session(remotes.webServerDev) { put from: "F:/IdeaProjects/bim/bimgis-web-application-mms/bimgis-mms-app/build/libs/bimgis-mms-app-1.0.0.jar", into: '/home/mmsuser/deploy/backend' execute """ cd /home/mmsuser/deploy/backend sh restart.sh dev; """ } }else if("test" == host){ session(remotes.webServerTest) { put from: "F:/IdeaProjects/bim/bimgis-web-application-mms/bimgis-mms-app/build/libs/bimgis-mms-app-1.0.0.jar", into: '/home/mmsuser/mms' execute """ cd /home/mmsuser/mms sh restart.sh test; """ } } } } //部署任務執行入口 task deploy { doLast { println("【############################開始部署############################】") int fileCount=0 HOST_LIST.each {String host-> fileCount++ println("第${fileCount}個,hostName:${host}") println("部署到服務端") //部署到服務端 SSH_RUN(host) println("部署成功!") } } } deploy.dependsOn(build)//編譯和打jar包 //##############部署Jar包到服務端腳本 end ###############
test環境服務主機執行的restart.sh腳本代碼如下:
#! /bin/sh ORG_FILE='mms-app-1.0.0.jar' #原始文件 DEPLOY_FILE='mms-app-1.0.0-8282.jar' #部署文件 DEPLOY_LOG='mms-app-1.0.0-8282.log' #日志文件 echo 'deploy task start...' #檢查待部署的原始文件是否存在 echo 'check orgFile is exist...' if [ ! -f "$ORG_FILE" ];then echo "$ORG_FILE is not exist! deploy task fail!" exit 1 fi #停止舊版本應用 echo 'shutdown system...' PID=`ps x|grep $DEPLOY_FILE|grep -v grep |awk '{print $1}'` if [ -z "$PID" ]; then echo "system process is not exist,skip to next step" else kill -15 $PID sleep 5 #暫停5秒等待上一步system的進程退出 fi #備份舊版本應用 echo 'backup...' rm $DEPLOY_FILE'.bak' rm $DEPLOY_LOG mv $DEPLOY_FILE $DEPLOY_FILE'.bak' echo 'copy orgFile to deployFile' cp $ORG_FILE $DEPLOY_FILE #啟動新版本應用 echo 'boot system...' if [ $# -lt 1 ];then echo "no spring active arg,boot on default active profile" #未指定加載哪個appliction-envName.yml nohup java -jar $DEPLOY_FILE > $DEPLOY_LOG 2>&1 & else echo "boot on specified spring active profile: $1"#已指定加載appliction-envName.yml nohup java -jar $DEPLOY_FILE --spring.profiles.active=$1 > $DEPLOY_LOG 2>&1 & fi exit 0
如果你要增加一個新部署環境add,需要做以下工作:
1、增加appliction-add.yml文件;
2、編輯build.gradle,增加如下紅色代碼:
//部署環境IP及登錄賬號
remotes {
webServerAdd {
host = '192.168.201.154'
user = 'userName'
password = 'password'
}
}
def HOST_LIST = ["dev","test","add"]//部署環境列表
ssh.run {
if("add" == host){
session(remotes.webServerAdd) {
put from: "F:/IdeaProjects/bim/bimgis-web-application-mms/bimgis-mms-app/build/libs/bimgis-mms-app-1.0.0.jar", into: '/home/mmsuser/deploy/backend'
execute """
cd /home/mmsuser/deploy/backend
sh restart.sh add;
"""
}
}else if("test" == host){
session(remotes.webServerTest) {
put from: "F:/IdeaProjects/bim/bimgis-web-application-mms/bimgis-mms-app/build/libs/bimgis-mms-app-1.0.0.jar", into: '/home/mmsuser/mms'
execute """
cd /home/mmsuser/mms
sh restart.sh test;
"""
}
}
}
}
3、增加對應的restart.sh文件
至此對一鍵部署應用到多環境的介紹進入尾聲,當前這種部署方式適合10人以下的開發團隊在未使用部署流線工具之前過渡使用,ssh.run部分執行的shell腳本也可以替換為docker命令
來支持部署到docker容器,此文僅作為優化項目開發流程的拋磚引玉,希望能對大家平時開發有所幫助,歡迎大家留言交流!