Monitoramento de Métricas: SonarQube, Docker e Coverlet

Se você nunca ouviu falar neste 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 vamos precisar 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 esta 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 é 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 se logar você utilizará as credenciais: (login) admin e (password) admin. Na sequência será solicitado um nome para a criação do seu token, isto 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. Utilizaremos-o depois. Agora escolha a linguagem do seu projeto e defina um nome para este. Na sequência clique em Done.

Daqui para frente é aonde 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.

Na sequência, copiaremos todos os projetos e a solução para dentro do container e faremos a restauração de pacotes dos projetos.

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á a execução dos testes na geração do arquivo de métricas coverage.opencover.xml.

O próximo passo é realizar a instalação do SonarQube dentro do container. Conforme você pode verificar na documentação oficial do SonarQube existem algumas opções para instala-lo. Eu 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.

Note que depois de instalar o sonarscanner precisamos adicionar o caminho do executável do scanner do sonar na váriavel de ambiente do sistema (linux neste caso), para que depois possamos invoca-lo simplesmente com o comando dotnet sonarscanner.

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:

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 do facebook! @kenerry.software.engineer. Acesse meu site também e baixe free o e-book de Arquitetura! https://kenerry.com.br

Código Completo.