如何让Jenkins Pipeline在任务失败后不终止继续执行?
解决Jenkins Pipeline构建失败后终止后续任务的问题
你可以通过两种常用方式修改Pipeline,确保某个构建失败后后续任务仍能继续执行:
方法1:给build步骤添加propagate: false参数
这个参数会让Jenkins在构建失败时不抛出异常,而是返回构建结果对象,Pipeline会继续执行后续步骤。你还可以在最后统一检查所有构建结果,决定整个Pipeline的最终状态。
修改后的代码示例:
// 执行第一个构建,失败不终止Pipeline def build1 = build job: 'Dummy_Test', propagate: false, parameters:[ [$class: 'StringParameterValue', name: 'TEST_EVENT_NAME', value: 'integrated test' ], [$class: 'StringParameterValue', name: 'TEST_TEAM', value: 'testing' ], [$class: 'StringParameterValue', name: 'TEST_INDEX', value: '1' ], ] // 执行第二个构建 def build2 = build job: 'Dummy_Test', propagate: false, parameters:[ [$class: 'StringParameterValue', name: 'TEST_EVENT_NAME', value: 'test feature 1' ], [$class: 'StringParameterValue', name: 'TEST_TEAM', value: 'testing' ], [$class: 'StringParameterValue', name: 'TEST_INDEX', value: '2' ], ] // 执行第三个构建 def build3 = build job: 'Dummy_Test', propagate: false, parameters:[ [$class: 'StringParameterValue', name: 'TEST_EVENT_NAME', value: 'feature 1' ], [$class: 'StringParameterValue', name: 'TEST_TEAM', value: 'dev' ], [$class: 'StringParameterValue', name: 'TEST_INDEX', value: '1' ], ] // 执行第四个构建 def build4 = build job: 'Dummy_Test', propagate: false, parameters:[ [$class: 'StringParameterValue', name: 'TEST_EVENT_NAME', value: 'fix bug' ], [$class: 'StringParameterValue', name: 'TEST_TEAM', value: 'dev' ], [$class: 'StringParameterValue', name: 'TEST_INDEX', value: '2' ], ] // 可选:最后检查所有构建结果,若有失败则标记Pipeline为失败 def failedBuilds = [build1, build2, build3, build4].findAll { !it.resultIsBetterOrEqualTo('SUCCESS') } if (failedBuilds) { error "以下构建任务失败:${failedBuilds.collect { it.fullDisplayName }.join(', ')}" }
方法2:用catchError包裹每个build步骤
catchError会捕获构建失败的异常,同时可以设置当前Stage和整个Pipeline的结果状态,后续任务不受影响继续执行。
示例代码:
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { build job: 'Dummy_Test', parameters:[ [$class: 'StringParameterValue', name: 'TEST_EVENT_NAME', value: 'integrated test' ], [$class: 'StringParameterValue', name: 'TEST_TEAM', value: 'testing' ], [$class: 'StringParameterValue', name: 'TEST_INDEX', value: '1' ], ] } catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { build job: 'Dummy_Test', parameters:[ [$class: 'StringParameterValue', name: 'TEST_EVENT_NAME', value: 'test feature 1' ], [$class: 'StringParameterValue', name: 'TEST_TEAM', value: 'testing' ], [$class: 'StringParameterValue', name: 'TEST_INDEX', value: '2' ], ] } catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { build job: 'Dummy_Test', parameters:[ [$class: 'StringParameterValue', name: 'TEST_EVENT_NAME', value: 'feature 1' ], [$class: 'StringParameterValue', name: 'TEST_TEAM', value: 'dev' ], [$class: 'StringParameterValue', name: 'TEST_INDEX', value: '1' ], ] } catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { build job: 'Dummy_Test', parameters:[ [$class: 'StringParameterValue', name: 'TEST_EVENT_NAME', value: 'fix bug' ], [$class: 'StringParameterValue', name: 'TEST_TEAM', value: 'dev' ], [$class: 'StringParameterValue', name: 'TEST_INDEX', value: '2' ], ] }
优化方案:用循环简化重复代码
如果有大量重复的构建任务,建议把参数整理成列表,通过循环执行,减少冗余代码:
// 定义所有构建的参数集合 def buildTasks = [ [event: 'integrated test', team: 'testing', index: '1'], [event: 'test feature 1', team: 'testing', index: '2'], [event: 'feature 1', team: 'dev', index: '1'], [event: 'fix bug', team: 'dev', index: '2'] ] def failedTasks = [] // 循环执行每个构建任务 buildTasks.each { task -> def result = build job: 'Dummy_Test', propagate: false, parameters: [ [$class: 'StringParameterValue', name: 'TEST_EVENT_NAME', value: task.event], [$class: 'StringParameterValue', name: 'TEST_TEAM', value: task.team], [$class: 'StringParameterValue', name: 'TEST_INDEX', value: task.index] ] // 记录失败的构建任务 if (!result.resultIsBetterOrEqualTo('SUCCESS')) { failedTasks.add(result.fullDisplayName) } } // 最后统一处理失败情况 if (failedTasks) { error "失败的构建任务:${failedTasks.join(', ')}" }
内容的提问来源于stack exchange,提问作者Teddy C
相关产品推荐
相关产品推荐

