在Jenkins中聚合下游参数化作业的结果

时间:2012-05-10 12:56:52

标签: jenkins

我有一个Jenkins Build作业,它使用Jenkins参数化触发器插件以测试名称作为参数触发多个Test作业。这启动了多个执行器上的大量测试构建,这些构建器都正确运行。

我现在想要使用'聚合下游测试结果 - >自动聚合所有下游测试'来聚合结果。我已在Build作业中启用此功能并设置了指纹识别,以便将这些作为下游作业识别。在Build jobs lastBuild页面中,我可以看到它们被识别为下游构建:

  

下游构建

     

测试#1-#3

当我点击“聚合测试结果”时,它只显示最新的这些(测试#3)。如果作业总是运行相同的测试但是我的所有测试工具都运行不同的部分,这可能是一种很好的行为。

我是否可以通过某种方式汇总所有相关的下游测试版本?

其他: 如果复制测试作业,聚合测试结果将起作用。这并不理想,因为我有大量的测试套件。

2 个答案:

答案 0 :(得分:3)

我将概述手动解决方案(如评论中所述),并在以后需要时提供更多详细信息:

P 成为父作业, D 作为下游作业(您可以轻松地将方法扩展到多个下游作业)。

  1. P 的实例(构建)通过Parameterized Trigger Plugin通过构建步骤调用 D 作为构建后步骤)并等待 D 完成。与其他参数一起, P 传递给 D 一个参数 - 让我们称之为 PARENT_ID - 基于 P build的 BUILD_ID
  2. D 执行测试并将其存档为工件(以及jUnit报告 - 如果适用)。
  3. P 然后执行外部Python(或内部Groovy)脚本,通过 PARENT_ID 找到 D 的相应构建(您迭代构建 D 并检查 PARENT_ID 参数的值)。然后,该脚本将工件从 D 复制到 P P 将其发布。
  4. 如果使用Python(这就是我所做的) - 利用Python JenkinsAPI wrapper。如果使用Groovy - 使用Groovy Plugin并将脚本作为系统脚本运行。然后,您可以通过其Java API访问Jenkins。

答案 1 :(得分:0)

我使用声明性管道提出了以下解决方案。

它需要安装“复制工件”插件。

在下游作业中,使用结果文件的路径(或模式路径)设置“ env”变量:

post {
  always {
    steps {
      script { // Rem: Must be BEFORE execution that may fail   env.RESULT_FILE='Devices\\resultsA.xml'
      }
      xunit([GoogleTest(
        pattern: env.RESULT_FILE,
      )])
    }
  }
}

请注意,我使用xunit,但对junit同样适用

在父作业中,保存构建变量,然后在后期处理中,我使用以下代码汇总结果:

def runs=[]

pipeline {
  agent any
  stages {
    stage('Tests') {
      parallel {
        stage('test A') {
          steps {
            script {
              runs << build(job: "test A", propagate: false)
            }
          }
        }
        stage('test B') {
          steps {
            script {
              runs << build(job: "test B", propagate: false)
            }
          }
        }
      }
    }
  }
  post {
    always {
      script {
        currentBuild.result = 'SUCCESS'
        def result_files = []
        runs.each {
          if (it.result != 'SUCCESS') {
            currentBuild.result = it.result
          }
          copyArtifacts(
            filter: it.buildVariables.RESULT_FILE,
            fingerprintArtifacts: true,
            projectName: it.getProjectName(),
            selector: specific(it.getNumber().toString())
          )
          result_files << it.buildVariables.RESULT_FILE
        }
        env.RESULT_FILE = result_files.join(',')
        println('Results aggregated from ' + env.RESULT_FILE)
      }
      archiveArtifacts env.RESULT_FILE
      xunit([GoogleTest(
        pattern: env.RESULT_FILE,
      )])
    }
  }
}

请注意,父作业还设置了“ env”变量,因此它本身可以由父作业聚合。

相关问题