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

如何自动禁用/启用Jenkins流水线以避免邮件轰炸?

解决Jenkins流水线异常邮件轰炸的方案

针对你遇到的每分钟触发的流水线在异常时重复发邮件的问题,这里提供两种可靠的解决思路,无需依赖外部工具:


方案一:用标记文件控制邮件发送冷却期(无需禁用流水线)

核心思路是在Jenkins服务器上创建一个标记文件,记录上次发送异常邮件的时间。每次流水线触发时,先检查当前时间与标记文件的时间差,只有超过设定的冷却时长(比如30分钟)才发送邮件并更新标记时间。

修改后的流水线代码:

pipeline {
    agent any
    stages {
        stage('Check Condition') {
            steps {
                script {
                    // 替换成你的实际异常判断逻辑
                    def isAbnormal = true 

                    if (isAbnormal) {
                        def markerFile = '/var/jenkins_home/abnormal_marker.txt'
                        def coolDownMinutes = 30
                        def now = new Date().getTime()

                        // 检查是否在冷却期内
                        def canSendEmail = true
                        if (fileExists(markerFile)) {
                            def lastSendTime = new File(markerFile).text.toLong()
                            def timeDiffMinutes = (now - lastSendTime) / (1000 * 60)
                            canSendEmail = timeDiffMinutes >= coolDownMinutes
                        }

                        if (canSendEmail) {
                            // 替换成你的邮件发送逻辑
                            echo "Sending abnormal notification email..."
                            // mail to: 'team@example.com', subject: 'System Abnormal', body: 'Exception detected'

                            // 更新标记文件记录的时间
                            writeFile file: markerFile, text: now.toString()
                        } else {
                            echo "Within cool down period, skip sending email"
                        }
                    } else {
                        echo "System is working normally"
                        // 正常时删除标记文件,下次异常可立即发邮件
                        def markerFile = '/var/jenkins_home/abnormal_marker.txt'
                        if (fileExists(markerFile)) {
                            deleteFile file: markerFile
                        }
                    }
                }
            }
        }
    }
}

方案二:发送邮件后禁用流水线,定时自动启用

如果需要彻底阻止流水线后续触发,可以通过Jenkins API实现禁用/启用操作,同时启动异步任务在指定时长后重新启用流水线。

修改后的流水线代码:

pipeline {
    agent any
    stages {
        stage('Check Condition') {
            steps {
                script {
                    // 替换成你的实际异常判断逻辑
                    def isAbnormal = true
                    def coolDownMinutes = 30

                    if (isAbnormal) {
                        def job = Jenkins.instance.getItemByFullName(env.JOB_NAME)
                        // 避免重复禁用和发邮件
                        if (!job.isDisabled()) {
                            // 替换成你的邮件发送逻辑
                            echo "Sending abnormal notification email..."
                            // mail to: 'team@example.com', subject: 'System Abnormal', body: 'Exception detected'

                            // 禁用当前流水线
                            job.setDisabled(true)
                            echo "Disabled pipeline, will re-enable after ${coolDownMinutes} minutes"

                            // 启动异步延迟任务,到期后重新启用流水线
                            sh """
                                nohup bash -c "sleep ${coolDownMinutes}m && curl -X POST '${env.JENKINS_URL}/job/${env.JOB_NAME}/disable' --user '${env.JENKINS_USER}:${env.JENKINS_TOKEN}' -H 'Jenkins-Crumb:${env.JENKINS_CRUMB}'" > /dev/null 2>&1 &
                            """
                        } else {
                            echo "Pipeline is already disabled, skip sending email"
                        }
                    } else {
                        echo "System is working normally"
                        // 正常时确保流水线处于启用状态
                        def job = Jenkins.instance.getItemByFullName(env.JOB_NAME)
                        if (job.isDisabled()) {
                            job.setDisabled(false)
                            echo "Re-enabled pipeline as system is normal"
                        }
                    }
                }
            }
        }
    }
}

注意:使用此方案需配置Jenkins用户的API令牌(JENKINS_TOKEN)和CSRF crumb参数(JENKINS_CRUMB),可通过Jenkins凭据管理存储敏感信息。


方案对比

  • 方案一:不中断流水线正常检查,仅控制邮件频率,适合需要持续监控但避免邮件轰炸的场景。
  • 方案二:彻底禁用流水线,阻止后续触发,适合异常期间无需继续检查的场景,但需处理API权限和异步任务可靠性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:05:50