Devpos 管道提供测试和覆盖结果

问题描述 投票:0回答:1

拥有 Azure DevOps 管道,我想使用 Docker 构建我的项目,并为 DevOps 仪表板提供代码覆盖率结果。我的问题是,即使成功生成了测试和覆盖结果,以下获取测试结果和提供覆盖结果的步骤也不成功。 这些是管道各自的行:

- 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
- stage: Publish
  displayName: Publish test results
  jobs:
  - job: Publish
    displayName: Publish results
    pool:
      vmImage: $(vmImageName)
    steps:
    - 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)'

那个

    ls -la $(Build.ArtifactStagingDirectory)/testResults
    ls -la $(Build.ArtifactStagingDirectory)/coverage

是检查结果是否有,有:

drwxr-xr-x 3 vsts docker 4096 Nov 21 08:32 .
drwxr-xr-x 4 vsts docker 4096 Nov 21 08:32 ..
-rw-r--r-- 1 vsts docker 2659 Nov 21 08:32 Backend.Tests.trx
drwxr-xr-x 2 vsts docker 4096 Nov 21 08:32 Coverage
total 948
drwxr-xr-x 2 vsts docker   4096 Nov 21 08:32 .
drwxr-xr-x 4 vsts docker   4096 Nov 21 08:32 ..
-rw-r--r-- 1 vsts docker 960773 Nov 21 08:32 coverage.cobertura.xml

PublishTestResults@2 任务返回如下:

##[warning]No test result files matching '[ '**/*.trx' ]' were found.
Finishing: Publish test results

就在 PublishCodeCoverageResults@2 任务返回之后:

Found 0 result(s) matching pattern: /home/vsts/work/1/a/coverage/coverage.cobertura.xml
##[warning]No code coverage results were found to publish.
##[warning]Can't find loc string for key: NoInputFiles
##[error]NoInputFiles
Finishing: Publish code coverage results

你能告诉我,我错过了什么吗?

azure-devops code-coverage .net-7.0
1个回答
0
投票

从您的 YAML 示例中,生成代码覆盖率/测试结果的步骤和发布测试结果步骤处于不同的阶段。

由于您使用的是 Microsoft 托管的代理,因此这两个阶段中使用的代理是独立的。第一阶段生成的测试结果文件无法被第二阶段直接访问。

请参阅此文档:Microsoft 托管代理

每次运行管道时,您都会为管道中的每个作业获得一个新的虚拟机。虚拟机在完成一个作业后将被丢弃(这意味着作业对虚拟机文件系统所做的任何更改,例如检出代码,将无法用于下一个作业)

要解决此问题,您需要在第一阶段添加 Publish Build Artifacts 任务,然后使用 Publish test results 阶段中的 Download Build Artifacts 任务下载所有所需文件。

请参阅此文档:Azure Pipelines 中的工件

例如:

stages:
- stage: Stage
  jobs:
  - job: 
    steps:
    - 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
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'

- stage: Publish
  displayName: Publish test results
  jobs:
  - job: Publish
    displayName: Publish results
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: DownloadBuildArtifacts@1
      inputs:
        buildType: 'current'
        downloadType: 'single'
        artifactName: 'drop'
        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)'

在这种情况下,文件可以在两个阶段之间共享。

© www.soinside.com 2019 - 2024. All rights reserved.