eagle

          學(xué)無止境,細節(jié)決定成敗.
          posts - 12, comments - 11, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          jenkins 自動化發(fā)布實踐整理

          Posted on 2018-11-08 11:53 月下孤城 閱讀(570) 評論(0)  編輯  收藏 所屬分類: java
          最近實踐Jenkins的自動化發(fā)布,即實現(xiàn)指定項目的編譯-打包-上傳-發(fā)布的持續(xù)集成發(fā)版過程。中途遇到不少問題,整理如下以備后忘。 
          1.Jenkins安裝
          Jenkins是開源軟件,直接到官網(wǎng)下載最新版本安裝。具體過程不再累述,網(wǎng)上資料很多。本文安裝版本jenkins-2.138.2。
          2.Jenkins全局設(shè)置
          打開Jenkins-全局工具配置 配置編譯打包的工具,我使用的是maven,按具體環(huán)境配置好相應(yīng)信息。若項目工程使用其他工具,如gradle在對應(yīng)項配置信息即可。
          3.publish over ssh
          Jenkins - 插件管理 可選插件tab頁下安裝publish over ssh插件。用于Jenkins服務(wù)器ssh傳輸文件到Linux服務(wù)器。
          安裝好publish over ssh插件后,到Jenkins - 配置中 publish over ssh項設(shè)置相關(guān)上傳Linux服務(wù)器信息。
          • Passphrase  - 默認上傳服務(wù)器密碼
          • Path to key  - Jenkins服務(wù)器ssh key目錄
          • key  - Jenkins服務(wù)器ssh key內(nèi)容,一般為~/.ssh目錄下id_rsa.pub內(nèi)容
          • SSH Servers - 上傳服務(wù)器的配置
          Jenkins ssh key的生成網(wǎng)上有很多資料,不再過多介紹。我是使用的Passphrase, 登錄驗證key或者passphrase方式可以二選一,可根據(jù)具體情況選擇。

          ssh server設(shè)置:
          統(tǒng)一配置發(fā)布文件的Linux服務(wù)器,如下圖。

          其中 remote directory 表示發(fā)布文件到服務(wù)器的默認目錄。若為空默認為當前登錄用戶目錄。


          4.項目發(fā)布
          本文以svn的訂單order項目為例,通過Jenkins工具,經(jīng)過編譯-打包-上傳-發(fā)布過程,動態(tài)的將java jar發(fā)布到兩臺服務(wù)器。
          4.1 新建任務(wù)
          Jenkins - 新建任務(wù),創(chuàng)建order發(fā)布的一個任務(wù)。由于項目是基于maven的,所以選擇'構(gòu)建一個maven項目'進入配置頁面。



          配置svn代碼庫信息:
          build配置:對應(yīng)項目輸入項目構(gòu)建命令。


          p
          ost steps:配置發(fā)布服務(wù)器的信息。如下圖。


          由于order訂單服務(wù)是集群部署,分別設(shè)置了2臺 ssh server。
          source files 是指上傳到服務(wù)器的發(fā)布文件。Jenkins默認編譯后文件在workspace目錄下,這里輸入target/{發(fā)布jar文件}. 上傳到發(fā)布服務(wù)器后,不需要target目錄,所以 remove prefix中填target/。
          Remote directory可以為空,由于我們在第3步中已經(jīng)設(shè)置了全局默認ssh server的remote directory ,所以這里可以不填,如這里設(shè)置將覆蓋之前的全局配置目錄。
          exec command是文件上傳到發(fā)布服務(wù)器后,需要執(zhí)行的shell腳本指令,用于發(fā)布order jar包的啟動備份命令。圖中app-deploy.sh為應(yīng)用jar文件的啟動備份shell腳本文件,需放到發(fā)布服務(wù)器指定目錄下。其中BUILD_ID=DONTKILLME是為了kill 老的運行jar時避免當前執(zhí)行進程不被誤殺。

          app-deploy.sh文件:

          #!/bin/sh
          ## java env
          ## service name
          SERVICE_NAME=$1
          SERVICE_DIR=/usr/service/
          JAR_NAME=$SERVICE_NAME\.jar
          PID=$SERVICE_NAME\.pid

          #function start
          start(){
             cd $SERVICE_DIR
             source /etc/profile
             ## nohup java -Xms256m -Xmx512m -jar $JAR_NAME >log/$SERVICE_NAME.out 2>&1 &
             nohup java -jar -Xms256m -Xmx256m $JAR_NAME >/dev/null 2>&1 &
             echo $! > $SERVICE_DIR/$PID
             echo "#### start $SERVICE_NAME"
          }

          # function stop
          stop(){
                  cd $SERVICE_DIR
                  if [ -f "$SERVICE_DIR/$PID" ]; then
                          kill `cat $SERVICE_DIR/$PID`
                          rm -rf $SERVICE_DIR/$PID
                  fi
                  echo "#### stop $SERVICE_NAME"
                  
              sleep 3


              PROCESS=`ps -ef|grep $JAR_NAME |grep -v grep|grep -v PPID|awk '{ print $2}'`
              for i in $PROCESS
              do
                echo "Kill the $SERVICE_NAME process [ $i ]"
                kill -9 $i
              done
          }

          # function clean
          clean(){
                  echo "---start do do clean phase."
              cd $SERVICE_DIR
                  if [ ! -d "lastDeploy" ]; then
                     mkdir lastDeploy
                  fi
                  if [ -f "$JAR_NAME" ]; then
                     echo "backup $JAR_NAME"
                     mv $JAR_NAME lastDeploy/$JAR_NAME\_`date "+%Y%m%d%H%M%S"`
                  fi 

                  if [ -d "tmp" ]; then
                 mv -f tmp/$JAR_NAME ./
              fi
          }

          case "$2" in

              start)
                  start
                  ;;

              stop)
                  stop
                  ;;

              restart)
                  stop
                  sleep 2
                  start
                  echo "#### restart $SERVICE_NAME"
                  ;;
             
              clean)
                  stop
                      sleep 2
                  clean
                  echo "#### clean $SERVICE_NAME"
                  ;;
                  
              deploy)
                  stop
                  clean
                  start
                  echo "#### deploy $SERVICE_NAME"
                  ;;    

          esac
          exit 0
          以上腳本發(fā)布邏輯如下:
          1.先stop老的jar應(yīng)用程序。先從記錄的pid文件中找kill的進程,找不到通過ps指令查找當前運行jar文件,再kill -9 殺掉。
          2.將老的jar程序移動到lastDeploy目錄備份,并加上時間戳后綴。將待發(fā)布的新jar文件從tmp目錄移動到發(fā)布目錄。
          3.啟動新的jar程序文件。





          ---------------------
          月下孤城
          mail:eagle_daiqiang@sina.com
          主站蜘蛛池模板: 壤塘县| 游戏| 东港市| 桐庐县| 潜山县| 鄱阳县| 玉屏| 津市市| 凌源市| 新竹市| 蓬莱市| 阳新县| 马山县| 通渭县| 兖州市| 青阳县| 明水县| 绥棱县| 五河县| 永年县| 观塘区| 封开县| 丰顺县| 铜山县| 嘉兴市| 博乐市| 蒙自县| 启东市| 芦山县| 阳山县| 北宁市| 信宜市| 白山市| 油尖旺区| 德保县| 开阳县| 皮山县| 利辛县| 应城市| 渭源县| 朝阳市|