Jenkins集成Tosca时构建历史结果随时间异常变更问题咨询
根因说明
- 构建状态延迟翻转:当前场景下测试结果解析基本是通过JUnit插件实现,该插件默认存在后台定期重扫工作空间的逻辑。如果当次构建时拿到的是未写入完成的不完整结果文件(比如Tosca进程还没写完结果就触发了拷贝),插件没识别到失败用例会先标记构建为成功,等后续后台重扫扫到工作空间里留存的失败记录,就会覆盖旧构建的状态,和观察到的间隔1天左右状态翻转的特征完全匹配。
- 用例数累加统计:JUnit插件默认会汇总所有匹配路径规则的结果文件内的用例数据,不会按构建维度区分文件归属。给结果文件追加构建号后缀的操作,相当于把所有历史构建的结果文件都留在了工作空间内,自然会出现用例数逐次累加的错误统计结果。
可直接落地的解决方案
- 第一步:修正结果文件留存逻辑
不需要给结果文件加构建号做唯一命名,固定输出文件名即可,但是要在每次构建执行前清空工作空间内所有历史Tosca结果文件,避免跨构建数据干扰。在现有batch脚本最开头加清理命令::: 构建启动前清空工作空间内所有历史结果文件 if exist "%WORKSPACE%\Result*.xml" del /f /q "%WORKSPACE%\Result*.xml" - 第二步:补全Tosca执行与结果拷贝的可靠性逻辑
当前脚本存在两个核心隐患:一是没有捕获ToscaCIClient的执行退出码,任务实际执行失败时Jenkins会误判步骤成功;二是执行完立刻拷贝结果文件,大概率会拿到未写入完成的残缺文件,导致当次解析不到失败用例。将原有执行、拷贝逻辑替换为以下内容:Set Prog="C:\Program Files (x86)\TRICENTIS\Tosca Testsuite\ToscaCommander\ToscaCI\Client\ToscaCIClient.exe" Set Par= -m distributed -c "C:\ToscaScripting\Test Events\%testEvent%.xml" -r "C:\ToscaScripting\Reports\Result.xml" -e "http://server:81/DistributionServerService/ManagerService.svc" :: 先清空远程执行节点上的旧结果文件,避免拿到上次执行的残留数据 psexec64 \\tosca-01 -s -accepteula cmd /c "if exist C:\ToscaScripting\Reports\Result.xml del /f /q C:\ToscaScripting\Reports\Result.xml" :: 执行Tosca测试任务,留存进程退出码 psexec64 \\server -s -accepteula %Prog% %Par% set TOSCA_EXIT_CODE=%errorlevel% :: 轮询等待结果文件写入完成,最长等待30秒 :wait_result timeout /t 2 /nobreak >nul if not exist "\\tosca-01\ToscaScripting\Reports\Result.xml" goto wait_result :: 拷贝完整结果文件到Jenkins工作空间 Copy "\\tosca-01\ToscaScripting\Reports\Result.xml" "%WORKSPACE%\Result.xml" :: 透传Tosca执行退出码,任务异常时直接标记构建失败 exit /b %TOSCA_EXIT_CODE% - 第三步:调整JUnit插件配置避免误扫
- 进入Jenkins任务配置页,找到「发布JUnit测试结果」配置项
- 测试报告XML路径仅填写
Result.xml,不要使用**/*.xml这类宽范围通配符,避免扫描到无关文件 - 取消勾选「扫描工作空间所有报告」「保留长测试输出」类触发全量扫描的选项
- 勾选「无测试报告时标记构建为失败」,避免空结果被误判为成功
- 第四步:关闭后台状态重扫开关
进入Jenkins系统管理-全局配置页,找到JUnit插件配置板块,关闭「定期重新扫描工作空间测试结果」开关,从根源上避免构建完成后被后台任务篡改状态。
验证标准
- 连续执行3-5次包含部分失败用例的构建,确认构建执行完成后立刻显示正确的成功/失败状态,单构建统计的用例数和Tosca实际执行的用例数完全一致
- 构建完成后放置2天以上观察,确认历史构建状态不会自动翻转
内容的提问来源于stack exchange,提问作者Nick van de Goorbergh
相关产品推荐
相关产品推荐

