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

并行执行Jenkins Stage时如何获取各阶段独立执行结果

解决Jenkins并行Stage结果被全局构建状态覆盖的问题

核心问题在于currentBuild.result是全局状态,并行Stage中任意一个失败会立刻修改它,导致其他成功Stage的结果被误判。以下是可靠的解决思路和实现:

关键方案

  1. 利用Jenkins并行块的返回值特性存储每个Stage的独立结果,避免使用全局环境变量或直接依赖currentBuild.result。
  2. 使用catchError时设置buildResult: null,禁止单个Stage失败直接修改全局构建状态,等所有并行Stage执行完毕后统一判断整体结果。

完整流水线示例

def stageResults = [:]

pipeline {
    agent any
    stages {
        stage('Parallel Stage Execution') {
            steps {
                script {
                    // 并行执行各Stage,返回值存入stageResults Map
                    stageResults = parallel(
                        'Stage A': {
                            catchError(buildResult: null, stageResult: 'FAILURE') {
                                // 替换为Stage A的实际执行逻辑
                                echo 'Running Stage A...'
                                // 模拟成功:注释下方error语句;模拟失败:取消注释
                                // error('Stage A execution failed')
                                return 'SUCCESS'
                            }
                        },
                        'Stage B': {
                            catchError(buildResult: null, stageResult: 'FAILURE') {
                                echo 'Running Stage B...'
                                return 'SUCCESS'
                            }
                        },
                        'Stage C': {
                            catchError(buildResult: null, stageResult: 'FAILURE') {
                                echo 'Running Stage C...'
                                error('Stage C execution failed') // 模拟失败
                                return 'SUCCESS'
                            }
                        }
                    )
                }
            }
        }
        stage('Aggregate Results') {
            steps {
                script {
                    // 统一设置全局构建结果
                    def hasFailures = stageResults.values().any { it == 'FAILURE' }
                    currentBuild.result = hasFailures ? 'FAILURE' : 'SUCCESS'

                    // 将结果转为JSON格式,方便传入邮件模板
                    env.STAGE_RESULTS = groovy.json.JsonOutput.toJson(stageResults)
                }
            }
        }
        stage('Send Summary Email') {
            steps {
                script {
                    // 解析结果并生成HTML邮件内容
                    def parsedResults = groovy.json.JsonSlurper().parseText(env.STAGE_RESULTS)
                    def emailBody = """
                    <html>
                        <body>
                            <h3>Build ${currentBuild.result}: ${env.JOB_NAME} #${env.BUILD_NUMBER}</h3>
                            <h4>Stage Execution Details:</h4>
                            <ul>
                                ${parsedResults.collect { "<li><strong>${it.key}</strong>: ${it.value}</li>" }.join('')}
                            </ul>
                        </body>
                    </html>
                    """

                    // 使用emailext插件发送邮件(需提前安装配置)
                    emailext(
                        subject: "[Jenkins] Build ${currentBuild.result}: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
                        body: emailBody,
                        to: 'your-recipient@domain.com'
                    )
                }
            }
        }
    }
}

方案解释

  • 并行块返回值:parallel方法执行后会返回一个Map,键是Stage名称,值是对应分支的返回结果,完全隔离了各Stage的状态,不存在竞态问题。
  • catchError参数控制:buildResult: null让单个Stage的失败仅标记自身Stage状态为FAILURE,不会立即修改全局currentBuild.result,直到我们在汇总阶段统一处理。
  • 结果汇总与邮件展示:将结果转为JSON后传入环境变量,在邮件阶段解析生成HTML,能精准展示每个Stage的独立执行结果。

扩展优化

如果需要捕获更详细的失败信息(比如异常栈、错误日志),可以让每个Stage返回包含结果和详情的Map:

return [status: 'FAILURE', errorMsg: '具体错误原因']

在邮件模板中就可以展示更丰富的内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:30:29