<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    eagle

    學(xué)無(wú)止境,細(xì)節(jié)決定成敗.
    posts - 12, comments - 11, trackbacks - 0, articles - 2
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
    最近實(shí)踐Jenkins的自動(dòng)化發(fā)布,即實(shí)現(xiàn)指定項(xiàng)目的編譯-打包-上傳-發(fā)布的持續(xù)集成發(fā)版過程。中途遇到不少問題,整理如下以備后忘。 
    1.Jenkins安裝
    Jenkins是開源軟件,直接到官網(wǎng)下載最新版本安裝。具體過程不再累述,網(wǎng)上資料很多。本文安裝版本jenkins-2.138.2。
    2.Jenkins全局設(shè)置
    打開Jenkins-全局工具配置 配置編譯打包的工具,我使用的是maven,按具體環(huán)境配置好相應(yīng)信息。若項(xiàng)目工程使用其他工具,如gradle在對(duì)應(yīng)項(xiàng)配置信息即可。
    3.publish over ssh
    Jenkins - 插件管理 可選插件tab頁(yè)下安裝publish over ssh插件。用于Jenkins服務(wù)器ssh傳輸文件到Linux服務(wù)器。
    安裝好publish over ssh插件后,到Jenkins - 配置中 publish over ssh項(xiàng)設(shè)置相關(guān)上傳Linux服務(wù)器信息。
    • Passphrase  - 默認(rèn)上傳服務(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, 登錄驗(yàn)證key或者passphrase方式可以二選一,可根據(jù)具體情況選擇。

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

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


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



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


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


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

    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的進(jìn)程,找不到通過ps指令查找當(dāng)前運(yùn)行jar文件,再kill -9 殺掉。
    2.將老的jar程序移動(dòng)到lastDeploy目錄備份,并加上時(shí)間戳后綴。將待發(fā)布的新jar文件從tmp目錄移動(dòng)到發(fā)布目錄。
    3.啟動(dòng)新的jar程序文件。





    ---------------------
    月下孤城
    mail:eagle_daiqiang@sina.com
    主站蜘蛛池模板: 男人都懂www深夜免费网站| 亚洲午夜无码久久久久小说 | 亚洲AV成人精品日韩一区18p| 亚洲国产电影在线观看| 国产成人精品免费午夜app | 色猫咪免费人成网站在线观看| 中文字幕专区在线亚洲| 本免费AV无码专区一区| 中文亚洲AV片不卡在线观看| 久久免费观看视频| 亚洲成AV人片在线观看WWW| 午夜不卡久久精品无码免费| 亚洲天堂久久精品| 成视频年人黄网站免费视频| 亚洲日韩国产二区无码| 成人永久福利免费观看| 国产精品免费视频观看拍拍| 久久精品国产亚洲AV麻豆~| 三年片在线观看免费大全电影| 91亚洲国产成人久久精品网址| 免费观看成人毛片a片2008| 欧洲亚洲综合一区二区三区| 亚洲国产人成中文幕一级二级| 国产成人精品免费视频大全| 亚洲AV日韩AV天堂久久| 国产一卡2卡3卡4卡无卡免费视频 国产一卡二卡3卡四卡免费 | 91丁香亚洲综合社区| 日韩a在线观看免费观看| 永久免费观看黄网站| 亚洲人成网站影音先锋播放| 大地资源在线观看免费高清| 成人a毛片免费视频观看| 亚洲AV无码久久精品蜜桃| 欧美三级在线电影免费| 免费夜色污私人影院网站| 亚洲视频在线视频| 日韩免费a级在线观看| 七色永久性tv网站免费看| 亚洲国产成人九九综合| 亚洲精品麻豆av| 美女视频黄免费亚洲|