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

时间:2017-11-13 15:56:43

标签: jenkins jenkins-pipeline

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

问题是:怎么做?搜索任何作为示例代码的内容都不会产生任何结果 - 示例处理解释parallel,或者他们用post解释junit

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步骤添加到周围的“测试”阶段会出错。

我遗漏了一个示例,详细说明了如何对parallel块中创建的测试结果进行后处理。

2 个答案:

答案 0 :(得分:8)

只是为了记录我的互联网解决方案:

我想出了在两个并行步骤中存储测试结果,并添加了卸载文件的最后一步,然后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目录。

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

答案 1 :(得分:0)

要确保始终执行 stage('Reporting'),请将所有步骤放在“ post”中:

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