Jenkins Pipeline全局变量设置:跨构建复用脚本返回值控制邮件发送
我给你整理了几个不用EnvInject插件的可行方案,都是在Groovy Pipeline里能直接落地的,你可以根据自己的Jenkins权限和场景选择:
方案1:利用Jenkins全局系统属性存储
Jenkins本身支持通过Groovy操作全局系统属性,我们可以把上一次的错误信息持久化在这里,下一次构建启动时直接读取对比。
实现步骤&代码示例
pipeline { agent any stages { stage('执行Go脚本') { steps { script { // 执行Go脚本并获取返回值 def goScriptOutput = sh(script: 'go run your_script.go', returnStdout: true).trim() // 从全局属性读取上一次的错误信息,默认空字符串 def lastError = Jenkins.instance.getSystemProperties().get('LAST_GO_SCRIPT_ERROR', '') if (goScriptOutput != '') { // 当前脚本返回错误,对比上一次错误 if (goScriptOutput != lastError) { // 错误内容不同,发送通知邮件 emailext( subject: 'Jenkins构建错误通知', body: "错误详情:${goScriptOutput}", to: 'your-email@example.com' ) // 更新全局属性为当前错误 Jenkins.instance.getSystemProperties().put('LAST_GO_SCRIPT_ERROR', goScriptOutput) // 保存全局属性变更,不然重启Jenkins会丢失 Jenkins.instance.save() } else { echo "*当前错误与上一次完全一致,抑制邮件发送*" } } else { // 脚本执行成功,清空全局属性里的错误记录 Jenkins.instance.getSystemProperties().remove('LAST_GO_SCRIPT_ERROR') Jenkins.instance.save() echo "Go脚本执行成功,无错误信息" } } } } } }
⚠️ 注意:这个方法需要你的Jenkins执行用户拥有系统管理员权限,否则会抛出权限不足的异常。如果你的账号没有这个权限,优先看下面的方案。
方案2:将错误信息存储在构建描述中
我们可以把当前构建的错误信息写入到构建描述里,下一次构建时直接读取上一次构建的描述来做对比。这个方案不需要额外权限,兼容性最好。
实现步骤&代码示例
pipeline { agent any stages { stage('执行Go脚本') { steps { script { def goScriptOutput = sh(script: 'go run your_script.go', returnStdout: true).trim() // 获取上一次构建的实例(如果存在的话) def lastBuild = currentBuild.previousBuild def lastError = '' // 只有上一次构建是失败状态时,才读取它的描述 if (lastBuild != null && lastBuild.result == 'FAILURE') { lastError = lastBuild.description ?: '' } if (goScriptOutput != '') { currentBuild.result = 'FAILURE' if (goScriptOutput != lastError) { // 错误不同,发送邮件 emailext( subject: 'Jenkins构建错误通知', body: "错误详情:${goScriptOutput}", to: 'your-email@example.com' ) // 将当前错误写入构建描述 currentBuild.description = goScriptOutput } else { echo "*当前错误与上一次完全一致,抑制邮件发送*" // 保持构建描述与错误信息一致,方便后续对比 currentBuild.description = goScriptOutput } } else { currentBuild.result = 'SUCCESS' // 构建成功时清空描述 currentBuild.description = '' echo "Go脚本执行成功,无错误信息" } } } } } }
这个方案的优势是不需要特殊权限,而且错误信息和构建历史绑定,不会和其他任务的记录混淆,非常适合单任务的场景。
方案3:将错误信息存储在Jenkins服务器本地文件
如果上面两种方案都不符合你的场景,还可以把错误信息写入到Jenkins服务器的本地文件中,每次构建时读取这个文件做对比。
实现步骤&代码示例
pipeline { agent any stages { stage('执行Go脚本') { steps { script { // 定义存储错误信息的文件路径,根据你的Jenkins部署路径调整 def errorFilePath = '/var/jenkins_home/last_go_error.txt' def goScriptOutput = sh(script: 'go run your_script.go', returnStdout: true).trim() // 读取上一次的错误信息 def lastError = '' if (fileExists(errorFilePath)) { lastError = readFile(errorFilePath).trim() } if (goScriptOutput != '') { if (goScriptOutput != lastError) { emailext( subject: 'Jenkins构建错误通知', body: "错误详情:${goScriptOutput}", to: 'your-email@example.com' ) // 将当前错误写入文件 writeFile(file: errorFilePath, text: goScriptOutput) } else { echo "*当前错误与上一次完全一致,抑制邮件发送*" } } else { // 执行成功时,删除错误文件或者清空内容 if (fileExists(errorFilePath)) { deleteFile(errorFilePath) } echo "Go脚本执行成功,无错误信息" } } } } } }
⚠️ 注意:要确保Jenkins的运行用户对这个文件路径有读写权限。如果是Windows服务器,路径要改成Windows格式,比如C:\Jenkins\last_go_error.txt。
内容的提问来源于stack exchange,提问作者anonymooseprogamer
相关产品推荐
相关产品推荐

