并行执行Jenkins Stage时如何获取各阶段独立执行结果
解决Jenkins并行Stage结果被全局构建状态覆盖的问题
核心问题在于currentBuild.result是全局状态,并行Stage中任意一个失败会立刻修改它,导致其他成功Stage的结果被误判。以下是可靠的解决思路和实现:
关键方案
- 利用Jenkins并行块的返回值特性存储每个Stage的独立结果,避免使用全局环境变量或直接依赖
currentBuild.result。 - 使用
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
相关产品推荐
相关产品推荐

