我有一个Jenkins项目,包含3个简单的自由式作业,每个作业都有自己的构建从属。每个工作都绑定到一个单独的平台:linux,mac或windows。当开发人员提交他们的代码时,Jenkins在轮询repo之后不久,在每个构建从服务器上构建项目,并且每个项目都向开发人员发送一封电子邮件,描述构建是否失败或成功。 问题:每个scm更改三个单独的电子邮件确实会阻止开发人员的收件箱,特别是那些喜欢经常进行小更改的人。因此,他们可能会完全忽略这些电子邮件。
问题:有没有办法(通过插件或项目重组)将三个成功/失败的电子邮件合并到一封电子邮件中?我查看了 Email-ext 插件, MultiJob 插件和构建多配置项目选项,似乎无法找到一种更改项目结构的方法,以便只向开发人员发送一封电子邮件,说明哪些作业失败或成功。我怀疑你必须将这些工作合并到一个MultiJob项目中,并在发送之前检查每个平台上构建的结果,但我不知道。詹金斯有很多关于我尚未想到的事情。
你们可以给我的任何建议将不胜感激。
答案 0 :(得分:4)
“可编辑电子邮件通知”发布商(来自email-ext)有一个设置来决定它如何处理矩阵(多次迁移)项目。
您可以将“矩阵项目的触发器”配置为“仅触发父作业”,这应该达到您想要的效果。
同样,您也可以将其配置为“为每个配置触发”以获得您现在拥有的结果,或者为两者配置“触发父项和每个配置”。
答案 1 :(得分:0)
如果你有' n'自由式工作,你必须得到一个电子邮件通知然后去jenkins的Multijob插件。这是方法之一。 在这里,您可以按顺序或并行运行作业。要将结果合并到一封电子邮件,您需要其他插件,如复制工件,Groovy。
下面我举一个例子,我需要得到2个自由式工作的结果'工作A'和'工作B'在一封电子邮件中
(先决条件: - jenkins中安装了Multijob,Artifact,Groovy插件 运行作业的节点应该至少有2个执行程序) 要遵循的步骤。
下面给出了我用来遍历我的子作品结果的groovy脚本,然后得到通过百分比来决定是否需要将主服务器的状态设置为成功或失败。这里我的工作结果是nunit结果。
import hudson.model.*
import com.tikal.jenkins.plugins.multijob.*
void log(msg) {
manager.listener.logger.println(msg)
}
def boolean findpercent(int pass,int total)
{
log 'Entered the function find percent'
def float percent = 0.0
log percent
percent = (pass/total) * 100
log percent
if(percent >= 90.0)
{
return true
}else
{
return false
}
}
threshold = Result.SUCCESS
void aggregate_results() {
def failed = false
def int totalTestCases = 0
def int failedTestCases = 0
def int passedTestcases = 0
def int skipTestcases = 0
mainJob = manager.build.getProject().getName()
job = hudson.model.Hudson.instance.getItem(mainJob)
log '-------------------------------------------------------------------------------------'
log 'Aggregated status report'
log '-------------------------------------------------------------------------------------'
log mainJob
log job
log manager.build.getNumber()
log manager.build.getResult()
job.getLastBuild().getSubBuilds().each { subBuild->
subJob = subBuild.getJobName()
subJobNumber = subBuild.getBuildNumber()
job1 = hudson.model.Hudson.instance.getItem(subBuild.getJobName())
build = job1.getBuildByNumber(subJobNumber)
log build
log job1.getLastCompletedBuild().getResult()
log job1.getLastCompletedBuild().getTestResultAction()
log build.getResult()
log subJobNumber
log subJob
log job1
log subBuild
log build.getAllActions()
log '-------------------------------------------------------------------------------------'
log 'build.getTestResultAction()'
log '-------------------------------------------------------------------------------------'
log build.getTestResultAction()
testResult = build.getTestResultAction()
log testResult
if (testResult != null) {
total = testResult.getTotalCount()
log total
log totalTestCases
totalTestCases += total
log totalTestCases
failures = testResult.getFailCount()
log failures
log failedTestCases
failedTestCases += failures
log failedTestCases
skip = testResult.getSkipCount()
log skip
log skipTestcases
skipTestcases += skip
pass = total - (failures + skip )
log pass
passedTestcases += pass
log pass
log passedTestcases
}
}
log 'Total testcases run'
log totalTestCases
log 'Total failedTestCases'
log failedTestCases
log 'Total skipTestcases'
log skipTestcases
log 'Total passedTestcases'
log passedTestcases
log 'End Result'
if(findpercent(passedTestcases,totalTestCases)) {
log 'success'
manager.build.setResult(hudson.model.Result.SUCCESS)
}else
{
log 'failure'
manager.build.setResult(hudson.model.Result.FAILURE)
}
log 'time taken'
log manager.build.getTimestampString()
log 'Time End'
}
try
{
aggregate_results()
}
catch(Exception e) {
log('ERROR: ${e.message}')
log('ERROR: Failed Status report aggregation')
}
现在,在可编辑的电子邮件通知中,我使用了BUILD_LOG_EXCERPT来获取所需的值。例如 $ {BUILD_LOG_EXCERPT,start =" Total passedTestcases",end =" End Result"} 这将返回变量passTestcases的值,因为它存在于日志Total passTestcases和End Result之间
注意: - 运行作业的从属节点应至少有2个执行程序。因为这里master将一直运行,直到你的所有subjobs运行。因此,如果按顺序运行,则需要两个执行程序。如果你需要并行运行,你需要n个执行器(n-1个子工作和1个主工作)。