[Como Usar ?] — Sonarcloud

Perez

E ai !! Tudo bem ?

Hoje em dia sabemos que independentemente do tamanho da seu equipe a qualidade de código é muito importante.
Então nesse contexto super importante que entra a ferramenta SonarCloud, um serviço em nuvem no qual conseguimos enviar nosso código e colocar regras para detectar problemas na qualidade do código, sendo possível detectar codesmell, bugs, vulnerabilidades e analisar a cobertura de código.

O SonarCloud é gratuito para qualquer repositório público, para repositório privado porém é necessário adquirir uma assinatura paga.
Além disso o SonarCloud consegue analisar mais de 20 linguagens, incluído C#, Java, Python, C/C++ e até JavaScript (Imagina o trabalho para analisar JS, brincadeira galera do front-end ❤)


Para nosso exemplo, subi um repositório no GitHub em .Net Core contendo dois projetos bem simples, um sendo uma API e o outro uma ClassLib, e cada um com seu respectivo teste unitário.
Os dados enviados para o SonarCloud é gerado no build da aplicação, para isso, vamos usar o Dockerfile e gerar uma imagem da aplicação executando o build.
Outro detalhe importante para a cobertura de código (Coverage) é a necessidade de instalar o pacote coverlet.msbuild nos projetos de testes unitários. Não se esqueça ?.

 

Não deixe de conferir o projeto de demonstração no qual uso nesse post no meu Github.


Agora, vamos fazer login no SonarCloud e criar um projeto novo dentro do SonarCloud.
Quando criamos um novo projeto, devemos gravar as credenciais que ele gera para usa-las ao fazer o envio do código para o SonarCloud.
Caso você já tenha uma conta no SonarCloud, e já passou pela configuração do projeto, pode descer até a sessão que começamos a criar nosso Dockerfile que fará o build e o envio para o SonarCloud.

Sem mais delongas, bora colocar a mão na massa ! ?‍♂️


SonarCloud — Configurando sua conta

Faça o login utilizando a conta do seu repositório, no meu caso estou utilizando o GitHub, a seguir verá uma tela igual a essa que está abaixo.

Feito o login utilizando a conta do GitHub, vamos clicar na opção “Import projects from GitHub”, ao fazer isso o SonarCloud vai pedir autorização para acessar sua conta do GitHub.

Basta permitir o acesso a todos os repositórios ou apenas nos que você deseja, e depois clique no botão Install.

No passo seguinte temos que criar uma organização dentro do SonarCloud. Pode escolher qualquer nome seguindo as regrinhas de nomenclatura, porém guarde a Key, pois vamos utilizar ela depois.

Pronto, agora, escolha o plano e clique em “create organization”.

Após criar a organização, o SonarCloud vai listar os repositórios que você tem no seu GitHub, selecione qual você deseja que seja feita a análise.

Pronto, agora sua conta está configurada com um novo projeto.
Após clicar em novo projeto, ou seguir os passos acima, vai aparecer a tela abaixo, basta clicar na opção “manually

Porque a opção Manual ? Pois vamos enviar nosso código para ser analisado na hora do build, no nosso exemplo vamos fazer isso ao criar uma imagem docker da nossa aplicação.

A imagem é um pouco grande, e a visualização não é das melhores, mas nessa tela você deve guardar alguns dados, lembra das credenciais que falei no começo? É agora que elas aparecem, então vamos salvar o sonar.login e todo o texto destacado em cinza em uma notepad para não perder.

Pronto, SonarCloud configurado.


SonarCloud — Build

Agora temos o projeto iniciado no SonarCloud e as credenciais necessárias para envio.
Vamos usar nesse primeiro exemplo as configurações de regra default do SonarCloud, mesmo com as regras default já conseguimos enviar nosso repositório e fazer a primeira análise.

Abaixo conseguimos ver as regras de qualidade default do SonarCloud.

Seguindo as regras default, nosso código precisa ter uma cobertura de código acima de 80%, não podendo ter mais 3% de código duplicado e assim por diante até bater todas as regras listada acima.

Lembrando que para enviar a cobertura de código para o SonarCloud precisamos do pacote msbuild coverlet.msbuild instalado nos projetos de testes unitários.

Bom, agora vamos montar nossa imagem no Docker e fazer o build para envio para o SonarCloud.

Lembrando, o repositório que estou usando já está correto, caso queira basta dá uma olhada nele.
https://github.com/claudiospinelli93/MySonarCloud 

Vamos detalhar os pontos interessantes no arquivo Dockerfile.

FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build
WORKDIR /app

# Step 01 # set sonarcloud variables.
ARG SONAR_PROJECT_KEY=claudiospinelli93_MySonarCloud
ARG SONAR_OGRANIZAION_KEY=claudiospinelli93
ARG SONAR_HOST_URL=https://sonarcloud.io
ARG SONAR_TOKEN=2bb4d49a3db0293ffe40ea0a305dfb4b8877284c

