-
-
Notifications
You must be signed in to change notification settings - Fork 289
Integration
Add the GitHub Action from the Marketplace to your build pipeline.
Sample YAML code:
- name: Setup .NET Core # Required to execute ReportGenerator
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.x
dotnet-quality: 'ga'
- name: ReportGenerator
uses: danielpalme/[email protected]
with:
reports: 'coverage.xml' # REQUIRED # The coverage reports that should be parsed (separated by semicolon). Globbing is supported.
targetdir: 'coveragereport' # REQUIRED # The directory where the generated report should be saved.
reporttypes: 'HtmlInline;Cobertura' # The output formats and scope (separated by semicolon) Values: Badges, Clover, Cobertura, CsvSummary, Html, Html_Dark, Html_Light, HtmlChart, HtmlInline, HtmlInline_AzurePipelines, HtmlInline_AzurePipelines_Dark, HtmlInline_AzurePipelines_Light, HtmlSummary, JsonSummary, Latex, LatexSummary, lcov, MarkdownSummary, MHtml, PngChart, SonarQube, TeamCitySummary, TextSummary, Xml, XmlSummary
sourcedirs: '' # Optional directories which contain the corresponding source code (separated by semicolon). The source directories are used if coverage report contains classes without path information.
historydir: '' # Optional directory for storing persistent coverage information. Can be used in future reports to show coverage evolution.
plugins: '' # Optional plugin files for custom reports or custom history storage (separated by semicolon).
assemblyfilters: '+*' # Optional list of assemblies that should be included or excluded in the report. Exclusion filters take precedence over inclusion filters. Wildcards are allowed.
classfilters: '+*' # Optional list of classes that should be included or excluded in the report. Exclusion filters take precedence over inclusion filters. Wildcards are allowed.
filefilters: '+*' # Optional list of files that should be included or excluded in the report. Exclusion filters take precedence over inclusion filters. Wildcards are allowed.
verbosity: 'Info' # The verbosity level of the log messages. Values: Verbose, Info, Warning, Error, Off
title: '' # Optional title.
tag: '${{ github.run_number }}_${{ github.run_id }}' # Optional tag or build version.
license: '' # Optional license for PRO version. Get your license here: https://reportgenerator.io/pro
customSettings: '' # Optional custom settings (separated by semicolon). See: https://github.com/danielpalme/ReportGenerator/wiki/Settings.
toolpath: 'reportgeneratortool' # Default directory for installing the dotnet tool.
Add the Azure DevOps extension from the Marketplace to your build pipeline.
By using the Publish Code Coverage Results task you can embed the HTML report into the build results.
Please use a build agent that supports .NET Core
(e.g. 'Hosted VS2017').
Sample YAML code:
- task: reportgenerator@5
displayName: ReportGenerator
inputs:
reports: 'src\target\reports\coverage\coverage.opencover.xml'
targetdir: '$(Build.SourcesDirectory)/coveragereport'
reporttypes: 'HtmlInline_AzurePipelines;Cobertura;Badges'
assemblyfilters: '-xunit*'
The Publish Code Coverage Results task from Microsoft regenerates the report with different settings and based on the supplied Coberatura file (see announcement). Moreover it does not necessarily use the latest version of ReportGenerator.
To disable the regeneration of the report, you can use the following environment variable in your build:
disable.coverage.autogenerate: 'true'
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage results'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(Build.SourcesDirectory)/coveragereport/Cobertura.xml'
reportDirectory: '$(Build.SourcesDirectory)/coveragereport'
If you are using Azure DevOps and want to use history function you do not have to write a custom plugin for history storage. Instead you can store the history files in Azure Artifacts as Universal Packages. So the build pipeline is something like this:
- Get the previous history from Azure Artifacts
- Generate the report and new history
- Put the new history to Azure Artifacts
Your YAML pipeline might look like this sample:
variables:
disable.coverage.autogenerate: 'true'
codecoveragehistory.directory: '$(Build.ArtifactStagingDirectory)\history'
codecoveragehistory.feedName: '$(Build.Repository.Name)-$(Build.SourceBranchName)'
- task: UniversalPackages@0
displayName: Get code coverage history from Azure Artifacts
continueOnError: true
inputs:
command: 'download'
downloadDirectory: '$(codecoveragehistory.directory)'
feedsToUse: 'internal'
vstsFeed: 'xxxxxxx'
vstsFeedPackage: '$(codecoveragehistory.feedName)'
vstsPackageVersion: '0.*'
- task: reportgenerator@5
displayName: 'Create Code coverage report'
inputs:
reports: '$(Build.SourcesDirectory)\**\coverage.cobertura.xml'
targetdir: '$(Build.SourcesDirectory)\CodeCoverage'
historydir: '$(codecoveragehistory.directory)'
title: 'Merged code coverage for $(Build.Repository.Name)-$(Build.SourceBranchName)'
- task: UniversalPackages@0
displayName: Publish code coverage history to Azure Artifacts
inputs:
command: 'publish'
publishDirectory: '$(codecoveragehistory.directory)'
feedsToUsePublish: 'internal'
vstsFeedPublish: 'xxxxxx'
vstsFeedPackagePublish: '$(codecoveragehistory.feedName)'
versionOption: 'patch'
packagePublishDescription: 'Code Coverage History for repository $(Build.Repository.Name) on branch $(Build.SourceBranchName)'
verbosity: 'Information'
-
Setup a VSTS build agent which runs on your machine: https://YOURACCOUNT.visualstudio.com/CoverageTest/_admin/_AgentQueue
-
Commit/Push your project to VSTS.
I created this sample project: VSTS_CoverageSample.zip
It contains a .NET class library and a test project based on xUnit. It also contains two bat files which:- Execute the tests with OpenCover
- Generate a Cobertura file using OpenCoverToCoberturaConverter
- Generate HTML report using ReportGenerator
-
Setup of build definition in VSTS. In this case I used the ".NET Desktop" template and made some modifications:
- Removed the VsTest step
- Added a Batch Script step after Build solution which executes the bat file with the following command:
RunTests_$(BuildConfiguration).bat
- Added a Publish Test Results step after Publish symbols path. This uploads the xUnit results to VSTS
- Added a Publish Code Coverage Results step after Publish Test Results using the following configuration:
- Overall build order:
-
Execute build and see results
See also this article by @dotnetfer.
Navigate to General Settings of your Build Configuration Settings and add the following artifact path:
TARGETDIRECTORY_OF_REPORTGENERATOR/*.* => Coverage.zip
Now you can download the full report as a ZIP archive and also browse the report in TeamCity.
Add this Nuget package or install the global tool in your pipeline.
Your .gitlab-ci.yml
pipeline will could look like this:
stages:
- build
- test
build_job:
stage: build
script:
- 'dotnet restore --packages .nuget'
- 'dotnet publish -c Release .\MyProject\MyProject.csproj'
test_job:
stage: test
script:
- 'mkdir coveragereports'
- 'dotnet test -c Release --collect:"XPlat Code Coverage"'
- '.\.nuget\reportgenerator\5.1.13\tools\net6.0\ReportGenerator.exe -reports:MyProject.Test\TestResults\*\coverage.cobertura.xml -targetdir:coveragereports "-reporttypes:Html;TeamCitySummary" -verbosity:Info -historydir:coveragehistory'
coverage: '/##teamcity\[buildStatisticValue key=''CodeCoverageS'' value=''(\d+\.?\d*)''\]/'
artifacts:
paths:
- '.\coveragereports'
dependencies:
- build_job
With this setup the coverage report is available as a build artifact.
The reporttype
"TeamCitySummary" will make your coverage ratio available to Gitlab.
To evaluate it, navigate to "Settings" -> "CI/CD" -> "General pipelines" of your project.
Then enter the following pattern to the setting "Test coverage parsing":
`##teamcity\[buildStatisticValue key=\'CodeCoverageS\' value='(\d+\.?\d*)'\]`
Now you can use "Coverage report" badge.
Navigate to the Configure page of your project and add the following artifact path:
TARGETDIRECTORY_OF_REPORTGENERATOR/*.*
Now you download the full report as a ZIP archive and also browse the report in Jenkins.
You can also use the HTML Publisher Plugin.
By default Jenkins is very restrictive about JavaScript. If you use the default CSP rules you will only see a static report.
If you wish to use the JavaScript based dynamic features, then you have to change the CSP settings in Jenkins.
Navigate to the Jenkins Script Console and execute the following command:
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox allow-scripts allow-same-origin; default-src 'self';")
See this tutorial: http://www.palmmedia.de/Blog/2012/9/27/cruisecontrol-net-integration-of-coverage-reports
You can use this pipe for Bitbucket: https://bitbucket.org/loremfoobar/reportgenerator-coverage-bitbucket-pipe