DevSecOps

2 jan, 2019

Monitoramento de métricas: SonarQube, Docker e Coverlet

Publicidade

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!