【问题标题】:Access variable in email ext template using Jenkins pipeline使用 Jenkins 管道访问电子邮件分机模板中的变量
【发布时间】:2018-09-27 19:43:38
【问题描述】:

我正在尝试使用 Jenkins 管道 emailext 附加模板文件。 变量 (PROJNAME) 无法在模板文件中访问,我收到异常电子邮件:

在模板呈现期间引发异常:没有这样的属性:类的环境:SimpleTemplateScript21 groovy.lang.MissingPropertyException:没有这样的属性:类的环境:org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:SimpleTemplateScript21: 53)在 org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:52) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:307) 在 SimpleTemplateScript21.run(SimpleTemplateScript21 .groovy:1) 在 groovy.text.SimpleTemplateEngine$SimpleTemplate$1.writeTo(SimpleTemplateEngine.java:168) 在 groovy.text.SimpleTemplateEngine$SimpleTemplate$1.toString(SimpleTemplateEngine.java:180) 在 hudson.plugins.emailext.plugins。 content.ScriptContent.renderTemplate(ScriptContent.java:151) at hudson.plugins.emailext.plugins.content.ScriptContent.evaluate(ScriptContent.java:82) at org.jenkinsci.plugins.tokenmacro.DataBoundTokenMacro.evaluate(D ataBoundTokenMacro.java:208) 在 org.jenkinsci.plugins.tokenmacro.Parser.processToken(Parser.java:308) 在 org.jenkinsci.plugins.tokenmacro.Action$KiHW1UeqOdqAwZul.run(Unknown Source) 在 org.parboiled.matchers。 ActionMatcher.match(ActionMatcher.java:96) at org.parboiled.parserunners.BasicParseRunner.match(BasicParseRunner.java:77) at org.parboiled.MatcherContext.runMatcher(MatcherContext.java:351)

管道脚本:

stage('Email') {
    def mailRecipients = "myemail@abc.com"
    def jobStatus = currentBuild.currentResult
    env.PROJNAME = 'project_name'
    echo "projname is ${PROJNAME}"
emailext body: '''${SCRIPT, template="test.template"}''',
    mimeType: 'text/html',
    subject: "[Jenkins] ${jobStatus}",
    to: "${mailRecipients}"
}

模板(文件名 - test.template):

<html>
<head>
<title>Page Title</title>
</head>
<body>
<h1>This is a Heading</h1>
<p>Job is '${env.PROJNAME}'</p>
</body>
</html>

还尝试将模板文件中的变量语法替换为“${PROJNAME}”和“${ENV, var="PROJNAME"}”,但没有成功。有什么建议吗?

当我在模板文件中替换为 ENV(var="PROJNAME") 时没有帮助。我收到的电子邮件是:

这是一个标题

工作是 ENV(var="PROJNAME")

【问题讨论】:

  • 您是否简单地尝试使用:

    Job is ${env.PROJNAME}

    ?没有单引号?
  • 是的,我收到了与电子邮件相同的异常。
  • 我也有同样的问题。你找到解决办法了吗?
  • Pakeer 提供的解决方案对我有用

标签: jenkins jenkins-plugins jenkins-pipeline email-ext jenkins-email-ext


【解决方案1】:

电子邮件模板中唯一对我有用的东西:

<%
    import hudson.model.*

    def YOUR_VARIABLE= build.getEnvVars()["SOME_BUILD_PARAMETER"];
%>

然后就可以使用了

${YOUR_VARIABLE}

