如何在jenkins并行管道中汇总测试结果?

如何在jenkins并行管道中汇总测试结果?,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我有一个带有并行测试执行定义的Jenkinsfile,任务是从两者中获取测试结果,以便在post步骤中处理它们 问题是:如何做到这一点?搜索任何充当示例代码的内容都不会带来任何结果-示例要么处理解释parallel,要么使用junit解释post pipeline { agent { node { label 'swarm' } } stages { stage('Testing') { parallel {

我有一个带有并行测试执行定义的
Jenkinsfile
,任务是从两者中获取测试结果,以便在
post
步骤中处理它们

问题是:如何做到这一点?搜索任何充当示例代码的内容都不会带来任何结果-示例要么处理解释
parallel
,要么使用
junit
解释
post

pipeline {
    agent { node { label 'swarm' } }

    stages {
        stage('Testing') {
            parallel {
                stage('Unittest') {
                    agent { node { label 'swarm' } }

                    steps {
                        sh 'unittest.sh'
                    }
                }

                stage ('Integrationtest') {
                    agent { node { label 'swarm' } }

                    steps {
                        sh 'integrationtest.sh'
                    }
                }
            }
        }
    }
}
在两个并行阶段定义
post{always{junit(…)}}
步骤,BlueOcean GUI产生了积极的反应,但测试报告记录的测试量几乎是测试量的两倍-非常奇怪,某些文件必须扫描两次。将此
post
步骤添加到周围的“测试”阶段会出现错误


我缺少一个示例,该示例详细说明了如何对在
并行块中创建的测试结果进行后期处理。

只是为了记录我的internet解决方案:

我在两个并行步骤中都存储了测试结果,并添加了最后一个步骤来取消文件的存储,然后
post
-处理它们:

pipeline {
    agent { node { label 'swarm' } }

    stages {
        stage('Testing') {
            parallel {
                stage('Unittest') {
                    agent { node { label 'swarm' } }

                    steps {
                        sh 'rm build/*'
                        sh 'unittest.sh'
                    }
                    post {
                        always {
                            stash includes: 'build/**', name: 'testresult-unittest'
                        }
                    }

                }

                stage ('Integrationtest') {
                    agent { node { label 'swarm' } }

                    steps {
                        sh 'rm build/*'
                        sh 'integrationtest.sh'
                    }

                    post {
                        always {
                            stash includes: 'build/**', name: 'testresult-integrationtest'
                        }
                    }
                }
            }
        }

        stage('Reporting') {
            steps {
                unstash 'testresult-unittest'
                unstash 'testresult-integrationtest'
            }

            post {
                always {
                    junit 'build/*.xml'
                }
            }
        }
    }
}
但我的观察是,您必须注意清理您的工作区:两个测试阶段都会创建一个文件,但在第二次运行时,两个工作区都是从上一次运行中继承的,并且在
build
目录中都有以前创建的测试结果

因此,在开始新的运行之前,您必须删除所有剩余的测试结果,否则您将从“其他”阶段隐藏测试结果的旧版本。我不知道是否有更好的方法可以做到这一点。

为了确保阶段(“报告”)始终得到执行,请将所有步骤放在“发布”中:

post {
    always {
        unstash 'testresult-unittest'
        unstash 'testresult-integrationtest'
        junit 'build/*.xml'
    }
}

当你用谷歌搜索你的问题,发现你自己的问题却没有一个满意的答案时,那种奇怪的感觉。。。我目前的问题仍未解决:如果其中一个测试步骤失败,如何触发最终报告步骤。默认情况下,如果某个并行步骤失败,执行将在该并行步骤之后停止。我通过确保测试步骤永不失败来解决这个问题。我捕获了sh步骤的返回状态,如果一个非零值是我手动设置的currentBuild.result='UNSTABLE',我认为您可以直接在
并行
块中添加
post{always{/*reporting step here*/}}
,因为您使用的是声明性管道。