Code Analysis and Code Coverage using NetCore + VS Code & publishing to Sonarqube (sonarcloud.io)


En el post anterior (Runing Tests and Code Coverage without Visual Studio. OpenCover con coverlet y ReportGenerator), hablamos sobre la ejecución de Test Unitarios y de la cobertura de código e incluso de la generación de reports desde línea de comandos. En este Post y continuando con la línea de comandos (CLI) y con el foco/roadmap en DevOps (Jenkins, Azure DevOps, Travis, etc.), veremos como realizar un análisis estático de código y publicarlo en Sonarqube junto a la cobertura de código.

Para este caso usaremos https://SonarCloud.io como servidor gratuito y publico de SonarQube donde crearemos una organización, por ejemplo «juanluelguerre-github» y generaremos un token, que usaremos para la publicación

Partiremos del siguiente Script (Shell y Cmd) similar al del post anterior, al que hemos añadadio algunas sentencias adicionales. En concreto, y las que merecen especial atención para la publicación en Sonarqube, son las que hacen referencia a «dotnet sonarScanner», es decir, las líneas: 15, 18 y 25.

clear
TOKEN=$(<sonar.token)
if [ -z "$1" ]
then
SLN="ElGuerre.Taskin.Api.sln"
else
SLN="$1"
fi
dotnet build-server shutdown
rm -rf ./.sonarqube
# "| true" avoid red color to show messages
dotnet tool install –global dotnet-sonarscanner | true
dotnet tool install –global dotnet-reportgenerator-globaltool | true
dotnet sonarScanner begin /k:'Taskin' /d:sonar.organization='juanluelguerre-github' /d:sonar.host.url='https://sonarcloud.io&#39; /d:sonar.login="$TOKEN" /d:sonar.language='cs' /d:sonar.cs.opencover.reportsPaths=$(pwd)/TestResults/coverage.opencover.xml /d:sonar.exclusions='**/bin/**/*,**/obj/**/*,**/Migrations/**' /d:sonar.coverage.exclusions='test/**'
dotnet restore $SLN
# dotnet build $SLN # It doesn't woks on MAC for msbuild 16. Issue: https://github.com/SonarSource/sonar-scanner-msbuild/issues/649
# Neither force for: dotnet msbuild /toolsversion:15 ElGuerre.Taskin.Api.sln
msbuild $SLN # It works
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=OpenCover /p:CoverletOutput=$(pwd)/TestResults/ ./test/ElGuerre.Taskin.Api.Tests/ElGuerre.Taskin.Api.Tests.csproj
reportgenerator -reports:$(pwd)/TestResults/coverage.opencover.xml -targetdir:$(pwd)/TestResults/Reports/ -reportTypes:"HTMLInline;Cobertura"
dotnet sonarScanner end /d:sonar.login="$TOKEN"
open ./TestResults/Reports/index.htm

@echo off
setlocal
set /p TOKEN=<sonar.token
IF [%1]==[] SET SLN="./ElGuerre.Taskin.Api.sln"
IF NOT [%1]==[] SET SLN=%1
dotnet build-server shutdown
del .\.sonarqube /S /Q
dotnet tool install –global dotnet-sonarscanner > nul
dotnet tool install –global dotnet-reportgenerator-globaltool > nul
dotnet sonarScanner begin /k:"Taskin" /d:sonar.organization="juanluelguerre-github" /d:sonar.host.url="https://sonarcloud.io&quot; /d:sonar.login="%TOKEN%" /d:sonar.language="cs" /d:sonar.cs.opencover.reportsPaths="%CD%\TestResults\coverage.opencover.xml" /d:sonar.exclusions="**/bin/**/*,**/obj/**/*,**/Migrations/**" /d:sonar.coverage.exclusions="test/**"
dotnet restore %SLN%
dotnet build %SLN%
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=OpenCover /p:CoverletOutput=./TestResults/ ./test/ElGuerre.Taskin.Api.Tests/ElGuerre.Taskin.Api.Tests.csproj
reportgenerator -reports:%CD%/TestResults/coverage.opencover.xml -targetdir:./TestResults/Reports/ -reportTypes:"HTML;HTMLInline;Cobertura"
dotnet sonarscanner end /d:sonar.login="%TOKEN%"
.\TestResults\reports\index.htm

En el parámetro «/d:sonar.exclusions», podremos incluir todas aquellas exclusiones

Recuerda que en este post, puedes encontrar mas detalle sobre el resto de líneas de estos scrips

En post sucesivos, continuaremos trasladando todo esto a Jenkins, Azure DevOps, Travis, etc. ¡Espero una vez más que sea de ayuda!

Happy testing and good Coverage
Juanlu

2 comentarios sobre “Code Analysis and Code Coverage using NetCore + VS Code & publishing to Sonarqube (sonarcloud.io)

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.