整合Jenkins电子邮件通知

时间:2013-03-17 19:43:22

标签: jenkins

我有一个Jenkins项目,包含3个简单的自由式作业,每个作业都有自己的构建从属。每个工作都绑定到一个单独的平台:linux,mac或windows。当开发人员提交他们的代码时,Jenkins在轮询repo之后不久,在每个构建从服务器上构建项目,并且每个项目都向开发人员发送一封电子邮件,描述构建是否失败或成功。 问题:每个scm更改三个单独的电子邮件确实会阻止开发人员的收件箱,特别是那些喜欢经常进行小更改的人。因此,他们可能会完全忽略这些电子邮件。

问题:有没有办法(通过插件或项目重组)将三个成功/失败的电子邮件合并到一封电子邮件中?我查看了 Email-ext 插件, MultiJob 插件和构建多配置项目选项,似乎无法找到一种更改项目结构的方法,以便只向开发人员发送一封电子邮件,说明哪些作业失败或成功。我怀疑你必须将这些工作合并到一个MultiJob项目中,并在发送之前检查每个平台上构建的结果,但我不知道。詹金斯有很多关于我尚未想到的事情。

你们可以给我的任何建议将不胜感激。

2 个答案:

答案 0 :(得分:4)

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

您可以将“矩阵项目的触发器”配置为“仅触发父作业”,这应该达到您想要的效果。

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

答案 1 :(得分:0)

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

下面我举一个例子,我需要得到2个自由式工作的结果'工作A'和'工作B'在一封电子邮件中

(先决条件: - jenkins中安装了Multijob,Artifact,Groovy插件  运行作业的节点应该至少有2个执行程序) 要遵循的步骤。

  1. 创建一个多工作项目(将其命名为' Master')
  2. 在添加构建步骤中----> MultiJob阶段 一个。 '在第1阶段'我添加了“工作A'并且在第2阶段'添加了'工作B' (因为我希望我的工作顺序运行) 湾如果您想并行执行您的工作,请添加“工作A”和“工作A”。和'工作B'在第1阶段'
  3. '工作A'和'工作B'应检查复制工件的权限,并添加项目以允许复制工件作为' Master' (这将允许“主人”遍历子工作结果)
  4. 现在为了' Master'你需要在Groovy post build中添加Groovy Script(添加post-build action ---> Groovy Postbuild)
  5. 下面给出了我用来遍历我的子作品结果的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')
    
            }
    
    1. 现在,在可编辑的电子邮件通知中,我使用了BUILD_LOG_EXCERPT来获取所需的值。例如 $ {BUILD_LOG_EXCERPT,start =" Total passedTestcases",end =" End Result"} 这将返回变量passTestcases的值,因为它存在于日志Total passTestcases和End Result之间

      注意: - 运行作业的从属节点应至少有2个执行程序。因为这里master将一直运行,直到你的所有subjobs运行。因此,如果按顺序运行,则需要两个执行程序。如果你需要并行运行,你需要n个执行器(n-1个子工作和1个主工作)。