如何让Jenkins Pipeline阶段在数据库导出完成后提前退出
解决Jenkins Pipeline阶段无法退出的问题
问题核心是nohup启动的keep-alive进程没有彻底脱离SSH会话,导致SSH命令一直等待后台进程结束,进而阻塞Pipeline阶段无法进入post步骤。以下是具体修改方案:
修改要点
- 彻底脱离SSH会话:给
nohup命令添加标准输入、输出、错误的重定向,让进程完全独立于当前SSH会话,避免SSH等待其结束。 - 优化远程命令格式:简化SSH的引号嵌套,避免语法错误导致的意外阻塞。
修改后的Pipeline代码
pipeline { agent any parameters { string (name: 'MACHINE_INSTANCE_ID', defaultValue: '', description: 'AWS EC2 Instance ID ', trim: true) string (name: 'MACHINE_IP', defaultValue: '', description: 'AWS EC2 IP ', trim: true) string (name: 'CB_HOST', description: 'host to backup e.g. "http://somehost.com" ', trim: true) } stages{ stage('Start AWS EC2 Instance') { steps { sh label: 'Start AWS EC2 Instance', returnStatus: false, script: '''#!/bin/sh aws ec2 start-instances --instance-ids ${MACHINE_INSTANCE_ID} aws ec2 wait instance-running --instance-ids ${MACHINE_INSTANCE_ID} aws ec2 wait instance-status-ok --instance-ids ${MACHINE_INSTANCE_ID} echo "EC2 Instance ${MACHINE_INSTANCE_ID} successfully started!!" ''' } } stage('Perform Backup') { steps { script { sh label: 'Perform Backup', returnStatus: false, script: '''#!/bin/sh ssh -o StrictHostKeyChecking=no -i /var/lib/jenkins/pem ec2-user@${MACHINE_IP} " cd /home/ubuntu/keep-alive echo 'starting keep alive service..' # 重定向所有输出到/dev/null,彻底脱离SSH会话 sudo nohup java -jar keep-alive-1.0-SNAPSHOT.jar --places.dbHost=${CB_HOST} > /dev/null 2>&1 & sleep 5 cd /home/ubuntu echo '-- Running backup for ${CB_HOST} env' sudo python3 export_new.py -cl ${CB_HOST} " ''' } } } } post { always { emailext attachLog: false, mimeType: 'text/plain', subject: "export build ", body: "Job completed..\nSee logs for more info:\n${env.BUILD_URL}/console", to: 'abc.ec@xyz.com' sh label: 'Stop AWS EC2 Instance', script: '''#!/bin/sh aws ec2 stop-instances --instance-ids ${MACHINE_INSTANCE_ID} aws ec2 wait instance-stopped --instance-ids ${MACHINE_INSTANCE_ID} echo "EC2 Instance ${MACHINE_INSTANCE_ID} successfully stopped!!" ''' } } }
额外说明
- 重定向
> /dev/null 2>&1将标准输出和错误输出全部丢弃,同时&让进程后台运行,两者结合可以让nohup进程完全脱离当前SSH会话,SSH命令会在导出脚本执行完成后立即退出。 - 由于后续post步骤会停止EC2实例,keep-alive进程会随实例停止而终止,无需额外手动杀死。如果需要在导出完成后立即终止该进程,可以在
python3 export_new.py命令后添加:sudo pkill -f "keep-alive-1.0-SNAPSHOT.jar"
内容的提问来源于stack exchange,提问作者deewreck
相关产品推荐
相关产品推荐

