Jenkins Emailext插件Groovy邮件模板如何获取流水线自定义环境变量
Email Ext插件Groovy模板获取流水线环境变量方案
问题背景
编辑Jenkins Email Extension插件的Groovy邮件模板时,需要在通知邮件中展示流水线内定义的自定义环境变量,测试使用的流水线代码如下:
pipeline { agent { label 'main' } environment { test = "This is a test line." } stages { stage('Debug') { steps { sh 'printenv' sh "echo ${env.test}" bat 'echo %test%' } } } post { always { echo "Emailing.." emailext body: '''${SCRIPT, template="groovy-html-edited.template"}''', subject: currentBuild.currentResult + " : " + env.JOB_NAME, to: 'example@email.com' } } }
在自定义模板groovy-html-edited.template中尝试以下写法均无法获取变量值:
${env.test}${ENV.test}${ENV,var="test"}${env,var="test"}
模板中添加的测试代码段如下:
<!-- TEST SECTION--> <table class="section"> <tr class="tr-title"> <td class="td-title-main" colspan=2> TEST SECTION </td> </tr> <tr> <td>${ENV,var='test'}</td> </tr> </table> <br/>
正确实现方式
Groovy邮件模板运行在独立的脚本上下文,和流水线脚本上下文不直接互通,${ENV,var="xxx"}是Email Ext插件非模板模式下的内容替换令牌,仅在直接写入emailext正文、不调用Groovy模板时生效,无法在Groovy模板中解析。
需要通过模板上下文内置的build对象获取全量环境变量后再取值,替换模板中变量输出部分的代码即可:
<!-- TEST SECTION--> <table class="section"> <tr class="tr-title"> <td class="td-title-main" colspan=2> TEST SECTION </td> </tr> <tr> <td> <% // 获取当前构建的全量环境变量 def envVars = build.getEnvironment(listener) // 输出test变量值,不存在时返回默认提示 out.println envVars.getOrDefault("test", "变量test不存在") %> </td> </tr> </table> <br/>
补充说明
- 该方法可以获取所有流水线中定义的自定义环境变量,也可以获取
JOB_NAME、BUILD_NUMBER、BUILD_RESULT等Jenkins内置环境变量 - 模板上下文默认内置
build(当前构建对象)、listener(构建监听器对象)、out(模板输出流对象),可直接调用 - 如果使用三单引号包裹emailext的body参数,Groovy模板不会在流水线执行阶段提前做变量替换,所有变量取值逻辑都需要在模板内部实现
内容的提问来源于stack exchange,提问作者Tan Wei Li
相关产品推荐
相关产品推荐

