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就可以了。