Jenkins脚本try块内多阶段执行失败未标记构建失败求助
问题根因
- 参数传递错误:外层脚本中定义了
MANDATORY_TESTS = true,但调用build_and_test_windows时传入的是MANDATORY_STAGE,如果这个变量未定义或者值为false,会导致get_results_on_failure返回的buildResult为SUCCESS、stageResult为UNSTABLE,测试阶段即使出错也不会标记为失败。 - 缺少构建结果拦截逻辑:你当前两个阶段都加了
catchError,这个方法的作用是捕获阶段异常不中断流水线继续执行,但你没有对构建阶段的执行结果做判断,即使构建失败也会进入测试阶段,不符合常规执行逻辑。 - 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
相关产品推荐
相关产品推荐

