如何自动禁用/启用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
相关产品推荐
相关产品推荐

