自定義Gradle Task實現一鍵批量部署Springboot應用


    在未使用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容器,此文僅作為優化項目開發流程的拋磚引玉,希望能對大家平時開發有所幫助,歡迎大家留言交流!

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM