You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:45:03