如何中止Jenkins流水线单个stage而不中断后续stage的执行
解决方案
Jenkins默认会在任意stage抛出未捕获异常时(手动中止本质是抛出FlowInterruptedException中断异常)终止整个流水线执行,跳过后续所有stage。你可以通过以下两种方案实现单个stage中止不影响后续stage运行:
方案1:使用catchError步骤(兼容声明式/脚本式流水线,支持精细配置)
在需要支持单独中止的stage内部用catchError包裹执行逻辑,示例配置如下:
pipeline { agent any stages { stage('A') { steps { // 捕获当前stage所有异常,不向上传递 catchError( buildResult: 'SUCCESS', // 配置整个流水线的最终结果,可选值 SUCCESS/UNSTABLE/ABORTED stageResult: 'ABORTED' // 配置当前stage的展示状态 ) { echo 'Started stage A' sleep 20 } } } stage('B') { steps { echo 'Started stage B' // Stage B的正常执行逻辑 } } } }
该方案适配多worker节点的场景,Stage A被手动中止后,异常会被捕获,Stage B会正常调度执行,不会被跳过。
方案2:声明式流水线使用continueOnError选项(配置更简洁)
如果使用声明式流水线,直接给对应stage添加continueOnError(true)配置即可:
pipeline { agent any stages { stage('A') { options { continueOnError(true) } steps { echo 'Started stage A' sleep 20 } } stage('B') { steps { echo 'Started stage B' } } } }
该配置会自动捕获当前stage的所有异常(包括手动中止、运行报错),后续stage正常执行,当前stage标记为失败/中止,整个流水线最终状态为UNSTABLE。
精细控制方案:仅捕获手动中止异常
如果你希望仅处理手动中止的情况,其他代码运行错误仍终止流水线,可以用try-catch专门捕获中断异常:
stage('A') { agent any steps { script { try { echo 'Started stage A' sleep 20 } catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e) { echo "Stage A被手动中止:${e.getMessage()}" // 可添加自定义清理逻辑 currentBuild.result = 'SUCCESS' } } } } stage('B') { steps { echo 'Started stage B' } }
内容的提问来源于stack exchange,提问作者Vihari Lal
相关产品推荐
相关产品推荐

