jenkins+gitlab+docker+springboot構建及回滾實現


1、需求及實現方案

1.1 需求:

應用服務是一個springboot的java項目,項目中需要注意的是服務端口和日志映射目錄。代碼托管在gitlab上,服務的打包及發布是在jenkins這台服務器上。

1.2 實現方案:

之前的實現方法是jenkins創建maven項目來構建,然后通過ssh方式發布到應用服務器,但因為是maven項目,實現發布新版本好說,要回滾不好在jenkins上實現,因為每次構建項目都要調用mvn,不管有沒有用到新包,會浪費時間。

所以稍微改版一下,jenkins創建自由風格項目,然后用參數化構建,用build_id來作為每次備份的目錄名。shell腳本通過參數來判斷新發布的時mvn構建,回滾時根據參數選項回滾到指定版本。

2、實現過程

2.1 各軟件的安裝過程就不在這介紹了,列一下需要的服務器及軟件:

gitlab:獨立服務器,代碼托管。

jenkins:獨立服務器,可以docker方式啟動,也可以物理機啟動。因為我們是用maven打包,所以需要安裝maven,另外本機安裝了jar私庫,nexus,具體打包需要哪些依賴,maven怎么調用nexus,自己上傳配置就好了。

應用服務器:docker,CentOS 7.7,java:8基礎鏡像。

2.2 jenkins+gitlab操作:

jenkins需要與gitlab作ssh-key認證,應用服務器也需要在jenkins里做一下ssh認證,在jenkins的系統管理-系統設置里,Publish over SSH

然后主要是jenkins創建任務:

創建自由風格的任務-在general中選擇-參數化構建,先填寫選項參數,然后再填加字符參數。

 

 

 

下邊是git地址:

 

下邊選擇Build中的執行shell

 

 

 

case $deploy_type in
    deploy)
        echo "deploy:$deploy_type"
        /usr/local/apache-maven-3.6.1/bin/mvn -s /usr/local/apache-maven-3.6.1/conf/settings.xml clean install -Dmaven.test.skip=true -f salary_wallet/pom.xml -P test
        path="${WORKSPACE}/bak"
           [ -d $path ] || mkdir -p $path
  
        cd ${WORKSPACE}
        rm -rf *.tar.gz
             tar czf bak/${JOB_NAME}-${BUILD_NUMBER}.tar.gz salary_wallet/target/*.jar --exclude=bak
            find $path  -mtime 2 -name "*.tar.gz"  -exec rm -rf {} \;
            echo "Deployment Completed!"
        ;;
    rollback)
        echo  "rollback:$deploy_type"
        echo "buildNum:"$buildNum
        rm -rf target
        cd ${WORKSPACE}
        rm -rf *.tar.gz
        if [ -f bak/${JOB_NAME}-$buildNum.tar.gz ];
        then
            cp bak/${JOB_NAME}-$buildNum.tar.gz ${WORKSPACE}
            tar -zxvf ${JOB_NAME}-$buildNum.tar.gz
            echo  "Rollbacked To build Number:$buildNum"
            pwd && ls
        else
 
            echo  "=========================================================================================="
            echo  "Build Number $buildNum is a Rollback build number ;Please chose a deploy build number!"
            echo  "========================================================================================== "
            cp bak/${JOB_NAME}-$buildNum.tar.gz ${WORKSPACE}
        fi
        ;;
        *)
        exit
            ;;
esac

 

然后到Post-build Actions,選擇Send build artifacts over SSH,在里邊選擇之前創建好的目錄應用服務:

這里需要注意的是Remote directory這是相對於系統設置里創建的ssh連接的目錄,如果寫就是下邊的子目錄。

 

如果是回滾或者頻繁發布未改變代碼的build,每次的鏡像是不會改變的,所以會同時出現多個同IMAGE ID的鏡像,腳本刪不掉原來的,不必擔心,當代碼有改變時構建就會刪除了。

該腳本中APP_HOME下邊的Dockerfile內容,是在應用服務器上,先pull好java:8基礎鏡像,會加快速度,在生產環境建議使用自建倉庫:

cat Dockerfile 

FROM java:8
MAINTAINER hk
#VOLUME
VOLUME /tmp

#拷貝jar包
ADD saXXXXX-0.0.1-SNAPSHOT.jar saXXXXX-0.0.1-SNAPSHOT.jar

#容器啟動命令 也可以用CMD 但CMD會被docker run的指令覆蓋
ENTRYPOINT ["java","-jar","/saXXXXX-0.0.1-SNAPSHOT.jar"]

 

小建議及記錄:

可以看到我的jenkins腳本中限制了docker 的內存及CPU,不然多個docker在同一宿主機,在資源緊張的時候會殺死部分docker進程。我沒有加禁止oom本docker的參數,自己在創建分配docker的時候根據宿主機配置來,不要盲目。

docker run -itd --name $TAG_NAME --cpuset-cpus "0-2" -m 4G --memory-reservation 500M  -p 3780:3780 -v ${APP_HOME}/log:/log ${TAG_NAME}:${TODAY}

 這樣就算配置完成了,jenkins構建按扭就不是原來的立即構建了,點進去會有選項,新發不需要指定參數,直接點就可以,選擇rollback的時候注意選擇回退到哪次buildNum就可以了。

 


免責聲明!

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



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