寫個shell腳本搭載jenkins讓你的程式部署飛起來

  • 2019 年 10 月 3 日
  • 筆記

轉載請註明】:

原文出處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

View Code

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 !!!

 

 


 -END-

 

   我的部落格即將同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=3dd87fzb99mo0