Jenkins pipeline JENKINS_NODE_COOKIE踩坑记录
生活随笔
收集整理的這篇文章主要介紹了
Jenkins pipeline JENKINS_NODE_COOKIE踩坑记录
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在普通的shell環(huán)境中,nohup,并且& 某個程序后,會拋到后臺執(zhí)行,在退出當(dāng)前shell環(huán)境后,程序依然可以執(zhí)行。但是在Jenkins的pipeline中,通過nohup,且使用&之后,step結(jié)束后,執(zhí)行的程序還是會退出,導(dǎo)致程序起不來。
1)export JENKINS_NODE_COOKIE=dontKillMe很重要,pipeline在退出node{}的時候,會默認(rèn)清理自己發(fā)出的每個shell命令,即使使用了nohup。
2)后臺執(zhí)行java程序,一定要加上{-Dhudson.util.ProcessTree.disable=true}這個參數(shù),否則pipeline執(zhí)行完成后,java也就自動退出了。?
整個腳本文件我也放出來吧
#!/bin/bash set -e# 基礎(chǔ) # export JAVA_HOME=/work/programs/jdk/jdk1.8.0_181 # export PATH=PATH=$PATH:$JAVA_HOME/bin # export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarDATE=$(date +%Y%m%d%H%M) # 基礎(chǔ)路徑 BASE_PATH=/datadrive/mego/food # 編譯后 jar 的地址。部署時,Jenkins 會上傳 jar 包到該目錄下 SOURCE_PATH=/var/lib/jenkins/workspace/food_safety_platform/mego_service/target # 服務(wù)名稱。同時約定部署服務(wù)的 jar 包名字也為它。 SERVER_NAME=mego_service-0.0.1-SNAPSHOT # 環(huán)境 PROFILES_ACTIVE=prod # 健康檢查 URL # HEALTH_CHECK_URL=http://127.0.0.1:8078/actuator/health/# heapError 存放路徑 HEAP_ERROR_PATH=$BASE_PATH/heapError # JVM 參數(shù) JAVA_OPS="-Xms1024m -Xmx1024m" # JavaAgent 參數(shù)。可用于配置 SkyWalking 等鏈路追蹤 # JAVA_AGENT=# 備份 function backup() {# 如果不存在,則無需備份if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; thenecho "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳過備份"# 如果存在,則備份到 backup 目錄下,使用時間作為后綴elseecho "[backup] 開始備份 $SERVER_NAME ..."# cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jartar cvf /datadrive/mego/$SERVER_NAME-$DATE.tar /datadrive/mego/foodecho "[backup] 備份 $SERVER_NAME 完成"fi }# 最新構(gòu)建代碼 移動到項目環(huán)境 function transfer() {echo "[transfer] 開始轉(zhuǎn)移 $SERVER_NAME.jar"# 刪除原 jar 包if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; thenecho "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳過刪除"elseecho "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成"rm $BASE_PATH/$SERVER_NAME.jarrm -rf $BASE_PATH/libfi# 復(fù)制新 jar 包echo "[transfer] 從 $SOURCE_PATH 中獲取 $SERVER_NAME.jar 并遷移至 $BASE_PATH ...."cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATHcp -r $SOURCE_PATH/lib $BASE_PATHecho "[transfer] 轉(zhuǎn)移 $SERVER_NAME.jar 完成" }# 停止 function stop() {echo "[stop] 開始停止 $BASE_PATH/$SERVER_NAME"PID=$(ps -ef | grep $SERVER_NAME.jar | grep -v "grep" | awk '{print $2}')# 如果 Java 服務(wù)啟動中,則進行關(guān)閉echo "是否有PID: [$PID]"if [ -n "$PID" ]; then# 正常關(guān)閉echo "[stop] $SERVER_NAME.jar 運行中,開始 kill [$PID]"kill -15 $PID# 等待最大 60 秒,直到關(guān)閉完成。for ((i = 0; i < 60; i++))dosleep 1PID=$(ps -ef | grep $SERVER_NAME.jar | grep -v "grep" | awk '{print $2}')if [ -n "$PID" ]; thenecho -e ".\c"elseecho '[stop] 停止 $BASE_PATH/$SERVER_NAME.jar 成功'breakfidone# 如果正常關(guān)閉失敗,那么進行強制 kill -9 進行關(guān)閉if [ -n "$PID" ]; thenecho "[stop] $BASE_PATH/$SERVER_NAME.jar 失敗,強制 kill -9 $PID"kill -9 $PIDfi# 如果 Java 服務(wù)未啟動,則無需關(guān)閉elseecho "[stop] $BASE_PATH/$SERVER_NAME.jar 未啟動,無需停止"fi }# 啟動 function start() {# 開啟啟動前,打印啟動參數(shù)echo "[start] 開始啟動 $BASE_PATH/$SERVER_NAME.jar"echo "[start] JAVA_OPS: $JAVA_OPS"# echo "[start] JAVA_AGENT: $JAVA_AGENT"# echo "[start] PROFILES: $PROFILES_ACTIVE"# 開始啟動# BUILD_ID=dontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE &# BUILD_ID=dontKillMe nohup java -server $JAVA_OPS -jar $BASE_PATH/$SERVER_NAME.jar >/dev/null 2>log &source /etc/profileexport JENKINS_NODE_COOKIE=dontKillMecd $BASE_PATHnohup java -Dhudson.util.ProcessTree.disable=true -jar $SERVER_NAME.jar >/dev/null 2>log &echo "[start] 啟動 $BASE_PATH/$SERVER_NAME.jar 完成 [$JENKINS_NODE_COOKIE]" }# 健康檢查 function healthCheck() {# 如果配置健康檢查,則進行健康檢查if [ -n "$HEALTH_CHECK_URL" ]; then# 健康檢查最大 60 秒,直到健康檢查通過echo "[healthCheck] 開始通過 $HEALTH_CHECK_URL 地址,進行健康檢查";for ((i = 0; i < 60; i++))do# 請求健康檢查地址,只獲取狀態(tài)碼。result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"`# 如果狀態(tài)碼為 200,則說明健康檢查通過if [ "$result" == "200" ]; thenecho "[healthCheck] 健康檢查通過";break# 如果狀態(tài)碼非 200,則說明未通過。sleep 1 秒后,繼續(xù)重試elseecho -e ".\c"sleep 1fidone# 健康檢查未通過,則異常退出 shell 腳本,不繼續(xù)部署。if [ ! "$result" == "200" ]; thenecho "[healthCheck] 健康檢查不通過,可能部署失敗。查看日志,自行判斷是否啟動成功";tail -n 10 nohup.outexit 1;# 健康檢查通過,打印最后 10 行日志,可能部署的人想看下日志。elsetail -n 10 nohup.outfi# 如果未配置健康檢查,則 slepp 60 秒,人工看日志是否部署成功。elseecho "[healthCheck] HEALTH_CHECK_URL 未配置,開始 sleep 60 秒";sleep 60echo "[healthCheck] sleep 60 秒完成,查看日志,自行判斷是否啟動成功";tail -n 50 nohup.outfi }# 部署 function deploy() {cd $BASE_PATH# 備份原 jarbackup# 停止 Java 服務(wù)stop# 部署新 jartransfer# 啟動 Java 服務(wù)start# 健康檢查# healthCheck }deploy微信掃一掃:關(guān)注我個人訂閱號“猿小飛”,更多精彩文章在這里及時發(fā)布:?
?
總結(jié)
以上是生活随笔為你收集整理的Jenkins pipeline JENKINS_NODE_COOKIE踩坑记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Centos7.5源码编译安装nodej
- 下一篇: Git工具 - 子模块