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
相关产品推荐
相关产品推荐

