Integração Contínua com SonarCloud e Bitbucket Cloud.

Como manter seu código sempre em um padrão aceitável de forma automática.

Jamal On the Code
Bemobi
7 min readApr 10, 2019

--

Steven Universe

Quando falamos de qualidade de software uma das primeiras coisas que nos vêm a mente são os padrões de qualidades definidos. As vezes por um indivíduo ou um time. Aqui na M4U não é diferente, sempre pensamos em qualidade de software, porém quando deixamos para que a qualidade seja garantida de forma manual e voluntária por um membro da equipe, pode ser que em um momento de entregas mais apertadas, a visão crítica do responsável não se torne tão eficaz… Então decidimos adotar o Sonar Cloud para definição de algumas regras básicas de qualidade de software.

Importante! Assumirei que você já tem uma conta no Bitbucket Cloud e no SonarCloud. Vale frisar que ambas são pagas.

Bitbucket Cloud

Um dos maiores sistemas de controle de versionamento (VCS) na nuvem é o Bitbucket da Atlassian, é um versionador de código robusto e com uma vasta opções de "plugins". Existe duas formas de licença empresarial, são elas: Bitbucket Cloud e Bitbucket Server. Neste post vamos falar somente do Bitbucket Cloud, já que essa é a licença que atualmente utilizamos aqui na M4U.

Como já dito anteriormente, o Bitbucket te da uma grande opções de plugins para complementar e integrar em seu repositório, um deles é uma integração "direta" com o SonarCloud.

SonarCloud

O SonarCloud é um serviço em nuvem oferecido pela SonarSource e baseado no SonarQube. O SonarQube é uma plataforma open source amplamente adotada para inspecionar continuamente a qualidade do código-fonte e detectar bugs, vulnerabilidades e "code smells" em mais de 20 linguagens de programção.

O SonarCloud lê métricas do código fonte da aplicação enviadas para o serviço para montar um painel para expor as métricas daquele código e através de um mínimo aceitável (Quality Gates) ele te diz onde estão possíveis bugs, "code smells" e outras variáveis.

Página de métricas do SonarCloud.

Vamos Começar!

Primeira coisa que devemos fazer é habilitar o plugin do SonarCloud no serviço do Bitbucket. Para isso entre em sua conta do Bitbucket e entre no menu administrativo do seu Bitbucket, como no GIF abaixo.

Após habilitar, deverá aparecer uma tela do SonarCloud pedindo para que você continue com a configuração de integração entre os serviços.

Após realizar esse passo já será possível importar um projeto do Bitbucket para o Sonar. Para isso, clique no botão de + e selecione "Analyze new project". Em seguida iremos selecionar "Setup manually" para gerar um token de autorização para geração das métricas que serão enviadas ao Sonar.

Preencha os campos abaixo:

Clicando em "Set Up" um novo diálogo irá abrir dando duas opções: Criar um novo token ou utilizar um que já exista. Fique a seu critério caso queira usar um que já existe. Em seguida, escolha em qual linguagem esse projeto será executado e o Sonar irá mostrar exemplos de como realizar essa integração. Nós iremos utilizar a opção para Go e Linux.

Já tendo o Bitbucket e o Sonar já configurados vamos pela página de seu repositório configurar o projeto no Sonar que foi criado de forma manual. Esse link entre os dois servições é importante para a inclusão de algumas funcionalidades que iremos mostrar posteriormente.

Na página de configuração do seu repositório, um dos últimos itens na aba da configuração deverá ser o Sonar, como mostra o gif a seguir.

Habilitando a “Show repository overview widget” será possível ver as informações do sonar na tela inicial do seu repositório.

Enviando Métricas ao Sonar

Após ter nossa integração com Sonar x Bitbucket funcionando podemos começar a enviar nossas métricas para o Sonar. Para isso aconselho que utilize o código base utilizado para esse post, ele contém as métricas que iremos avaliar aqui.

É necessário ter o Golang instalado para geração do build e o report de testes com percentual de cobertura. Caso você ainda não tenha a instalação é bem fácil, aconselho a seguir o tutorial oficial no GitHub para a instalação.

