Azure DevOps Pipeline无法发布测试与覆盖率结果求助
问题原因
你遇到的核心问题是Azure DevOps中不同Stage/Job的运行环境完全隔离,第一个Job生成的文件存放在该Job专属的$(Build.ArtifactStagingDirectory)中,后续Publish阶段的Job无法直接访问这个目录下的内容。
解决方案
需要通过「发布构建工件」+「下载构建工件」的步骤,在不同Job之间传递文件。具体修改如下:
1. 在第一个Job中添加发布工件任务
在CmdLine@2任务之后,添加PublishBuildArtifacts@1任务,把测试结果和覆盖率文件发布为构建工件:
- task: PublishBuildArtifacts@1 displayName: Publish test and coverage artifacts inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'test-coverage-artifacts' publishLocation: 'Container'
2. 在Publish阶段的Job中添加下载工件任务
在PublishTestResults@2之前,添加DownloadBuildArtifacts@0任务,将发布的工件下载到当前Job的目录:
- task: DownloadBuildArtifacts@0 displayName: Download test and coverage artifacts inputs: buildType: 'current' downloadType: 'single' artifactName: 'test-coverage-artifacts' downloadPath: '$(Build.ArtifactStagingDirectory)'
修改后的完整流水线片段示例
- task: CmdLine@2 displayName: Running build and creating testContainer inputs: script: | docker build -f $(dockerfilePath) --target build -t $(imageRepository):$(tag) . docker create -ti --name testcontainer $(imageRepository):$(tag) docker cp testcontainer:/TestResults/ $(Build.ArtifactStagingDirectory)/testResults docker cp testcontainer:/TestResults/Coverage/ $(Build.ArtifactStagingDirectory)/coverage docker rm -fv testcontainer ls -la $(Build.ArtifactStagingDirectory)/testResults ls -la $(Build.ArtifactStagingDirectory)/coverage # 新增:发布工件 - task: PublishBuildArtifacts@1 displayName: Publish test and coverage artifacts inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'test-coverage-artifacts' publishLocation: 'Container' - stage: Publish displayName: Publish test results jobs: - job: Publish displayName: Publish results pool: vmImage: $(vmImageName) steps: # 新增:下载工件 - task: DownloadBuildArtifacts@0 displayName: Download test and coverage artifacts inputs: buildType: 'current' downloadType: 'single' artifactName: 'test-coverage-artifacts' downloadPath: '$(Build.ArtifactStagingDirectory)' - task: PublishTestResults@2 displayName: 'Publish test results' inputs: testResultsFormat: 'NUnit' testResultsFiles: '**/*.trx' searchFolder: '$(Build.ArtifactStagingDirectory)/testResults' - task: PublishCodeCoverageResults@2 displayName: 'Publish code coverage results' inputs: summaryFileLocation: '$(Build.ArtifactStagingDirectory)/coverage/coverage.cobertura.xml' pathToSources: '$(Build.SourcesDirectory)'
额外验证点
- 确认
PublishBuildArtifacts的PathtoPublish确实包含testResults和coverage目录 - 运行流水线时,查看「工件」tab,确认
test-coverage-artifacts已成功上传 - 下载工件后,可添加
ls命令验证文件是否存在于当前Job的$(Build.ArtifactStagingDirectory)中
内容的提问来源于stack exchange,提问作者messerke
相关产品推荐
相关产品推荐

