如何通过Groovy Post Build插件发送邮件?Jenkins批量任务需求
解决方案:Jenkins构建失败匹配特定日志触发邮件(适配3000+自由风格任务)
方案一:Groovy Post Build + Email Ext 联动
Groovy Post Build本身无法直接发邮件,但可结合已安装的Email Ext插件实现需求:
- 步骤1:在自由风格任务的构建后操作中添加「Groovy Postbuild」步骤
- 步骤2:编写Groovy脚本,实现核心逻辑:
- 判断构建是否失败(
build.result == Result.FAILURE) - 读取控制台日志,匹配特定失败消息
- 若匹配成功,设置自定义标记参数(用于触发后续邮件流程)
- 判断构建是否失败(
- 步骤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
相关产品推荐
相关产品推荐

