Доступ к переменной в шаблоне электронной почты ext с использованием конвейера Jenkins

Я пытаюсь прикрепить файл шаблона с помощью конвейера Jenkins, e-mail. Переменная (PROJNAME) недоступна в файле шаблона, и я получаю исключения по электронной почте:

Возникла исключительная ситуация во время рендеринга шаблона: Нет такого свойства: env для класса: SimpleTemplateScript21 groovy.lang.MissingPropertyException: Нет такого свойства: env для класса: SimpleTemplateScript21 в org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java53) org.codehaus.groovy. 1) в groovy.text.SimpleTemplateEngine$SimpleTemplate$1.writeTo(SimpleTemplateEngine.java:168) в groovy.text.SimpleTemplateEngine$SimpleTemplate$1.toString(SimpleTemplateEngine.java:180) в hudson.plug.plug.int.renderTemplate(ScriptContent.java:151) в hudson.plugins.emailext.plugins.content.ScriptContent.evaluate(ScriptContent.java:82) в org.jenkinsci.plugins.tokenmacro.DataBoundTokenMacro.evaluate(данные BoundTokenMacro.java:208) в org.jenkinsci.plugins.tokenmacro.Parser.processToken(Parser.java:308) в org.jenkinsci.plugins.tokenmacro.Action$KiHW1UeqOdqAwZul.run.arg org. Неизвестно (неизвестно).ActionMatcher.match(ActionMatcher.java:96) в org.parboiled.parserunners.BasicParseRunner.match(BasicParseRunner.java:77) в 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")

4 ответа

Решение

Попробуйте переопределить переменную env в HTML-шаблоне, как показано ниже

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

Затем вы можете использовать локальную переменную проекта в вашем HTML, как

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

Примечание: вы можете использовать все необходимые переменные env, используя envOverrides

Единственное, что сработало для меня в шаблоне электронной почты:

<%
    import hudson.model.*

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

Тогда вы можете использовать

${YOUR_VARIABLE}

Чтобы завершить ответ Пакера, вы можете сериализовать данные с помощью json и передать их через env vars, если вам нужно использовать сложные данные в шаблоне электронной почты. Мне нужно было запросить некоторые данные из jira, а затем отправить их в настраиваемом шаблоне электронной почты, и в итоге я получил этот конвейер Дженкинса:

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>

Ответ Пакира сработал и для меня. Я просто хотел бы отметить, что мне нужно было установить переменные env внутри скрипта конвейера.

      ...
steps {
 script {
  env.MY_VARIABLE="Some value"
 }
}

Определение в блоке environments {} моего скрипта конвейера не работало.

@Jinlxz Liu: насколько я понимаю , это ссылка на ScriptContentBuildWrapper:https://javadoc.jenkins.io/plugin/email-ext/hudson/plugins/emailext/plugins/content/ScriptContentBuildWrapper.html

Другие вопросы по тегам