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
view raw SonarPublish (sh) hosted with ❤ by GitHub

@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
view raw SonarPublish (cmd) hosted with ❤ by GitHub

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

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

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

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