# Step 02 # installs tools to use dotnet-sonnarscanner and reportgenerator.
RUN mkdir -p /usr/share/man/man1
RUN apk update && apk add openjdk11
RUN dotnet tool install --global dotnet-sonarscanner --version 5.0.4
RUN dotnet tool install dotnet-reportgenerator-globaltool --version 4.8.4 --tool-path /tools
ENV PATH="$PATH:/root/.dotnet/tools"

# copy csproj and restore as distinct layers.
COPY MySonarCloud.sln ./
COPY src/ ./src/
COPY test/ ./test/

# copy everything else and build app
RUN dotnet restore MySonarCloud.sln

# Step 03 # run test unit and generates the coverage file.
RUN dotnet test ./test/Api.Test/Api.Test.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:Exclude="[xunit.*]*%2c[StackExchange.*]*"; exit 0
RUN dotnet test ./test/Service.Test/Service.Test.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:Exclude="[xunit.*]*%2c[StackExchange.*]*"; exit 0

# Step 04 # run reportgenerator to unify the files and save to the testresult folder.
RUN /tools/reportgenerator MySonarCloud.sln "-reports:./test/Api.Test/coverage.cobertura.xml;./test/Service.Test/coverage.cobertura.xml;" "-targetdir:./testresult" "-reporttypes:SonarQube;"

# finalize the build
RUN dotnet build-server shutdown

# Step 05 # start sonarscanner to send data to sonarcloud.
RUN dotnet sonarscanner begin \
  /k:"$SONAR_PROJECT_KEY" \
  /o:"$SONAR_OGRANIZAION_KEY" \
  /d:sonar.host.url="$SONAR_HOST_URL" \
  /d:sonar.login="$SONAR_TOKEN" \
  /d:sonar.coverageReportPaths=./testresult/SonarQube.xml

RUN dotnet publish -c Release -o out

# Step 06 # end of sonnarscan to send data to sonarcloud.
RUN dotnet sonarscanner end /d:sonar.login="$SONAR_TOKEN"

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS runtime
WORKDIR /app
COPY --from=build /app/testresult ./testresult
COPY --from=build /app/out .

ENTRYPOINT ["dotnet", "Api.dll"]

Vou destacar apenas o que é interessante para a execução do sonar:

# Step 01 # Credencial para login no sonarcloud, pode ser feito passando argumentos no build, porém deixei no arquivo Dockerfile para ficar mais fácil. Essas credenciais são as que pegamos na hora de criar o projeto.

# Step 02 # Instalar ferramenta dotnet-sonnarscaner e reportgenerator na imagem.

# Step 03 # Executar os testes unitários e também gerar um arquivo .xml na raiz de cada projeto de teste unitário de cobertura de código.

# Step 04 # Executar reportgenerator para unificar os xmls gerados pelos testes unitários gerando um arquivo único.

# Step 05 # Iniciar o sonnarscan setando as credenciais de conexão que gravamos no Step 01 no SonarCloud, além disso passamos o arquivo unificado da cobertura de código.

# Step 06 # Finaliza o dotnet scanner.

Agora que entendemos o nosso Dockerfile, vamos executar o build do docker para criar uma image do Dockerfile e consequentemente o build do dotnet.

Pronto nesse momento os dados já foram enviados para o SonarCloud.

Agora se a gente acessar novamente a tela do projeto veremos que o projeto foi analisado mas não passou pelo Quality Gate.

Porém precisamos fazer uma última configuração, escolher qual versão vamos analisar.

Temos três opções.

Previous version: Todo o código enviando anterior mente é considerado novo código.
Number of days: Essa opção faz com que a análise do código seja feita nós últimos X dias.
Specific date: Muito semelhante a opção de cima, porém você escolhe uma data. e tudo que mudou desde da data especificar é feita a analise.

Eu escolhi a opção Previous version, mesmo assim a tela não vai mudar.

Execute novamente o build do Dockerfile, para reenviar os dados para ser processado e validar se passou no Quality Gate.

E no nosso projeto falhou, pois a porcentagem de cobertura de código está abaixo de 80% e nossa manutenção do código está com nota ?.
Agora basta fazer os ajustes necessários no código para atender as regras necessárias e fazer o build novamente que os valores vão ser atualizados.

Pronto, finalizamos o envio para o SonarCloud, simples não é ?
Agora galera não há nada que impeça você de usar essa grande ferramenta que pode ser utilizada inicialmente de graça, podendo levantar pontos de vulnerabilidades, qualidade de código e até de possíveis bugs.

É tudo por hoje, pessoal. Espero que este artigo tenha ajudado você de alguma forma.

Cuidado e boa codificação!


Referências

SonarCloud Documentation
Docker Documentation
Meu GitHub