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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:15:54