#docker #azure-devops #azure-pipelines #.net-6.0
Вопрос:
Я пытаюсь добавить результаты покрытия кода в свой конвейер Azure для веб-API .NET 6, который упакован в контейнер docker.
Я использую это: Nuget добавил: «coverlet.msbuild»
Докерфайл:
RUN dotnet test "WebAPIProject.DataAccessLayer.Tests.csproj" --logger "trx;LogFileName=WebAPIProject.DataAccessLayer.Tests.trx" /p:CollectCoverage=true /p:CoverletOutputFormat=json,Cobertura /p:CoverletOutput=/src/WebAPIProject.DataAccessLayer.Tests/TestResults/Coverage/
Соответствующие строки моего конвейера:
- task: Docker@2 displayName: Build image for testing inputs: containerRegistry: '$(dockerRegistryServiceConnection)' repository: '$(imageRepository)' command: 'build' Dockerfile: '**/Dockerfile' buildContext: '$(Build.Repository.LocalPath)' tags: '$(tag)' - task: CmdLine@2 displayName: 'Copy test and Code coverage results files out of the image' inputs: script: | docker build -f ./WebAPIProject.Core/Dockerfile --target build -t $(imageRepository):$(tag) . docker create -ti --name testcontainer $(imageRepository):$(tag) docker cp testcontainer:/src/WebAPIProject.DataAccessLayer.Tests/TestResults/ $(Build.ArtifactStagingDirectory)/TestResults docker rm -fv testcontainer - task: PublishTestResults@2 displayName: 'Publish test results' inputs: testResultsFormat: 'VSTest' testResultsFiles: '*.trx' searchFolder: '$(Build.ArtifactStagingDirectory)/TestResults' - task: PublishCodeCoverageResults@1 displayName: 'Publish code coverage results' inputs: codeCoverageTool: 'Cobertura' summaryFileLocation: $(Build.ArtifactStagingDirectory)/TestResults/Coverage/coverage.cobertura.xml' pathToSources: '$(Build.ArtifactStagingDirectory)/TestResults/Coverage'
Что я получаю, так это запуск конвейера:
Calculating coverage result... Generating report '/src/WebAPIProject.DataAccessLayer.Tests/TestResults/Coverage/coverage.json' Generating report '/src/WebAPIProject.DataAccessLayer.Tests/TestResults/Coverage/coverage.cobertura.xml'
но задача «Результат покрытия кода» отбрасывает это:
##[warning]No code coverage results were found to publish.
Как и в случае с описанным выше методом, тесты работают как по маслу, я ожидаю, что покрытие также работает, но это не так. В чем ошибка в коде?
Ответ №1:
Нашел ответ. Во-первых, я изменил параметр файла Dockerfile /p:CoverletOutput
в проекте
RUN dotnet test "WebAPIProject.DataAccessLayer.Tests.csproj" --logger "trx;LogFileName=WebAPIProject.DataAccessLayer.Tests.trx" /p:CollectCoverage=true /p:CoverletOutputFormat=json,Cobertura /p:CoverletOutput=/TestResults/Coverage/
Необходимо было добавить еще docker cp
один в командную строку, чтобы также скопировать результаты покрытия, поэтому задача cmdline теперь выглядит следующим образом:
- task: CmdLine@2 displayName: 'Copy test and Code coverage results files out of the image' inputs: script: | docker build -f ./WebAPIProject.Core/Dockerfile --target build -t $(imageRepository):$(tag) . docker create -ti --name testcontainer $(imageRepository):$(tag) docker cp testcontainer:/src/WebAPIProject.DataAccessLayer.Tests/TestResults/ $(Build.ArtifactStagingDirectory)/TestResults docker cp testcontainer:/TestResults/Coverage/ $(Build.ArtifactStagingDirectory)/coverage docker rm -fv testcontainer
что также включало изменение задачи публикации результатов покрытия кода, например:
- task: PublishCodeCoverageResults@1 displayName: 'Publish code coverage results' inputs: codeCoverageTool: 'Cobertura' summaryFileLocation: '$(Build.ArtifactStagingDirectory)/coverage/coverage.cobertura.xml' pathToSources: '$(Build.ArtifactStagingDirectory)/coverage/'
Вывод для меня заключается в том, что даже я установил папку Testresult для публикации результатов покрытия, а также по какой-то причине docker не поместил их в папку. Таким образом, с помощью этого небольшого обходного пути, описанного выше, я, наконец, смог добиться копирования результатов тестирования и покрытия.