Adicionar informação da cobertura ao Sonarqube
Segundo a documentação:
SonarQube oferece suporte ao relatório de informações de cobertura de teste como parte da análise do seu projeto JS/TS.
No entanto, o SonarQube não gera o próprio relatório de cobertura. Em vez disso, você deve configurar uma ferramenta de terceiros para produzir o relatório como parte do seu processo de construção. Em seguida, você precisa configurar sua análise para informar ao SonarScanner onde o relatório está localizado, para que ele possa pegá-lo e enviá-lo ao SonarQube, onde será exibido no painel do seu projeto junto com as demais métricas de análise.
Para projetos JS/TS, o SonarQube oferece suporte direto a todas as ferramentas de cobertura que produzem relatórios no formato LCOV. Além disso, um formato de cobertura genérico também é suportado se você desejar usar uma ferramenta não suportada (embora você mesmo tenha que converter sua saída para o formato genérico).
Sabendo disso vamos integrar essa informação ao sonar afim de ser possível ler a informação da cobertura, essa informação é gerada através de outras ferramentas de terceiros que provêm os dados de cobertura no formato lcov
, o sonar lê essas informações e disponibiliza como parte da análise.
Neste mesmo link, que compartilhei acima, existe um passo a passo para adicionar a informação da cobertura ao seu projeto. O objetivo desta publicação é adicionar a informação da cobertura ao sonar.
Requisitos:
- Ter um servidor sonar configurado
- Ter um cliente sonar configurado
Para isso vamos utilizar o projeto tokenAuthDatastore, que é um código fonte público que pode ser utilizado para testar essa configuração, após finalizar a leitura isso você pode integrar ao seu projeto. Esse projeto tokenAuthDatastore já possui bibliotecas para execução e geração de informação da cobertura. As ferramentas que utilizei neste projeto podem ser vistas nas configurações do package.json
chai, mocha, nyc, sinon, supertest
Vamos ao passo-a-passo:
clone o projeto:
git clone git@github.com:danizavtz/tokenAuthDatastore.git
entre no diretório do projeto que foi clonado e instale as dependências:
cd tokenAuthDatastore
npm install
Agora basta executar os testes de cobertura neste projeto. Ao executar os testes de cobertura serão gerados meta-dados de cobertura do seu código fonte no diretório .nyc_output
é a partir dessas informações que será gerado o relatório de cobertura.
Sabendo disso, vamos executar a cobertura do código:
npm run coverage
Após executar a cobertura, gerar a informação de cobertura, com o seguinte comando:
npm run report-coverage
A partir dos meta-dados será gerado um novo arquivo na raiz do projeto, o arquivo coverage.lcov
.
É esse arquivo que vai servir de insumo para gerar a informação de cobertura exibida no sonar. Agora basta executar a sua automação do sonar para ler este arquivo.
Agora vamos configurar este projeto no sonar, vamos fazer a configuração local, para isso siga os passos da interface gráfica do sonar:
Preencha as informações do projeto na página seguinte:
Repare que no campo main branch name
o nome da branch é o mesmo nome da branch que eu clonei o meu projeto, que neste caso é a branch master. (você pode verificar esta informação, executando o comando: git branch
no diretório raiz do projeto que deseja configurar).
Escolha o método de análise e clique em Generate
. Para esse exemplo vou utilizar o método local, mas existem várias possibilidades de configuração, os relevantes são, Jenkins, Gitlab e Github além de outros.
Após clicar em generate, será encaminhado para a próxima tela onde será exibido o token. Agora basta apenas clicar em continue
.
Como se trata de um projeto javascript, então eu seleciono a opção de acordo.
Após selecionar esta opção será apresentado o próximo menu com as instruções para executar o sonar no projeto. Clique no botão copiar
.
O importante nesta tela é este comando para executar o sonar. Com este comando vá para o diretório raiz de onde o projeto foi clonado (o mesmo que possui o arquivo coverage.lcov
, que geramos em um passo anterior). Este é o comando:
sonar-scanner.bat -D"sonar.projectKey=tokenAuthDatastore" -D"sonar.sources=." -D"sonar.host.url=http://localhost:9000" -D"sonar.token=sqp_ec913a0f15298a323d67862cfd3a5f3ecc49cdf8"
Após executar este comando será gerado um relatório do sonar. Ao gerar o relatório você verá que a cobertura está zerada.
Isso acontece pois é necessário passar mais alguns argumentos de linha de comando, para que seja possível localizar o arquivo *.lcov
e utilizar as informações contidas nele, seguindo a documentação compartilhada no inicio da publicação temos que passar este parâmetro com o seguinte argumento:
sonar.javascript.lcov.reportPaths=coverage.lcov
Lembrando que o valor deste argumento, deve ser o nome do arquivo que possui a informação da cobertura, em nosso projeto o nome deste arquivo é coverage.lcov
.
Então agora, basta executar o comando anterior novamente, com esse novo parâmetro com seu respectivo argumento. Segue o comando completo:
sonar-scanner.bat -D"sonar.projectKey=tokenAuthDatastore" -D"sonar.sources=." -D"sonar.host.url=http://localhost:9000" -D"sonar.token=sqp_ec913a0f15298a323d67862cfd3a5f3ecc49cdf8" -D"sonar.javascript.lcov.reportPaths=coverage.lcov"
Pronto, agora as informações de cobertura já estarão disponíveis, segue um exemplo de como deve ficar:
Agora só mais um ajuste, vemos que em nosso projeto, será executado o sonar em todas as pasta, mas na verdade eu não gostaria de analisar códigos presentes nos diretórios node_modules
, assim como também no diretório tests
. Isso vai manter o foco da análise em meu código fonte desenvolvido.
Vamos então reduzir o escopo da análise, que pode ser conseguido através da exclusão de certos diretórios de serem analisados.
Vamos usar o parâmetro: sonar.exclusions
.
O comando final fica assim:
sonar-scanner.bat -D"sonar.projectKey=tokenAuthDatastore" -D"sonar.sources=." -D"sonar.host.url=http://localhost:9000" -D"sonar.token=sqp_ec913a0f15298a323d67862cfd3a5f3ecc49cdf8" -D"sonar.javascript.lcov.reportPaths=coverage.lcov" -D"sonar.exclusions=test/**,node_modules/**"
Repare que no final eu utilizei a seguinte sintaxe: test/**. Isso está explicado na documentação, e é um padrão para ignorar subdiretórios e arquivos contidos nestes diretórios.
Agora ao executar o mesmo comando (adicionando as exclusões), temos a seguinte saída:
E isso encerra o nosso tutorial, vemos que o valor da cobertura está de acordo com o mesmo que é exibido no github. Por outra ferramenta a codecov. 🙌
Também é possível fazer estas mesmas configurações via interface gráfica sem a necessidade de utilizar a linha de comando, basta seguir as instruções presentes na documentação, que já foi referenciada.
Agora que já configurou o sonar acrescentando a informação de cobertura em um projeto, será possível utilizar as mesmas ideias presentes aqui para outros projetos.