Se você nunca ouviu falar deste pequeno aglomerado de nomes, não se assuste. Monitorar as métricas do código é quase tão simples de se implementar quanto é bonito de se dizer. Para que a análise possa acontecer, precisaremos apenas de alguns passos:
- 1 – Instalação do package coverlet.msbuild nos projetos de testes da solução
- 2 – Realização do setup do SonarQube server como um container docker
- 3 – Dockerfile para automatizar e abstrair dependências
Code Coverage
Uma das métricas mais bacanas de se acompanhar a evolução é o Code Coverage, que nada mais é do que a porcentagem de código que você realizou testes e, para ter essa métrica no seu dashboard SonarQube, é necessário a instalação do pacote coverlet.msbuild em seus projetos de testes.
O coverlet vai ser quem vai dispor um relatório de métricas de testes no formato openCover, que é um formato que o SonarQube pode manipular.
Install-Package coverlet.msbuild -Version 2.4.0
Instalado o pacote, na hora da execução dos testes via linha de comando, basta parametrizar /p:CollectCoverage=true /p:CoverletOutputFormat=opencover e você verá que um arquivo coverage.opencover.xml
será gerado na raiz do projeto.
Este arquivo conterá as métricas de testes coletadas. Posteriormente, o SonarQube fará a leitura deste arquivo e nos disponibilizará as informações de cobertura de código no dashboard!
Próximo passo: configuração do SonarQube.
SonarQube e Docker
Para configurar um servidor do SonarQube, utilizaremos a imagem oficial disponibilizada no Docker Hub. Execute o seguinte comando:
docker run -d -p 9000:9000 sonarqube
Você verá a mensagem: “SonarQube is starting”. O processo pré analítico é realmente muito simples. A única coisa que vamos fazer é o login com usuário e senha padrão e criação de um project, dentro do SonarQube server. Siga os passos:
Clique em home (você verá que é o único link disponível na tela) e depois clique no botão azul Log in. A seguinte tela lhe será apresentada:
Para logar, você utilizará as credenciais: (login) admin e (password) admin. Na sequência, será solicitado um nome para a criação do seu token – isso serve para facilitar o login via linha de comando, onde não será mais preciso parametrizar usuário e senha, apenas o token e, para atrelar os projetos que serão criados debaixo deste identificador único.
Normalmente costumo colocar meu nome ou o nome da empresa. Depois de escolher o nome, clique no botão Generate e depois em Continue.
Não se esqueça de guardar o token apresentado – vamos utilizá-lo depois. Agora escolha a linguagem do seu projeto e defina um nome para este. Na sequência, clique em Done.
Daqui pra frente acontecerá a magia.
Dockerfile
Criaremos um Dockerfile para automatizar o build do projeto, seguido da execução dos testes gerando report com coverlet e enviando as métricas para o SonarQube server.
Primeiramente utilizaremos a imagem base microsoft/dotnet:2.1-sdk e realizaremos a instalação do Java no container, pois é uma dependência do scanner do SonarQube. Parenteses aqui, veja só a vantagem de utilizar docker: instalamos Java no container, e não no servidor.
FROM microsoft/dotnet:2.1-sdk AS build-env
RUN apt-get update && apt-get dist-upgrade -y && apt-get install -y openjdk-8-jre
Na sequência copiaremos todos os projetos e a solução para dentro do container e faremos a restauração de pacotes dos projetos.
COPY . ./
RUN dotnet restore SonarQube.API/SonarQube.API.csproj
RUN dotnet restore SonarQube.API.Tests/SonarQube.API.Tests.csproj
Com os pacotes restaurados, precisamos rodar os testes dentro do container, conforme falamos no tópico de Code Coverage. Utilizando os parâmetros /p:CollectCoverage=true /p:CoverletOutputFormat=opencover, que culminará na execução dos testes na geração do arquivo de métricas coverage.opencover.xml.
RUN dotnet test SonarQube.API.Tests/SonarQube.API.Tests.csproj \
/p:CollectCoverage=true \
/p:CoverletOutputFormat=opencover
O próximo passo é realizar a instalação do SonarQube dentro do container. Conforme você pode ver na documentação oficial do SonarQube, existem algumas opções para instalá-lo. Gosto de utilizar a versão client do SonarQube junto ao dotnet ao invés de realizar o download do zip e utilizar os executáveis de forma manual.
RUN dotnet tool install -g dotnet-sonarscanner
ENV PATH="${PATH}:/root/.dotnet/tools"
Note que depois de instalar o sonarscanner precisamos adicionar o caminho do executável do scanner do sonar na variável de ambiente do sistema (Linux, neste caso), para depois invoca-lo simplesmente com o comando dotnet sonarscanner
.
RUN dotnet sonarscanner begin /k:"SonarQube" \
/d:sonar.host.url="http://192.168.1.37:9001" \
/d:sonar.verbose=true \
/v:1.0.0 \
/d:sonar.login="77634e39b317175573ef5f03a277e52841f4a3a4" \
/d:sonar.cs.opencover.reportsPaths="./SonarQube.API.Tests/coverage.opencover.xml" \
/d:sonar.coverage.exclusions="**Should.cs"
Vamos por partes.
- /k: nome do projeto que você escolheu na hora da configuração do SonarQube server no tópico anterior.
- /d:sonar.host.url: endereço IP do host que está conectado com o container do SonarQube, ou seja, endereço IP da sua máquina (host) juntamente com a porta que você realizou o bind container-host (docker…-p [host port] 9000: [container port] 9000).
- /v:1.0.0: Versão do seu projeto.
- /d:sonar.login: token coletado no setup do SonarQube server.
- /d:sonar.cs.opencover.reportsPaths: aqui você deve passar os caminhos dos relatórios de code coverage gerados pelo coverlet em formato openCover.
- /d:sonar.coverage.exclusions: regex para excluir arquivos da cobertura de código. Neste caso costumo utilizar o sufixo Should no nome das minhas classes de testes, estão estou excluindo as classes com este sufixo da cobertura de código.
O arquivo final (Dockerfile) ficou da seguinte maneira:
FROM microsoft/dotnet:2.1-sdk AS build-env
RUN apt-get update && apt-get dist-upgrade -y && apt-get install -y openjdk-8-jre
COPY . ./
RUN dotnet restore SonarQube.API/SonarQube.API.csproj
RUN dotnet restore SonarQube.API.Tests/SonarQube.API.Tests.csproj
RUN dotnet test SonarQube.API.Tests/SonarQube.API.Tests.csproj \
/p:CollectCoverage=true \
/p:CoverletOutputFormat=opencover
RUN dotnet tool install -g dotnet-sonarscanner
ENV PATH="${PATH}:/root/.dotnet/tools"
RUN dotnet sonarscanner begin /k:"SonarQube" \
/d:sonar.host.url="http://192.168.1.37:9000" \
/d:sonar.verbose=true \
/v:1.0.0 \
/d:sonar.login="77634e39b317175573ef5f03a277e52841f4a3a4" \
/d:sonar.cs.opencover.reportsPaths="./SonarQube.API.Tests/coverage.opencover.xml" \
/d:sonar.coverage.exclusions="**Should.cs"
Agora, no local onde estiver o seu Dockerfile, execute o seguinte comando:
docker build -t sonarqube-sln .
Enfim, aqui estão as métricas. Um visual extremamente simplificado para demonstrar bugs, vulnerabilidades, Code Coverage, duplicações de código, débitos técnicos e melhorias.
Espero realmente que tenham curtido!
Não deixem de compartilhar com os amigos e de curtir aqui minha página no Facebook! @kenerry.software.engineer. Acesse meu site também e baixe free o e-book de Arquitetura!