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

如何在Jenkins声明式流水线邮件正文中展示Groovy Map内容?

解决方案

要在成功后置阶段的邮件正文中包含results Map的内容,你可以按以下步骤修改流水线:

  1. 将Map内容格式化为字符串并存入环境变量
    在打印results的代码之后,把Map的内容转换成易读的字符串,并存入Jenkins环境变量,让后置阶段能够访问:

    // 格式化results为多行字符串
    def resultsStr = results.collect { key, value -> "file = ${key}, exit code = ${value}" }.join('\n')
    // 存入环境变量
    env.RESULTS = resultsStr
    
  2. 修改邮件正文,整合结果内容
    在emailext的body参数中,将默认内容和环境变量里的结果字符串结合:

    emailext (
        subject: "${env.JOB_NAME}: Build #${env.BUILD_NUMBER} - Successful!",
        body: """${DEFAULT_CONTENT}
        
        ### 各并行阶段执行结果:
        ${env.RESULTS}""",
        recipientProviders: [buildUser()]
    )
    
  3. 完整修改后的流水线代码

    def p = [:]         // map for parallel stages
    def results = [:]   // map of exit code for each stage
    
    pipeline {
    
        stages {
            stage('run') {
                steps {
                    script {
                        for (file in files_list) {
                            p[file] = {
                                node(myagent) {
                                    results[file] = sh returnStatus: true, script: "./myApp ${file}"
                                }
                            }
                        }
    
                        parallel p
    
                        // Print the results
                        for (def key in results.keySet()) {
                            println "file = ${key}, exit code = ${results[key]}"
                        }
    
                        // 格式化结果并存入环境变量
                        def resultsStr = results.collect { key, value -> "file = ${key}, exit code = ${value}" }.join('\n')
                        env.RESULTS = resultsStr
                    }
                }
            }  
        }
    
        post {
            success {
                script { 
                    emailext (
                        subject: "${env.JOB_NAME}: Build #${env.BUILD_NUMBER} - Successful!",
                        body: """${DEFAULT_CONTENT}
                        
                        ### 各并行阶段执行结果:
                        ${env.RESULTS}""",
                        recipientProviders: [buildUser()]
                    )
                }
            }
        }
    }
    

说明

  • 用collect遍历results Map,将每个键值对转换成指定格式的字符串,再通过join('\n')拼接成多行文本,保证邮件内的结果排版清晰。
  • 将格式化后的字符串存入env.RESULTS环境变量,是因为声明式流水线的post阶段无法直接访问流水线块外定义的普通Groovy变量,而环境变量可在整个流水线生命周期内访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 09:25:20