使用Jenkins的Zephyr Scale插件无法将JUnit XML文件上传至Jira Server/DC
问题背景
我最近在尝试把Jenkins测试流水线里的JUnit测试XML文件发送到Jira Server上的Zephyr Scale插件,已经在Jenkins里配置好了连接信息,也验证过连接是有效的。在构建后操作里用了这段配置来发布测试结果:
publishTestResults serverAddress: 'https://jira.me.local/', projectKey: 'GW', format: 'JUnit XML Result File', filePath: 'junitresult.xml', autoCreateTestCases: false
结果执行的时候直接报错了,错误日志如下:
[Zephyr Scale] [INFO] Publishing test results...
[Zephyr Scale] [ERROR] There was an error while publishing test results to Zephyr Scale and they were not sent. Error details:
[Pipeline] }
[Pipeline] // dir
[Pipeline] }
[Pipeline] // script
Error when executing fixed post condition:
java.lang.RuntimeException: Not implemented for Zephyr Scale Server/DC
at com.adaptavist.tm4j.jenkins.extensions.JiraInstance.publishJUnitFormatBuildResult(JiraInstance.java:99)
at com.adaptavist.tm4j.jenkins.http.Tm4jJiraRestClient.uploadJUnitXmlResultFile(Tm4jJiraRestClient.java:79)
at com.adaptavist.tm4j.jenkins.extensions.postbuildactions.TestResultPublisher.uploadResultsFile(TestResultPublisher.java:140)
at com.adaptavist.tm4j.jenkins.extensions.postbuildactions.TestResultPublisher.validateFieldsAndUploadResults(TestResultPublisher.java:115)
at com.adaptavist.tm4j.jenkins.extensions.postbuildactions.TestResultPublisher.publishResults(TestResultPublisher.java:94)
Caused: java.lang.RuntimeException
at com.adaptavist.tm4j.jenkins.extensions.postbuildactions.TestResultPublisher.handlePublishException(TestResultPublisher.java:106)
at com.adaptavist.tm4j.jenkins.extensions.postbuildactions.TestResultPublisher.publishResults(TestResultPublisher.java:96)
at com.adaptavist.tm4j.jenkins.extensions.postbuildactions.TestResultPublisher.perform(TestResultPublisher.java:85)
at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:100)
at org.jenkinsci.plugins.workflow.steps.CoreStep$Execution.run(CoreStep.java:70)
at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
后来我试着把XML转成JSON用自定义格式上传,结果又收到错误:{"errorMessages": ["Invalid Custom Format JSON file"]}
有没有大佬知道怎么解决这个问题?
解决办法
先搞懂核心问题
你遇到的Not implemented for Zephyr Scale Server/DC错误是关键——Zephyr Scale的Jenkins插件,直接上传JUnit XML的功能只给Cloud版本做了实现,Server/DC版本根本没这个功能,所以用插件的JUnit XML Result File格式肯定会失败。
方案一:直接调用Zephyr Scale的REST API(最靠谱)
绕过插件的限制,直接用API上传JUnit结果是最直接的办法,步骤如下:
- 先在Jenkins里配置好Jira的凭证:建议用API令牌(比密码安全),用户名就是你的Jira账号,令牌可以在Jira个人设置里生成。
- 在流水线里加一个步骤,用
curl或者Jenkins的HTTP请求插件调用API,示例curl命令:
把curl -u "${JIRA_USERNAME}:${JIRA_API_TOKEN}" -X POST "https://jira.me.local/rest/atm/1.0/testresult/import/junit" \ -H "Content-Type: multipart/form-data" \ -F "file=@junitresult.xml" \ -F "projectKey=GW"${JIRA_USERNAME}和${JIRA_API_TOKEN}换成你在Jenkins里配置的凭证变量,同时确保junitresult.xml的路径是构建环境里能访问到的绝对路径或者相对路径。
方案二:修正自定义JSON格式上传
如果一定要用插件的自定义格式上传,那你不能随便把XML转成JSON,得严格按照Zephyr Scale Server/DC要求的JSON结构来。官方要求的基础结构大概是这样的:
{ "projectKey": "GW", "testCycle": { "name": "Jenkins Build #${BUILD_NUMBER}" }, "testResults": [ { "testCaseKey": "GW-T1", "status": "PASS", "comment": "Test passed successfully" }, { "testCaseKey": "GW-T2", "status": "FAIL", "comment": "Test failed due to timeout" } ] }
你需要写个脚本(比如Groovy、Python)把JUnit XML里的测试用例映射到Zephyr的测试用例Key,或者开启自动创建测试用例的逻辑(如果允许的话),生成符合要求的JSON后再用插件上传。
额外注意事项
- 确保你的Zephyr Scale Server/DC版本支持这个JUnit导入API,建议升级到较新的版本,避免兼容性问题;
- 检查Jenkins服务器能正常访问Jira Server的API端点,防火墙、端口都要开放;
- 用来上传的Jira账号必须有Zephyr Scale的「测试结果上传」权限,不然会报403错误。
内容的提问来源于stack exchange,提问作者Badr

