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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:19:51