【讨论】:

    【解决方案2】:

    尝试覆盖 html 模板中的 env 变量,如下所示

    <%
    def envOverrides = it.getAction("org.jenkinsci.plugins.workflow.cps.EnvActionImpl").getOverriddenEnvironment()
        project =  envOverrides["PROJNAME"]
    %>
    

    然后您可以在 html 中使用局部变量 project,例如

    <p> Job is ${project} </p>
    

    注意:您可以使用 envOverrides 来使用所有必需的环境变量

    【讨论】:

    • 是否可以将对象发送到电子邮件模板而不是字符串?
    【解决方案3】:

    要完成 Pakeer 的回答,如果您需要在电子邮件模板中使用复杂数据,您可以使用 json 序列化数据并通过 env vars 将其传递。 我需要从 jira 查询一些数据,然后将其发送到自定义电子邮件模板中,我最终得到了这个 jenkins 管道:

    payload = [
        jql: "project = WFMA and issuetype in (Incident, Bug) and fixVersion = \"${version}\"",
        startAt: 0,
        maxResults: maxResults,
        fields: [ "id", "issuetype", "summary", "priority", "status", "assignee" ]
    ]
    
    response = httpRequest(url: jiraRestBaseUrl + "search",
        acceptType: 'APPLICATION_JSON', contentType: 'APPLICATION_JSON', 
        httpMode: 'POST', validResponseCodes: '100:599', requestBody: new JsonBuilder(payload).toString(), 
        authentication: 'jira-wsf-jenkins', timeout: 30)
    
    if (response.status != 200) {
        echo("JIRA REST API returned an error ${response.status} when searching for issues, content is ${response.content}")
        throw new hudson.AbortException(("JIRA REST API returned an error ${response.status}"))
    }
    
    jsonResponse = new JsonSlurper().parseText(response.content)
    if (jsonResponse.total > jsonResponse.maxResults) {
        throw new hudson.AbortException(("total is bigger than maxResults, please implements pagination"))
    }
    
    if (jsonResponse.total == 0) {
        echo('No issue associated with this release, skipping')
    } 
    else {
        def emailSubject = "Please verify the ticket statuses for the release ${version} deployed on ${plannedUatDate}"
        def releaseIssues = jsonResponse.issues
        env.release_name = version
        env.release_date = plannedUatDate
        env.release_issues = JsonOutput.toJson(releaseIssues)
    
        emailext(subject: emailSubject, body: '${SCRIPT, template="release-notes.template"}', to: emailRecipients)
    }
    

    还有这个电子邮件模板:

    <STYLE>
    BODY, TABLE, TD, TH, P {
        font-family: Calibri, Verdana, Helvetica, sans serif;
        font-size: 14px;
        color: black;
    }
    .section {
        width: 100%;
        border: thin black dotted;
    }
    .td-title {
        background-color: #666666;
        color: white;
        font-size: 120%;
        font-weight: bold;
        padding-left: 5px;
    }
    .td-header {
        background-color: #888888;
        color: white;
        font-weight: bold;
        padding-left: 5px;
    }
    </STYLE>
    
    <BODY>
    
    <!-- Release TEMPLATE -->
    
    <%
    import groovy.json.JsonSlurper
    
    def envOverrides = it.getAction("org.jenkinsci.plugins.workflow.cps.EnvActionImpl").getOverriddenEnvironment()
    release_name =  envOverrides["release_name"]
    release_date =  envOverrides["release_date"]
    release_issues = new JsonSlurper().parseText(envOverrides["release_issues"])
    %>
    
    Dear team member,<br/>
    <br/>
    The release ${release_name} is about to be deployed on the ${release_date} on Master UAT. <br/>
    You will find below the list of tickets included in the release. Please have a look and make the necessary updates so the status 
    is aligned with our guidelines.<br/>
    <br/>
    
    <table class="section">
        <tr class="tr-title">
        <td class="td-title" colspan="6">Issues associated with the release</td>
        </tr>
        <tr>
            <td class="td-header">Issue Key</td>
            <td class="td-header">Issue Type</td>
            <td class="td-header">Priority</td>
            <td class="td-header">Status</td>
            <td class="td-header">Summary</td>
            <td class="td-header">Assignee</td>
        </tr>
        <% release_issues.each {
        issue -> %>
        <tr>
        <td><a href="https://jira.baseurl.com/browse/${issue.key}">${issue.key}</a></td>
        <td>${issue.fields.issuetype?.name.trim()}</td>
        <td>${issue.fields.priority?.name}</td>
        <td>${issue.fields.status?.name}</td>
        <td>${issue.fields.summary}</td>
        <td>${issue.fields.assignee?.name}</td>
        </tr>
        <% } %>
    </table>
    <br/>
    
    </BODY>
    

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多