如何在Jenkins声明式流水线邮件正文中展示Groovy Map内容?
解决方案
要在成功后置阶段的邮件正文中包含results Map的内容,你可以按以下步骤修改流水线:
将Map内容格式化为字符串并存入环境变量
在打印results的代码之后,把Map的内容转换成易读的字符串,并存入Jenkins环境变量,让后置阶段能够访问:// 格式化results为多行字符串 def resultsStr = results.collect { key, value -> "file = ${key}, exit code = ${value}" }.join('\n') // 存入环境变量 env.RESULTS = resultsStr修改邮件正文,整合结果内容
在emailext的body参数中,将默认内容和环境变量里的结果字符串结合:emailext ( subject: "${env.JOB_NAME}: Build #${env.BUILD_NUMBER} - Successful!", body: """${DEFAULT_CONTENT} ### 各并行阶段执行结果: ${env.RESULTS}""", recipientProviders: [buildUser()] )完整修改后的流水线代码
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遍历resultsMap,将每个键值对转换成指定格式的字符串,再通过join('\n')拼接成多行文本,保证邮件内的结果排版清晰。 - 将格式化后的字符串存入
env.RESULTS环境变量,是因为声明式流水线的post阶段无法直接访问流水线块外定义的普通Groovy变量,而环境变量可在整个流水线生命周期内访问。
内容的提问来源于stack exchange,提问作者DavidA
相关产品推荐
相关产品推荐

