我有一个Jenkins Build作业,它使用Jenkins参数化触发器插件以测试名称作为参数触发多个Test作业。这启动了多个执行器上的大量测试构建,这些构建器都正确运行。
我现在想要使用'聚合下游测试结果 - >自动聚合所有下游测试'来聚合结果。我已在Build作业中启用此功能并设置了指纹识别,以便将这些作为下游作业识别。在Build jobs lastBuild页面中,我可以看到它们被识别为下游构建:
下游构建
测试#1-#3
当我点击“聚合测试结果”时,它只显示最新的这些(测试#3)。如果作业总是运行相同的测试但是我的所有测试工具都运行不同的部分,这可能是一种很好的行为。
我是否可以通过某种方式汇总所有相关的下游测试版本?
其他: 如果复制测试作业,聚合测试结果将起作用。这并不理想,因为我有大量的测试套件。
答案 0 :(得分:3)
我将概述手动解决方案(如评论中所述),并在以后需要时提供更多详细信息:
让 P 成为父作业, D 作为下游作业(您可以轻松地将方法扩展到多个下游作业)。
如果使用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”变量,因此它本身可以由父作业聚合。