获取电子邮件分机脚本模板以与 Jenkins 管道一起使用

Getting email-ext script templates to work with Jenkins pipeline

我最近转换到 Jenkins 2.x 并且我正在试验管道流,但我似乎无法让 email-ext 插件与 groovy 脚本模板一起工作。虽然我的标准流程仍然可以正常工作,但如果我尝试以下操作,我会收到意外令牌 SCRIPT

的错误
    emailext mimeType: 'text/html', replyTo: 'xxxx', subject: "${env.JOB_NAME} - Build# ${env.BUILD_NUMBER} - ${env.BUILD_STATUS}", to: 'xxxx', body: "${SCRIPT, template='regressionfailed.groovy'}"

我知道早期令牌扩展存在问题,但从最新的 wiki 更新来看,这些问题似乎已得到修复。我也仍然没有得到任何令牌的令牌扩展。有没有什么好的参考可以使它再次工作。我想切换到管道流程,但带有令牌扩展的电子邮件模板是可能工作流程的关键。

今天遇到了同样的问题,显然在 emailext 之前定义正文似乎可以解决问题:

def emailBody = '${SCRIPT, template="regressionfailed.groovy"}'
def emailSubject = "${env.JOB_NAME} - Build# ${env.BUILD_NUMBER} - ${env.BUILD_STATUS}"
emailext(mimeType: 'text/html', replyTo: 'xxxx', subject: emailSubject, to: 'xxxx', body: emailBody)

请记住,您可能仍需要重做部分模板。

在声明式管道中使用 emailext 没有问题。但是您的脚本将无法正确访问 "build.result" 参数,因为它尚未完成。就像在默认脚本 groovy-html.template.

编辑:实际上你可以访问build.result如果你自己手动设置它。

所以最好在声明式管道的末尾添加一个阶段,如下所示:

stage('Send email') {
    def mailRecipients = "your_recipients@company.com"
    def jobName = currentBuild.fullDisplayName

    emailext body: '''${SCRIPT, template="groovy-html.template"}''',
        mimeType: 'text/html',
        subject: "[Jenkins] ${jobName}",
        to: "${mailRecipients}",
        replyTo: "${mailRecipients}",
        recipientProviders: [[$class: 'CulpritsRecipientProvider']]
}

另请注意,如果您使用自己的脚本,则不能将其命名为 "groovy-html.template" 或“groovy-text.template”,因为它们是 emailext 的默认值(因此文件将甚至无法访问)。参见 "Script content" here

显然每个人都知道。有两种定义管道的方法:声明式管道(以'pipeline'开头)和脚本式管道(以[=23=开头) ])

使用声明式管道,必须指定脚本来执行程序,即使用def定义变量。所以在管道案例中:

stage('Email') {
    steps {
        script {
            def mailRecipients = 'XXX@xxxxx.xxx-domain'
            def jobName = currentBuild.fullDisplayName
            emailext body: '''${SCRIPT, template="groovy-html.template"}''',
            mimeType: 'text/html',
            subject: "[Jenkins] ${jobName}",
            to: "${mailRecipients}",
            replyTo: "${mailRecipients}",
            recipientProviders: [[$class: 'CulpritsRecipientProvider']]
        }
    }
}

我为此花了一些时间,希望对其他人有所帮助。

脚本化管道的电子邮件通知:

mail bcc: '', body: body, cc: '', from: '', replyTo: '', subject: 'Build Done', to: 'xyzh@abc.com'

令我惊讶的是,没有人指出 OP 报告的错误的根本问题。错误来自 Groovy 编译器本身,这是因为 ${SCRIPT...} 出现在双引号内,使其成为 GString(无效的)。要修复 OP 中提到的错误,您只需使用单引号代替:

    emailext mimeType: 'text/html', replyTo: 'xxxx', subject: "${env.JOB_NAME} - Build# ${env.BUILD_NUMBER} - ${env.BUILD_STATUS}", to: 'xxxx', body: '${SCRIPT, template='regressionfailed.groovy'}'

您甚至可以像这样使用独立的 Groovy 解释器重现错误:

$ cat << 'END' > /tmp/t.groovy
> def emailext(Map opts) {
> }
>
> emailext mimeType: 'text/html', replyTo: 'xxxx', subject: "${env.JOB_NAME} - Build# ${env.BUILD_NUMBER} - ${env.BUILD_STATUS}", to: 'xxxx', body: "${SCRIPT, template='regressionfailed.groovy'}"
> END
$ groovy /tmp/t.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
/private/tmp/t.groovy: 4: unexpected token: SCRIPT @ line 4, column 150.
   TATUS}", to: 'xxxx', body: "${SCRIPT, te
                                 ^

1 error