向Azure Pipeline发布测试结果报重复键错误如何解决
报错原因
该重复键报错由以下几个问题共同触发:
- 你拷贝到流水线工作目录的测试结果中存在重复的.trx结果文件:要么是Docker内执行测试时多次运行
dotnet test生成了多份结果,要么是之前流水线运行残留的测试文件没有被清理,PublishTestResults任务会递归匹配所有trx文件上传,重复的测试用例记录会触发Azure DevOps测试存储的唯一索引约束。 - 你当前使用的PublishTestResults@2任务版本为2.170.1,该旧版本存在已知的trx解析bug,在处理Linux容器内生成的跨平台测试结果时,会为同一条测试用例生成重复的入库标识,触发重复键报错。
- 从日志可见发布任务运行时调用的dotnet版本为3.1.418,和你构建测试使用的.NET 6版本不一致,会进一步提升解析bug的触发概率。
修复方案
按优先级依次操作即可解决:
- 修改测试结果拷贝步骤,先清理本地残留的旧测试文件,拷贝完成后自动删除重复的trx文件,仅保留最新生成的结果,调整后的代码如下:
- pwsh: | # 清空本地历史测试结果目录,避免旧文件干扰 if (Test-Path ./testresults) { Remove-Item ./testresults -Recurse -Force } $id=docker images --filter "label=test=$(Build.BuildId)" -q | Select-Object -First 1 docker create --name testcontainer $id docker cp testcontainer:/testresults ./testresults docker rm testcontainer # 删除重复生成的历史trx文件,仅保留最新一份 Get-ChildItem -Path ./testresults -Filter *.trx -Recurse | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 | Remove-Item -Force displayName: 'Copy test results' - 调整PublishTestResults任务配置,开启测试结果自动合并,使用任务的最新稳定版本而非固定旧版本,配置如下:
- task: PublishTestResults@2 inputs: testResultsFormat: 'VSTest' testResultsFiles: '**/*.trx' searchFolder: '$(System.DefaultWorkingDirectory)/testresults' mergeTestResults: true displayName: 'Publish test results' - 检查Dockerfile内的测试执行逻辑,确认没有重复执行
dotnet test命令,确认镜像内的/testresults目录不会包含历史构建生成的旧结果文件,保证容器内导出的结果仅为本次测试运行生成的唯一一份trx。 - 如果完成上述操作后仍有报错,在发布测试结果步骤前增加.NET 6 SDK的启用步骤,保证结果解析时使用的SDK版本和测试执行版本一致:
- task: UseDotNet@2 inputs: packageType: 'sdk' version: '6.x' displayName: 'Use .NET 6 SDK'
修复验证:重新运行流水线后,发布测试结果日志中dotnet版本显示为6.x开头,且无重复键相关警告即为修复成功。
内容的提问来源于stack exchange,提问作者Alexander Kozachenko
相关产品推荐
相关产品推荐

