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

Jenkins脚本try块内多阶段执行失败未标记构建失败求助

问题根因

  1. 参数传递错误:外层脚本中定义了MANDATORY_TESTS = true,但调用build_and_test_windows时传入的是MANDATORY_STAGE,如果这个变量未定义或者值为false,会导致get_results_on_failure返回的buildResult为SUCCESS、stageResult为UNSTABLE,测试阶段即使出错也不会标记为失败。
  2. 缺少构建结果拦截逻辑:你当前两个阶段都加了catchError,这个方法的作用是捕获阶段异常不中断流水线继续执行,但你没有对构建阶段的执行结果做判断,即使构建失败也会进入测试阶段,不符合常规执行逻辑。
  3. bat返回值捕获异常:部分Windows环境下bat脚本的退出码不会自动被Jenkins捕获,需要显式判断%ERRORLEVEL%返回值才能保证错误被正常识别。

修复方案

第一步:修正参数传递

外层调用时传入正确的控制变量:

'Windows' : {
  // 替换原来的MANDATORY_STAGE为正确的控制变量
  pipeline_utils.build_and_test_windows(MANDATORY_TESTS)
}

第二步:调整阶段逻辑,增加结果判断

修改PipelineUtils.groovy中的build_windows方法,构建阶段执行失败后直接跳过测试阶段,同时保证两个阶段错误都能正确标记:

def build_windows(run_tests, fail_build_on_test) {
    String buildResult
    String stageResult
    (buildResult, stageResult) = get_results_on_failure(fail_build_on_test)
    node("windows"){
        setupWorkspace()
        Boolean buildSuccess = true
        try{
            stage('Windows Build') {
                catchError(buildResult: buildResult, stageResult: stageResult) {
                    timeout(time: 60, unit: 'MINUTES') {
                        // 显式捕获bat退出码,避免Windows环境返回值丢失
                        bat """
                            "${JENKINS_TOOLS_DIR}/platform-specific/windows/windows.bat"
                            exit %ERRORLEVEL%
                        """
                    }
                }
                // 判断构建阶段执行结果
                if (currentBuild.currentResult == "FAILURE" || currentBuild.currentResult == "UNSTABLE") {
                    buildSuccess = false
                }
            }
            if (run_tests && buildSuccess) {
                stage('Windows Unit Tests') {
                    catchError(buildResult: buildResult, stageResult: stageResult) {
                        timeout(time: 60, unit: 'MINUTES') {
                            bat """
                                "${JENKINS_TOOLS_DIR}/platform-specific/windows/windows.bat" TRUE
                                exit %ERRORLEVEL%
                            """
                        }
                    }
                }
            } 
        }finally{
            cleanWorkspace()
        }
    }
}

第三步:添加调试日志(可选,方便排查问题)

可以在get_results_on_failure方法中添加日志打印,确认参数传递是否正确:

def get_results_on_failure(failBuildOnFailure) {
    println "传入的failBuildOnFailure值为:${failBuildOnFailure}"
    String buildResult = failBuildOnFailure ? "FAILURE" : "SUCCESS"
    String stageResult = failBuildOnFailure ? "FAILURE" : "UNSTABLE"
    println "计算得到buildResult=${buildResult}, stageResult=${stageResult}"
    return [buildResult, stageResult]
}

验证逻辑

修改后执行流水线:

  • 构建阶段出错时,会直接标记阶段和对应构建结果为失败,跳过测试阶段
  • 构建成功、测试阶段出错时,会按照传入的fail_build_on_test参数标记对应结果:参数为true则标记阶段和构建为失败,参数为false则标记阶段为不稳定、构建为成功

内容的提问来源于stack exchange,提问作者bourne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:54:01