我正在自动化一个点网核心构建
给定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" } }
在查看源代码之后,它们似乎在功能上相同,除了XUnitPublisher具有一个额外的方法(目的是我不明白(!))之外,并且该类在implements列表中声明了更多接口。
XUnitPublisher
implements
关键的区别似乎是XUnitPublisherclass扩展了hudson.tasks.Recorder类,而XUnitBuilder扩展了hudson.tasks.Builder。
hudson.tasks.Recorder
XUnitBuilder
hudson.tasks.Builder
我认为,面对用户的不同之处在于,构建器的失败将Jenkins作业标记为“失败”,而发布者的失败将作业标记为“不稳定”。(来源:https : //wiki.jenkins.io/display/JENKINS/Terminology)
考虑到所有这些,我建议您使用xUnitPublisher。如果编译通过但某些测试失败,我将构建命令设置为返回0。这样,Jenkins为我提供了失败状态(对于失败的编译)和不稳定状态(对于正常工作但测试失败的状态)。我喜欢这种方式。
提交历史并不能解释为什么会有如此荒谬的代码重复。我想知道一个是否按照另一个实现,就像在弃用时通常这样做的那样……可能是因为每个必须具有不同的超类。
XUnitBuilder.java,XUnitPublisher.java