5

我有一个 Jenkins 项目,由 3 个简单的自由式工作组成,每个工作都有自己的构建奴隶。每个作业都绑定到一个单独的平台:linux、mac 或 windows。当开发人员提交他们的代码时,Jenkins 在轮询 repo 后不久,在每个构建从属设备上构建项目,每个项目都会向开发人员发送一封电子邮件,描述构建是失败还是成功。 问题:每个 scm 更改三封单独的电子邮件确实会向开发人员的收件箱发送垃圾邮件,尤其是那些喜欢经常提交小更改的人的收件箱。因此,他们可能会完全忽略这些电子邮件。

问题:有没有办法(通过插件或项目重组)将三封成功/失败电子邮件合并为一封电子邮件?我查看了Email-ext插件、MultiJob插件和Build a multi-configuration project 选项,似乎找不到更改项目结构的方法,因此只向开发人员发送一封电子邮件,描述哪些作业失败或成功。我怀疑您必须将作业合并到一个 MultiJob 项目中,并在发送之前检查在每个平台上构建的结果,但我不知道。关于詹金斯,我还没有弄清楚很多。

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

4

2 回答 2

5

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

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

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

于 2013-03-17T19:51:47.873 回答
0

如果您有“n”个自由式工作,并且您必须收到一封电子邮件通知,那么请使用 jenkins 的 Multijob 插件。这是方法之一。在这里,您可以按顺序或并行运行您的作业。要将结果整合到一封电子邮件中,您需要额外的插件,例如 Copy Artifact、Groovy。

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

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

  1. 创建一个多作业项目(将其命名为“Master”)
  2. 在 Add Build Step ----> MultiJob Phase a. “在第 1 阶段”我添加了“作业 A”,在“第 2 阶段”添加了“作业 B”(因为我希望我的作业按顺序运行) b。如果您想并行执行作业,请在“阶段 1”中添加“作业 A”和“作业 B”
  3. “作业 A”和“作业 B”应检查复制工件的权限并添加项目以允许将工件复制为“主”(这将授予“主”遍历子作业结果的权限)
  4. 现在对于“大师”,您需要在 Groovy 后期构建中添加 Groovy 脚本(添加后期构建操作 ---> Groovy Postbuild)

下面给出的是我用来遍历我的子作业结果然后获取通过百分比来决定我是否需要将主人的状态设置为成功或失败的 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_EXCEPT 来获取所需的值。例如 ${BUILD_LOG_EXCERTT, start = "Total passedTestcases", end="End Result"} 这将返回变量 passTestcases 的值,因为它存在于日志 Total passedTestcases 和 End Result 之间

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

于 2016-02-29T05:56:46.347 回答