寫個shell指令碼搭載jenkins讓你的程式部署飛起來
【轉載請註明】:
原文出處:https://www.cnblogs.com/jstarseven/p/11399251.html 作者:jstarseven 碼字挺辛苦的.....
說明:java程式部署是簡單的,尤其是springboot普遍化使用以後,很多應用均採用jar方式部署
啟動方式:
1.前臺啟動> java -jar *.jar
2.後臺啟動> nohup java -jar *.jar >nohup.out 2>&1 &
但是每次都需要上傳jar去伺服器執行命令,是不是有點不太友好呢?另外可能有些對linux不熟悉的朋友,可能每次都要去查一下啟動命令,另外對伺服器端程式碼除錯也是很不方便!
解決:針對這個問題,為了統一部署方式,儘量做到簡單化,博主採用shell指令碼+jenkins的方式,力求做到一鍵部署,一鍵除錯,節約部署成本。
一、shell指令碼封裝應用程式部署命令
指令碼load.sh:
1 #!/bin/bash 2 . /etc/profile 3 . ~/.bash_profile 4 5 #------------------------------------------------------------------------------------------------ 6 #程式部署目錄 7 _workDir=/apps/zsxc-module-system 8 9 #部署程式jar名稱 10 _program=$_workDir/zsxc-module-system-1.0.0.jar 11 12 #部署程式jar springboot啟動引數如:--server.port=9000 --spring.profiles.active=dev 13 #不指定引數時,可以為空 14 _program_param='--spring.profiles.active=dev' 15 16 #是否啟動遠端除錯: 0 不開啟 1 開啟 17 _is_remote_debug=0 18 19 #啟動時指定日誌輸出檔案 20 _default_log_file=../logs/zsxc-module-system.log 21 22 #------------------------------------------------------------------------------------------------ 23 _programid=0 24 25 cmd=`which java` 26 tmp=`dirname $0` 27 cd $tmp 28 29 #start project 30 function startSA(){ 31 echo "starting $_program" 32 _programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` 33 if [ -z $_programid ] 34 then 35 case $1 in 36 start) 37 nohup $cmd -Dfile.encoding=UTF-8 -jar $_program $_program_param >> $_default_log_file 2>&1 & 38 _programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` 39 40 if [ -z $_programid ] 41 then 42 echo "Failed to start program." 43 else 44 echo "program has started. Process ID:$_programid"; 45 fi 46 ;; 47 start-f) 48 $cmd -Dfile.encoding=UTF-8 -jar $_program $_program_param 2>&1 49 _programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` 50 51 if [ -z $_programid ] 52 then 53 echo "Failed to start program." 54 else 55 echo "program has started. Process ID:$_programid"; 56 fi 57 ;; 58 esac 59 else 60 echo "program is already running. Process ID: $_programid" 61 exit -1; 62 fi 63 } 64 65 # stop project 66 function stopSA(){ 67 _programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` 68 if [ -z $_programid ] 69 then 70 echo "No program" 71 else 72 echo "program process ID: $_programid" 73 echo "Stopping..." 74 kill $_programid 75 sleep 1 76 echo "program stoped." 77 fi 78 } 79 80 # look current project status 81 function statusSA(){ 82 _programid=`ps aux | grep $_program | grep -v grep | awk 'END{print $2}'` 83 if [ -z $_programid ] 84 then 85 echo "program is stoped" 86 else 87 echo "program is running" 88 echo "process ID: $_programid" 89 fi 90 } 91 92 93 # jenkins app deploy 94 function jdeploySA(){ 95 BUILD_ID=dontKillMe 96 stopSA 97 mv -f $_program $_program.bak 98 echo "backup $_program success!" 99 mv -f $_workDir/target/* $_workDir 100 rm -rf $_workDir/target/ 101 cd $_workDir 102 if [ $_is_remote_debug -eq 1 ] 103 then 104 echo "$cmd -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar $_program $_program_param" 105 echo "service application is debugging,please run local application to debug !" 106 $cmd -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar $_program $_program_param 107 else 108 startSA start 109 fi 110 } 111 112 113 # use tips 114 if [ $# -ge 1 ] 115 then 116 case $1 in 117 start) 118 startSA $1 119 ;; 120 stop) 121 stopSA 122 ;; 123 start-f) 124 startSA $1 125 ;; 126 status) 127 statusSA 128 ;; 129 restart) 130 stopSA 131 startSA start 132 ;; 133 jdeploy) 134 jdeploySA 135 ;; 136 esac 137 else 138 echo "Usage: $0 [start|start-f|stop|status|restart] " 139 echo " <1> ./load.sh start , start program in background." 140 echo " <2> ./load.sh start-f , start program in foreground." 141 echo " <3> ./load.sh stop , stop program." 142 echo " <4> ./load.sh status , show program running status." 143 echo " <5> ./load.sh restart , restart program." 144 echo " <6> other shell command , please ask jstarseven." 145 fi
1.指令碼提供:./load.sh start 後臺啟動應用程式
2.指令碼提供:./load.sh start-f 前臺啟動應用程式
3.指令碼提供:./load.sh stop 停止應用程式
4.指令碼提供:./load.sh status 檢視應用程式狀態
5.指令碼提供:./load.sh restart 重啟應用程式
6.上面五條命令可以在伺服器端手動執行,指令碼中jdeploySA方法提供jenkins自動化部署使用
jdeploySA 方法採用./load.sh jdeploy方式提供jenkins呼叫,實現程式遠端部署重啟、除錯等
二、配置jenkins任務
前提:安裝jenkins服務,不知道安裝步驟的可以參考我之前的一篇文章
https://www.cnblogs.com/jstarseven/p/9166803.html
1.jenkins任務連線svn或者git
2.svn專案遠端打包
複製下列程式碼(無需修改,需要是maven專案...):
1 #!/bin/bash 2 echo "start execute shell maven package" 3 cd /root/.jenkins/workspace/$JOB_NAME/ 4 mvn clean 5 mvn package
3.傳送檔案並且呼叫shell指令碼:load.sh
1)load.sh 指令碼在專案中的位置
2)配置Publish over SSH 外掛傳送檔案的資訊
3)上面配置的 Remote directory 為 /zsxc-module-system ,此處真實路徑對應Publish over SSH 外掛中的配置路徑 /apps 加上 /zsxc-module-system 為 /apps/zsxc-module-system(可以根據自身情況修改)
OK,至此指令碼 load.sh 配合jenkins的配置全部完成,看著有點長,其實配置很簡單的,一勞永逸!下面就來看一下具體怎麼使用。
三、檢視jenkins任務輸出日誌
拉到日誌輸出的最下面,看到程式已經正常啟動,並且打印出了程序ID:8316
註釋:現在就可以每次提交程式碼到svn上,在jenkins上選擇構建,釋出最新的應用了
四、調整指令碼引數讓部署、除錯更加靈活
1.想要啟動時,追加啟動引數怎麼辦?
指令碼引數描述:
_workDir :程式部署目錄,jenkins Over SSH 配置中的Remote directory 也是伺服器端程式部署的路徑
_program : 部署程式jar名稱,對應maven專案打包後的程式jar
_program_param : 程式啟動引數,可以為空,如:--server.port=9000 --spring.profiles.active=dev
_is_remote_debug : 是否開啟遠端除錯
_default_log_file : 日誌檔案,預設存放為應用程式jar的上級logs目錄下,以專案名稱命名的日誌檔案
2.有人可能會問,我開發環境、測試環境和正式環境都在不同伺服器上啊?
這個我們是這樣做的,開發是在svn或者git上dev分支,dev分支對應的是jenkins開發環境任務(這裡只需要修改over ssh的伺服器資訊即可),load.sh對應開發環境的引數 --spring.profiles.active=dev等
開發到一個時間點,做code merge到test分支提供測試,test分支對應是jenkins測試環境的任務(對應測試伺服器)
測試完成,將test分支merge到master,對應jenkins正式任務,但也不一定全是採用jenkins的,畢竟有些非網際網路的專案,還要考慮到內網的情況。。。。
如果說,你們沒那麼多步驟,那你就可以隨便玩了,哈哈哈
3.如何開啟遠端除錯,除錯伺服器端程式碼?
1)將引數 _is_remote_debug 的值改為 1 提交程式碼值svn
2)配置本地除錯應用 idea版(eclipse類似)
3)在jenkins上選擇構建,檢視日誌(顯示正在等待除錯連線)
4)啟動本地除錯應用,打好斷點,訪問伺服器端部署程式(我這邊訪問的應用登入介面,做斷點除錯)
可以看到成功進行了應用的遠端除錯,斷點到了伺服器端的請求,是不是再也不用擔心伺服器端程式碼的bug,不好除錯了!除錯伺服器端程式碼,就和你在本地除錯一樣簡單,so easy !!!
加七哥微信:kinyseven,來扯犢子啊
動動手,關注一下,扎心了
大道七哥
我的部落格即將同步至騰訊雲+社群,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=3dd87fzb9