2013-03-17 140 views
3

我有一个Jenkins项目由3个简单的自由风格的作业组成,每个作业都有自己的构建奴隶。每项工作都与一个单独的平台相关联:linux,mac或windows。当开发人员提交他们的代码时,Jenkins在轮询回购后不久,在每个构建从站上构建项目,并且每个项目都会向开发人员发送一封电子邮件,描述构建是否失败或成功。 问题:每scm变化三个单独的电子邮件真正垃圾邮件的开发人员的收件箱,特别是那些谁喜欢经常进行小的变化的人。因此他们可能完全忽略电子邮件。Consolidate Jenkins电子邮件通知

问题:有没有一种方法(通过插件或项目重组)来将三个成功/失败的电子邮件合并成一个电子邮件?我特地到电子邮件-EXT插件,该多椎插件和构建多配置项目选项,似乎无法找到一个方法来改变项目结构,以便只有一个电子邮件发送到描述哪些作业失败或成功的开发人员。我怀疑你必须将这些工作合并成一个MultiJob项目,并在发送之前检查在每个平台上构建的结果,但我不知道。詹金斯有很多我还没有想出来的。

任何意见,你们可以给我将不胜感激。

回答

4

“可编辑电子邮件通知”发布者(来自email-ext)有一个决定如何处理矩阵(多重配置)项目的设置。

您可以将“矩阵项目的触发器”配置为“仅触发父作业”,它应该实现您想要的。

同样,您也可以将其配置为“为每个配置触发”以获得您现在的结果,或者为“父级和每个配置触发”两者。

+0

谢谢您的回应!我会试一试并回复你。 – 2013-03-18 13:05:10

+0

这样做,谢谢! – 2013-03-19 15:20:35

0

如果你有'n'自由式工作,你必须得到一个单一的电子邮件通知,然后去jenkins.Multijob插件的方法之一。 在这里,您可以顺序或并行运行您的作业。为了将结果整合到一个电子邮件中,您需要额外的插件,如复制工件,Groovy。

下面我给,我需要得到2个自由泳工作“作业A”和“作业B”的结果,在1个单电子邮件

(前必要的一个例子: - 多椎,神器,Groovy的插件是安装在jenkins中 运行作业的节点至少应有2个执行程序) 要遵循的步骤。

  1. 创建一个多椎项目(将其命名为“主”)
  2. 在添加生成步骤---->多椎阶段 一个。 '在第一阶段'我添加了'工作A',在'第二阶段'添加了'工作B'(因为我希望我的工作顺序运行) b。如果你想执行你的作业,请在'阶段1'中添加'作业A'和'作业B'
  3. '作业A'和'作业B'应检查复制作品的权限并添加项目以允许作品' Master'(这将授予'Master'权限来迭代Subjob结果)
  4. 现在,对于'Master',您需要在Groovy后期构建中添加Groovy脚本(添加后期构建操作---> Groovy Postbuild)

下面给出的是我用来遍历我的子作业结果,然后拿到通行证pertcentage决定我是否需要设置主为成功的状态或failed.Here我的工作成绩是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,开始=“总passedTestcases”,结束=“最终结果”} 这将返回变量passedTestcases的值,因为它存在于日志总passedTestcases和结束结果

    注之间: - 您在其上运行作业的从节点应该有至少2个执行程序。因为这里的主人将运行,直到你所有的subjobs运行。所以如果它按顺序运行,你将需要两个执行者。如果你需要并行运行,你需要n个执行者(n-1个subjobs和1个主任务)。