Jenkins 如何在流水线提前终止时将所有阶段标记为中止而非失败?
Jenkins流水线提前终止标记为ABORTED而非FAILED的解决方案
问题原因
你预先设置currentBuild.result = 'ABORTED'的逻辑本身没问题,但后续调用的error()方法本质是抛出流程异常,会强制覆盖构建结果为FAILED,同时终止流水线运行,因此你的前置设置会被覆盖失效。
解决方案1:抛出指定结果的中断异常(推荐)
直接抛出Jenkins内置的流程中断异常,显式指定中止结果,无需额外修改后续阶段配置,会自动终止所有后续阶段,全链路标记为ABORTED状态:
import org.jenkinsci.plugins.workflow.steps.FlowInterruptedException import hudson.model.Result stages { stage('Stage 1'){ steps{ script { RESULT_LOG = sh(returnStdout: true, script: 'git log -1 --pretty=%B') if (!RESULT_LOG.contains("[ci build]")) { echo "Commit message is: ${RESULT_LOG}" currentBuild.result = 'ABORTED' // 抛出指定结果为ABORTED的中断异常 throw new FlowInterruptedException(Result.ABORTED, null) } } } } stage('Stage 2'){ steps{ // 原有逻辑无需修改,触发中止时该阶段不会运行,自动标记为中止状态 } } }
解决方案2:使用catchError包裹错误逻辑(无需导包)
如果你的Jenkins环境不允许导入自定义类,可以用内置的catchError步骤指定构建和阶段结果,同时给后续阶段添加运行前置判断即可:
stages { stage('Stage 1'){ steps{ script { RESULT_LOG = sh(returnStdout: true, script: 'git log -1 --pretty=%B') if (!RESULT_LOG.contains("[ci build]")) { echo "Commit message is: ${RESULT_LOG}" // 捕获error抛出的异常,强制指定当前阶段和整体构建结果为ABORTED catchError(buildResult: 'ABORTED', stageResult: 'ABORTED') { error('Stopping early…') } } } } } stage('Stage 2'){ // 新增判断:仅当前构建状态为成功时才运行该阶段 when { expression { currentBuild.currentResult == 'SUCCESS' } } steps{ // 原有逻辑 } } // 所有后续阶段都需要加上上述相同的when判断条件 }
注意事项
- 第一种方案需要你的Jenkins流水线有对应类的导入权限,绝大部分公开和私有Jenkins实例默认都开放该权限
- 第二种方案如果后续阶段较多,可以把when判断提取为流水线全局公共条件,减少重复代码
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