Após ambiente instalado com a versão mais recente do Go, iremos realizar o download do código fonte. Abra seu terminal e em um diretório de preferência execute o seguinte comando.

Isso irá realizar o download do código base para seu computador. Após o download entre na pasta gerada com o nome go-sonarcloud e execute o comando a seguir no terminal:

Esse comando irá fazer com que o Go de forma recursiva rode todos os testes em seu diretório (go test -json $(go list ./… )), complementar com os dados de cobertura de testes em todos os pacotes existente (-cover -coverpkg $(go list ./… | tr ‘\n’ ‘,’)) e finalmente gerar um arquivo com os insumos de teste (-coverprofile coverage.txt). Com o arquivo coverage.txt gerado, iremos realizar o envio dos dados para o Sonar com o comando que vimos anteriormente, porém com um comando adicional.

Após a conclusão do sonar-scanner você verá os dados do sonar na página inicial do seu repositório, como a imagem abaixo.

Perceba que a propriedade sonar.projectKey não precisa ser igual ao nome do seu repositório e a integração funcionará da mesma forma.

Integração Contínua

Agora com nossa integração Sonar x Bitbucket funcional, teremos que a cada alteração realizar esse passo a passo para enviar as métricas ao Sonar. O Bitbucket nos oferece um plugin chamado Pipelines. Nele é possível configurar uma integração contínua para enviar essas métricas automaticamente ao Sonar a cada novo código que é inserido no seu repositório.

O Pipelines já vem (ou deveria) vir habilitado por padrão para seu repositório, no entanto é precisso adicionar um arquivo de configuração para que ele realize os passos que você gostaria, abaixo um arquivo de exemplo para nosso repositório.

Com esse arquivo será possível adicionar ao Bitbucket Pipelines a integração direta com o Sonar após cada commit novo em seu repositório. Veja que ao invés de utilizarmos o valor direto do nosso token de permissão do Sonar, utilizamos através da variáveis de repositório, que é a forma mais segura de se passar senhas, tokens de autenticação ou qualquer tipo de credencial.

Após a conclusão do seu build, verá novas métricas no painel do SonarCloud, em nosso caso eu incluí novos testes vermos um aumento em nossas métricas.

Sonar Painel
Bitbucket Cloud Repository

Perceba que houve um decréscimo na quantidade de linhas. No primeiro build não ignoramos os arquivos de testes, então o sonar entende que eles precisariam ser testados também. Em nosso bitbucket-pipelines.yml ignoramos todos os arquivos **_test.go.

Analisando Pull Requests

Uma das funcionalidades mais interessantes na integração entre Sonar e Bitbucket é a análise automática de Pull Requests, isso significa que, uma vez que seu Quality Gate não é atendido o Sonar gera um build com falha no seu repositório, podendo assim bloquear merge pull requests que estejam incluindo bugs ou não estão atendendo a seu padrão de qualidade. Para configurar essa integração é necessário incluir algumas variáveis em nosso passo de envio de métrica para o Sonar no bitbucket-pipelines.yml.

Essas e mais propriedades podem serem encontradas na própria documentação do Sonar, na seção de “Pull Request Analysis”. Após essa inclusão, quando um pull request for criado o Sonar irá fazer a comparação com a branch de destino e caso haja quebra de Quality Gate, você verá na lista de builds algo parecido com a imagem abaixo.

E assim você pode posteriormente configurar para que seu repositório não aceite merges de pull requests com builds quebrados, adicionar mais informações no “Pull Request Analysis” do Sonar, entre outras opções.

Conclusão

Ambos os serviços fornecem uma variedade grande de integração e de customização. Sonar + Bitbucket facilita muito o trabalho que as vezes é feito durante um Code Review ou durante o processo de build de um repositório. É sempre válido automatizar um processo como este para garantir a qualidade de novas entregas e com esse processo configurado, citando o Sonar Cloud:

“There is no longer an excuse for pushing issues to the master.”

Espero que tenham gostado! É muito importante feedback. Tendo dúvidas pode perguntar que tentaremos responder sempre que possível. Grande abraço e até a próxima.

--

--