This guide assumes there is a Build Configuration (e.g. named "Tests + dotCover") building a .NET project and running tests with dotCover enabled (one or several build steps):
Integrating with chained build
1. Create another Build Configuration (e.g. named "Send to SonarQube") and add the following 2 dependencies on initial configuration ("Tests + dotCover"):
a) A snapshot dependency
b) An artifact dependency for ".teamcity/.NETCoverage/dotCover.dcvr
" file and getting artifacts from "Build from the same chain".
Note: since TeamCity version 2019.1, dotCover.dcvr is no longer a hidden artifact that is published by default. It is now created in the build temporary folder ("%system.teamcity.build.tempDir%\..\agentTmp\dotNetCoverageResults\dotCover.dcvr"
) and removed when the build finishes. To enable publishing of this artifact, specify the path to the .dcvr
file explicitly in the Artifacts paths of a build configuration.
2. In the new configuration ("Send to SonarQube") add a Command Line step with the following script:
%teamcity.dotCover.home%\dotCover.exe report /ReportType=HTML /Source="dotCover.dcvr" /Output="dotCover.html"
3. Add SonarQube Runner to the new configuration and add an additional command line argument with "-Dsonar.cs.dotcover.reportsPaths=dotCover.html
"
Integrating with merging reports
After the last build step with enabled dotCover, add a new step to merge all the collected coverage into a single XML in a well-known place as described here.
8 Comments
Alex Vaccaro
HI, I followed the steps above and I can see a report being pushed in SonarQube, however the coverage published in SonarQube is showing no coverage. The html report produced in the second step (dotCover.html) is showing the correct coverage stats, yet it has no sources. I am assuming the issue is due to the missing source code, can you please confirm if this would be a problem. Secondly, how do I get the sources included in the html report?
Mike Koziel
It was very non-trivial to get this going. For the scenario where you want to wrap the build and test with SonarScanner MsBuild runner, here is what we had to do to finally get it to work:
$snapshotfiles = Get-ChildItem "%system.teamcity.build.tempDir%\..\agentTmp" -recurse -Filter *.dcvr | select -ExpandProperty FullName
$snapshots = $snapshotfiles -join ";"
%teamcity.dotCover.home%\dotCover.exe merge /Source=$snapshots /Output=dotcovermerge.dcvr
%teamcity.dotCover.home%\dotCover.exe report /ReportType=HTML /Source=dotcovermerge.dcvr /Output="coverage.html"
This will give you a coverage metric in SonarQube and will even highlight what code was covered by testing. But it won't give you unit testing metrics. Still working on figuring out how to get that to show up.
Eric Pang
Hi Mike, following on from your instructions, I have encountered the following error?
[09:43:18] Step 3/6: SonarScanner for MSBuild: begin analysis (1s)
Andrey Titov
https://stackoverflow.com/questions/31253747/method-not-found-0-system-array-empty suggests that such exception could be thrown when needed .Net framework version is not installed on the machine. SonarScanner uses .Net 4.6.
Eric Pang
Thanks Andrey.
I rebuilt using an agent with .Net 4.6 and got below error:
Eric Pang
I attempted to add Set Additional Parameters on SonarScanner MSBuild runner to: '/d:sonar.cs.dotcover.reportsPaths="coverage.html"'
But it appears to fail when using the SonarScanner MSBuild runner as shown above.
Also, I do not see coverage.html file anywhere in the build artifacts.
Andrey Titov
The problem seems to be in the server URL - Scanner cannot communicate with SonarQube server.
But I believe that's too long conversation for a confluence page. Please reach us on our forum or support.
Eric Pang
Thanks I have raised a support ticket.