声明式Jenkins Pipeline并行节点下登记JUnit测试结果问题求助
问题根因
- 语法规则不匹配:Jenkins Pipeline 中
post块仅支持定义在整个pipeline层级或单个stage层级,不能直接放在parallel的单个分支执行块内,你当前写的post块本身就不会被触发。 - sh命令默认终止逻辑:sh命令默认执行返回非0状态码时,会直接抛出异常终止当前块的所有后续执行,即便逻辑位置正确也会被中断。
可行解决方法
方案1:单分支内自主处理(推荐,无需跨节点传输文件)
直接调整每个并行分支内的执行逻辑,关闭sh的异常抛出,执行完测试后无论结果如何都先登记JUnit结果,再根据返回值标记步骤状态,参考配置如下:
stage('Unit Test') { parallel { stage('tests') { agent { node { label 'A' } } steps { ws { // 给sh加returnStatus: true,执行失败不会抛出异常,仅返回非0状态码 def testExitCode = sh script: '你的测试执行命令', returnStatus: true // 无论测试是否失败,先登记结果 junit "build/pytest-results/*.xml" // 如果测试执行失败,主动标记当前步骤失败 if (testExitCode != 0) { error "Unit test execution failed" } } } } stage('python3: more tests') { agent { node { label 'B' } } steps { ws { def testExitCode = sh script: '你的测试执行命令', returnStatus: true junit "build/pytest-results/*.xml" if (testExitCode != 0) { error "Python3 unit test execution failed" } } } } stage('more tests') { agent { node { label 'C' } } steps { ws { def testExitCode = sh script: '你的测试执行命令', returnStatus: true junit "build/pytest-results/*.xml" if (testExitCode != 0) { error "More unit test execution failed" } } } } } }
方案2:使用stage级post块统一处理
如果需要统一收集所有节点的测试结果,可以在每个分支内stash测试文件,再在stage级的post块中统一处理,参考配置如下:
stage('Unit Test') { parallel { stage('tests') { agent { node { label 'A' } } steps { ws { catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { sh '你的测试执行命令' } // stash当前节点的测试结果,注意命名唯一 stash includes: "build/pytest-results/*.xml", name: "test-result-A" } } } stage('python3: more tests') { agent { node { label 'B' } } steps { ws { catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { sh '你的测试执行命令' } stash includes: "build/pytest-results/*.xml", name: "test-result-B" } } } stage('more tests') { agent { node { label 'C' } } steps { ws { catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { sh '你的测试执行命令' } stash includes: "build/pytest-results/*.xml", name: "test-result-C" } } } } post { always { // 依次unstash所有节点的测试结果后统一登记 unstash "test-result-A" unstash "test-result-B" unstash "test-result-C" junit "build/pytest-results/*.xml" } } }
内容的提问来源于stack exchange,提问作者mikepapadim
相关产品推荐
相关产品推荐

