You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins脚本化流水线:字符串变量与邮件发送失败问题排查

Jenkins脚本化流水线:全局变量定义收件人后邮件未发送的解决办法

问题原因分析

在Groovy脚本化流水线中,直接定义的全局变量默认属于脚本类属性,在node块的闭包内可能无法正确访问;加上Jenkins安全沙箱的限制,可能导致全局变量读取失败,最终让emailext无法获取有效收件人列表。

具体解决方法

1. 用@Field注解显式声明全局变量

借助Groovy的@Field注解标记全局变量,确保它能在闭包内被正确识别:

'''
Pipeline build for ...
'''

import groovy.transform.Field
@Field
def emails = 'email1@comp.com; email2@comp.com; email3@comp.com'

node('(ubuntu)'){
    stage ('Build App'){
        try{
            // 执行构建代码
            currentBuild.result = 'SUCCESS'
        } catch (err) {
            sh "echo ${err}"
            emailext(
                subject: "构建失败通知",
                to: emails,
                recipientProviders: [[$class: 'CulpritsRecipientProvider']],
                mimeType: 'text/html',
                body: content
            )
            sh 'exit 1'
        }
    }  
}

2. 将变量移至node块内部

把收件人变量定义在node块范围内,确保作用域覆盖emailext调用:

'''
Pipeline build for ...
'''

node('(ubuntu)'){
    def emails = 'email1@comp.com; email2@comp.com; email3@comp.com'
    stage ('Build App'){
        try{
            // 执行构建代码
            currentBuild.result = 'SUCCESS'
        } catch (err) {
            sh "echo ${err}"
            emailext(
                subject: "构建失败通知",
                to: emails,
                recipientProviders: [[$class: 'CulpritsRecipientProvider']],
                mimeType: 'text/html',
                body: content
            )
            sh 'exit 1'
        }
    }  
}

额外注意事项

  • 修正错误日志输出:原代码中sh 'echo ${err}'用单引号会导致变量不解析,应改为双引号sh "echo ${err}"才能正确打印错误信息。
  • 确认content变量已正确定义,空邮件体可能引发发送异常。
  • 检查Email Extension插件的SMTP服务器配置是否正常,这是邮件发送的基础前提。
  • 若启用Jenkins安全沙箱,需确保脚本拥有变量访问权限,必要时为非流水线步骤的代码添加@NonCPS注解。

内容的提问来源于stack exchange,提问作者Mo Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 23:35:07