一尘不染

构建xunit.xml文件后,应该使用xUnitPublisher还是xUnitBuilder?

jenkins

我正在自动化一个点网核心构建

给定Jenkins文件中的以下代码片段,我将为我拥有的每个测试项目生成一个XML文件。在接下来的步骤中,我要处理这些XML文件。

詹金斯提供了两种选择。我很困惑使用哪个选项。我使用“过程”还是“发布”?两者都为阈值提供了相同的选项,两者似乎都执行相同的操作。他们俩都标记了构建失败,他们都向詹金斯提供了一份测试报告。这是遗产吗?还是他们有自己目的的完全不同的步骤?

顺便说一句,这种失败检查并引发错误是阻止Jenkins继续构建的唯一方法吗?当将构建标记为“
FAILED”以仅继续其余步骤时,这似乎有点奇怪。如果我想继续,我还可以将stopProcessingIfError设置为false,还是我错过了要点?

stage('Test') {
    def testScript = ""
    def testProjects = findFiles(glob: 'test/**/project.json')

    if (!fileExists('reports/xml')) {
        if (!fileExists('reports')) {
            sh "mkdir reports"
        }
        sh "mkdir reports/xml"
    }

    for(prj in testProjects) {
        println "Test project located, running tests: " + prj.path
        def matcher = prj.path =~ 'test\\/(.+)\\/project.json'

        testScript += "dotnet test --no-build '${prj.path}' -xml 'reports/xml/${matcher[0][1]}.Results.xml' || true\n"
    }

    sh testScript

    step([
        $class: 'XUnitBuilder',
        thresholdMode: 1,
        thresholds: [[$class: 'FailedThreshold', failureThreshold: '1']],
        tools: [[
            $class: 'XUnitDotNetTestType',
            deleteOutputFiles: true,
            failIfNotNew: true,
            pattern: 'reports/xml/*.Results.xml',
            skipNoTestFiles: false,
            stopProcessingIfError: true
        ]]
    ])

    if (currentBuild.result.equals("FAILURE")) {
        throw "Test results did not pass thresholds"
    }
}

阅读 291

收藏
2020-07-25

共1个答案

一尘不染

在查看源代码之后,它们似乎在功能上相同,除了XUnitPublisher具有一个额外的方法(目的是我不明白(!))之外,并且该类在implements列表中声明了更多接口。

关键的区别似乎是XUnitPublisherclass扩展了hudson.tasks.Recorder类,而XUnitBuilder扩展了hudson.tasks.Builder

我认为,面对用户的不同之处在于,构建器的失败将Jenkins作业标记为“失败”,而发布者的失败将作业标记为“不稳定”。(来源:https
:
//wiki.jenkins.io/display/JENKINS/Terminology

考虑到所有这些,我建议您使用xUnitPublisher。如果编译通过但某些测试失败,我将构建命令设置为返回0。这样,Jenkins为我提供了失败状态(对于失败的编译)和不稳定状态(对于正常工作但测试失败的状态)。我喜欢这种方式。

提交历史并不能解释为什么会有如此荒谬的代码重复。我想知道一个是否按照另一个实现,就像在弃用时通常这样做的那样……可能是因为每个必须具有不同的超类。

XUnitBuilder.javaXUnitPublisher.java

2020-07-25