如何让Jenkins在阶段失败后不跳过task2、task3后续阶段?
解决Jenkins Pipeline阶段失败后继续执行后续阶段的方案
针对你的场景,有两种核心方案可以实现「run SQL阶段失败后仍执行后续task2、task3阶段」的需求,具体如下:
方案1:在Jenkins Pipeline中捕获/忽略阶段错误
通过Pipeline内置的错误处理机制,让Jenkins不因为该阶段的失败而终止整个流水线。
方式1:使用catchError(推荐,保留阶段失败状态)
用catchError包裹执行Ansible的步骤,既会标记当前阶段为失败,又不会影响后续阶段执行,还可按需控制整体构建结果:
pipeline { agent any stages { stage('run SQL') { steps { catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') { // 执行Ansible playbook的命令 sh 'ansible-playbook -i google/ansible/ansible-root/hosts run-query.yml' } } } stage('task2') { steps { echo '执行task2的逻辑' } } stage('task3') { steps { echo '执行task3的逻辑' } } } }
- 参数说明:
stageResult: 'FAILURE':将当前run SQL阶段标记为失败,便于在Jenkins界面查看问题buildResult: 'SUCCESS':保持整个流水线的最终状态为成功(如果不需要可以移除,让构建结果随阶段失败变为失败,但后续阶段仍会执行)
方式2:使用returnStatus让步骤不抛出错误
让sh步骤返回命令的退出码而非抛出错误,这样阶段会被标记为成功,但你可以根据退出码做额外处理:
stage('run SQL') { steps { script { def exitCode = sh returnStatus: true, script: 'ansible-playbook -i google/ansible/ansible-root/hosts run-query.yml' // 可选:根据退出码打印日志或做其他处理 if (exitCode != 0) { echo "run SQL阶段执行完成,但存在不可达主机" } } } }
方案2:修改Ansible Playbook从源头避免失败
直接在Ansible playbook中配置忽略不可达主机,让playbook本身不会因为部分主机关机而返回失败状态,这样Jenkins的run SQL阶段会正常完成,后续阶段自然继续执行。
在你的run-query.yml的play级别添加ignore_unreachable: true:
- name: 执行SQL查询任务 hosts: all # 对应你hosts文件中的主机组 ignore_unreachable: true # 关键配置:忽略不可达主机 tasks: - name: 运行SQL命令 # 这里是你的具体任务逻辑,比如执行sql脚本等
这个配置会让Ansible跳过所有不可达的主机,仅在可达主机上执行任务,并且整个playbook的退出码为0,不会触发Jenkins的阶段失败。
方案选择建议
- 如果需要在Jenkins中明确标记
run SQL阶段为失败(便于排查),优先选方案1的catchError方式 - 如果认为部分主机关机是完全正常的情况,不需要标记阶段失败,优先选方案2,从源头解决问题
内容的提问来源于stack exchange,提问作者Philip Shangguan
相关产品推荐
相关产品推荐

