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

如何通过Groovy Post Build插件发送邮件?Jenkins批量任务需求

解决方案:Jenkins构建失败匹配特定日志触发邮件(适配3000+自由风格任务)

方案一:Groovy Post Build + Email Ext 联动

Groovy Post Build本身无法直接发邮件,但可结合已安装的Email Ext插件实现需求:

  • 步骤1:在自由风格任务的构建后操作中添加「Groovy Postbuild」步骤
  • 步骤2:编写Groovy脚本,实现核心逻辑:
    1. 判断构建是否失败(build.result == Result.FAILURE)
    2. 读取控制台日志,匹配特定失败消息
    3. 若匹配成功,设置自定义标记参数(用于触发后续邮件流程)
  • 步骤3:添加「Editable Email Notification」(Email Ext核心步骤),设置触发条件为构建失败且自定义参数等于预设值
  • 批量配置:通过Jenkins脚本控制台执行批量配置脚本,给3000+任务统一添加上述步骤,避免手动逐个操作

示例Groovy脚本(放入Groovy Postbuild步骤):

import hudson.model.Result
import hudson.model.ParametersAction
import hudson.model.StringParameterValue

// 替换为你需要匹配的失败消息关键词
def expectedError = "特定失败关键词"
def logContent = manager.build.logFile.text

if (manager.build.result == Result.FAILURE && logContent.contains(expectedError)) {
    // 设置触发邮件的标记参数
    def triggerParam = new StringParameterValue("TRIGGER_EMAIL", "true")
    manager.build.addAction(new ParametersAction(triggerParam))
    manager.listener.logger.println("匹配到预期失败消息,标记触发邮件")
} else {
    manager.listener.logger.println("未匹配到预期失败消息,不触发邮件")
}

方案二:Flexible Publish 直接实现(更简便)

利用已安装的Flexible Publish插件,无需编写Groovy脚本即可完成逻辑:

  • 步骤1:在构建后操作中添加「Flexible Publish」步骤
  • 步骤2:添加双重条件:
    • 条件1:选择「构建状态」为失败
    • 条件2:选择「控制台输出匹配」,填入预期的失败消息关键词或正则表达式
  • 步骤3:在满足条件后,执行「Editable Email Notification」操作,配置邮件收件人、主题和内容
  • 批量配置:同样通过脚本控制台执行批量配置脚本,给所有任务统一添加该规则

批量配置脚本示例(用于Jenkins脚本控制台)

以下脚本可批量给所有自由风格任务添加方案二的配置(提前在系统配置好邮件模板和默认参数):

import hudson.model.FreeStyleProject
import org.jenkinsci.plugins.flexiblepublish.FlexiblePublisher
import org.jenkinsci.plugins.flexiblepublish.ConditionalPublisher
import org.jenkinsci.plugins.flexiblepublish.conditions.BuildStatusCondition
import org.jenkinsci.plugins.flexiblepublish.conditions.LogTextCondition
import hudson.plugins.emailext.ExtendedEmailPublisher

Jenkins.instance.getAllItems(FreeStyleProject).each { project ->
    // 跳过已配置的任务,避免重复添加
    if (!project.publishersList.any { it instanceof FlexiblePublisher }) {
        // 构建状态条件:仅失败时触发
        def buildStatusCond = new BuildStatusCondition()
        buildStatusCond.setResult(hudson.model.Result.FAILURE)
        
        // 日志匹配条件:替换为你的目标失败消息
        def logMatchCond = new LogTextCondition()
        logMatchCond.setRegEx(false) // 用正则则设为true
        logMatchCond.setLogText("特定失败关键词")
        
        // 组合条件(逻辑与:同时满足构建失败+日志匹配)
        def compositeCond = new org.jenkinsci.plugins.flexiblepublish.conditions.CompositeCondition(
            org.jenkinsci.plugins.flexiblepublish.conditions.CompositeCondition.Type.AND,
            [buildStatusCond, logMatchCond]
        )
        
        // 配置Email Ext发布器
        def emailPublisher = new ExtendedEmailPublisher()
        emailPublisher.setRecipientList("目标收件人邮箱")
        emailPublisher.setSubject("构建失败提醒:${project.name} #${'$BUILD_NUMBER'}")
        emailPublisher.setBody("项目 ${project.name} 构建失败,匹配到预期错误:特定失败关键词\n查看日志:${'$BUILD_URL'}console")
        
        // 创建条件发布器并添加到Flexible Publish
        def conditionalPublisher = new ConditionalPublisher(compositeCond, [emailPublisher])
        def flexiblePublisher = new FlexiblePublisher()
        flexiblePublisher.setPublishers([conditionalPublisher])
        
        // 保存到项目
        project.getPublishersList().add(flexiblePublisher)
        project.save()
        println("已给项目 ${project.name} 添加配置")
    } else {
        println("项目 ${project.name} 已配置,跳过")
    }
}

注意:执行批量脚本前,建议先在测试环境验证,或先给少量任务测试,避免影响所有生产任务。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:40:10