12

我有一个 Jenkins Build 作业,它使用 Jenkins Parameterized Trigger Plugin 以测试名称作为参数触发多个 Test 作业。这会在多个执行器上启动许多测试构建,这些执行器都运行正确。

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

下游构建

测试#1-#3

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

有什么方法可以让我聚合所有相关的下游测试版本吗?

附加:如果您复制测试作业,聚合测试结果确实有效。这并不理想,因为我有大量的测试套件。

4

2 回答 2

4

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

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

  1. P的实例(构建)通过构建步骤(而不是构建后步骤)通过参数化触发器插件调用D并等待D完成。连同其他参数,P将一个参数传递给D - 我们称之为PARENT_ID - 基于P的构建的BUILD_ID
  2. D执行测试并将它们存档为工件(连同 jUnit 报告 - 如果适用)。
  3. 然后P执行一个外部 Python(或内部 Groovy)脚本,该脚本通过PARENT_ID找到D的适当构建(您迭代D的构建并检查PARENT_ID参数的值)。然后,该脚本将工件从D复制到P,然后P发布它们。

如果使用 Python(这就是我所做的) - 使用Python JenkinsAPI wrapper。如果使用 Groovy - 利用Groovy 插件并将您的脚本作为系统脚本运行。然后,您可以通过其Java API访问 Jenkins 。

于 2012-05-12T18:06:37.533 回答
3

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

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

在下游作业中,将带有路径(或模式路径)的“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”变量,因此它本身可以由父作业聚合。

于 2019-07-25T07:32:22.037 回答