Jenkins某stage重试全部失败后如何不跳过后续阶段继续执行pipeline
解决方案
- Jenkins Pipeline 默认只要存在未捕获的异常就会中止整个流水线,你需要在
retry块的最外层捕获所有重试结束后抛出的最终异常,不向外抛出即可让后续Stage正常执行。 - 你可以自主选择是否将当前Stage标记为失败/不稳定状态,不影响后续Stage的执行逻辑。
修改后代码示例(推荐用catchError实现)
stage('Run Test') { // 外层catchError自动捕获块内所有异常,不会向外抛出导致流水线中止 catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { try { echo "Hello World" } catch(error) { retry(5) { try { input "Retry?" echo "Hello World in catch" } catch(err) { // 单次重试失败抛出异常,触发retry的下一次重试逻辑 throw err } } } } }
参数说明
你可以根据需求调整catchError的参数:
- 如果你希望整个Pipeline最终状态不受该Stage失败影响,可设置
buildResult: 'SUCCESS' - 如果你希望仅标记当前Stage为失败、不改变Pipeline整体状态,可设置
buildResult: null, stageResult: 'FAILURE'
如果不用内置的catchError,也可以手动嵌套try-catch实现,逻辑完全一致:
stage('Run Test') { try { try { echo "Hello World" } catch(error) { retry(5) { try { input "Retry?" echo "Hello World in catch" } catch(err) { throw err } } } } catch (finalException) { echo "Run Test Stage 重试5次后仍失败,错误信息:${finalException.getMessage()}" // 可选:标记当前Stage为失败 org.jenkinsci.plugins.workflow.cps.steps.StageStep.Result stateResult = org.jenkinsci.plugins.workflow.cps.steps.StageStep.Result.FAILURE // 可选:修改整个Pipeline的最终状态,不需要就注释掉本行 currentBuild.result = 'FAILURE' } }
内容的提问来源于stack exchange,提问作者Ashik
相关产品推荐
相关产品推荐

