Skip to main content

SonarQube

Primeiro, se você está lendo este artigo, provavelmente está interessado no desenvolvimento de aplicativos Flutter, então podemos pular as introduções à plataforma.

E o que é o SonarQube? É uma das ferramentas que qualquer dev deveria conhecer: o guardião da alta qualidade de código.

E o que é o Docker? É uma plataforma de containerização de código aberto. Pense em ter uma máquina virtual muito mais leve com tudo o que você precisa já pré-configurado, a apenas um toque de distância do deploy.

Há toneladas de artigos e vídeos no YouTube sobre o assunto, então não vou cobri-lo em detalhes neste post.

1. Baixe e instale o Docker

Vá até https://docs.docker.com/engine/install/ e instale a versão do Docker Desktop para o seu sistema operacional.

Ele tem suporte para Apple Silicon 🎉.

Depois de baixar e executar pela primeira vez, vá até https://hub.docker.com para criar uma conta. Podemos assumir por enquanto que uma conta gratuita é tudo o que precisamos.

Caso você tenha dúvidas sobre o que é o Docker Id: é o seu nome de usuário.

2. Baixando a image do SonarQube e criando seu container

Supondo que você deseja começar com a versão gratuita Community que pode ser executada a partir do seu terminal:

docker pull sonarqube:9.3-community

Você pode receber o seguinte erro:

no matching manifest for linux/arm64/v8 in the manifest list entries

No momento da escrita, não há suporte oficial para Apple Silicon, então se você quiser a versão 9+ do SonarQube, pode tentar, mas eu não recomendo, pois ela funcionará muito lentamente e, se alguma tarefa levar mais de 30 segundos de carregamento em um Apple Silicon não vale a pena.

O comando abaixo nos forçará a baixar a imagem Docker para a nossa arquitetura, mas ela funcionará como emulada que será muito lenta.

docker pull sonarqube:9.3-community --platform linux/amd64

3. Desconsidere o ponto 2 e vamos tentar novamente.

Vamos esquecer isso e encontrar uma imagem Docker não oficial que possa funcionar para o nosso chip Silicon (se você está se perguntando se é uma imagem aleatória, não, é algo que muitos desenvolvedores estão usando):

docker pull mwizner/sonarqube:8.9.5-community

O próximo passo é criar nosso container, mas primeiro, vamos verificar a imagem que acabamos de baixar.

docker images
REPOSITORY TAG IMAGE ID
mwizner/sonarqube 8.9.5-community f7d2d15e2e22

Vamos dar o nome de sonarqubeapp ao nosso container e usar o ID da imagem acima:

docker create --name sonarqubeapp -p 9000:9000 f7d2d15e2e22

Agora vamos iniciar nosso container:

docker start sonarqubeapp

Depois de carregar por 15–20 segundos, você pode ir para http://localhost:9000 e ter um site em execução. Para começar, use admin/admin como nome de usuário e senha.

4. Baixando o plugin para analisar Dart e Flutter

No momento da escrita desse post, não há suporte oficial para Dart e Flutter do SonarQube, mas viva o GitHub e a comunidade.

Já existe um plugin/extensão que pode ser baixado em https://github.com/insideapp-oss/sonar-flutter.

Vá para Releases e pegue o mais recente. Em nosso caso, isso significa sonar-flutter-plugin-0.4.0.jar.

5. Copie o plugin .jar no container

Vá até a pasta Downloads ou onde o plugin foi baixado e execute este comando:

docker cp sonar-flutter-plugin-0.4.0.jar sonarqubeapp:/opt/sonarqube/extensions/plugins

Estamos fazendo uma cópia de arquivo usando docker cp, pois o sistema de arquivos do container não é visível para nós de uma visão externa.

sonarqubeapp é o nome do container e depois dos dois pontos, indicamos o caminho para a pasta de plugins dentro do container.

Então precisamos reiniciar o container para que os plugins sejam atualizados.

docker restart sonarqubeapp

Se todos os passos até agora foram bem-sucedidos, então dentro do Portal, devemos ser capazes de ver algo semelhante:

!https://miro.medium.com/v2/resize:fit:700/1*zYx66HL3fYdPpzvXg4SItw.jpeg

6. Baixando o SonarScanner

O scanner nos permitirá fazer upload dos resultados locais para o Portal para exibir os dados.

Ele pode ser executado a partir de uma imagem Docker com acesso ao repositório de origem, mas, por enquanto, nos concentraremos em uma instalação local.

Vá até https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/ e baixe o arquivo e descompacte a pasta na sua pasta home.

Certifique-se de adicionar o caminho ao seu .bash_profile ou .zshrc ou qualquer configuração de shell que você possa ter em seu sistema, para que o comando seja visível em todos os lugares e, em seguida, reinicie o terminal.

export PATH="$HOME/sonar-scanner-4.7.0.2747-macosx/bin:$PATH"

7. Criando o arquivo de configuração

Como último passo, precisamos de um arquivo de configuração na raiz do projeto Flutter que trocará algumas informações entre o código fonte e o Portal SonarQube.

# Project identification, either hardcode it or use Environment variables
sonar.projectKey=my-project-key
sonar.projectName=My Project
sonar.login=my-long-token

sonar.host.url=http://localhost:9000

# Source code location.
# Path is relative to the sonar-project.properties file. Defaults to .
# Use commas to specify more than one folder.
sonar.sources=lib
sonar.tests=test

# Encoding of the source code. Default is default system encoding.
sonar.sourceEncoding=UTF-8

# exclude generated files
sonar.exclusions=test/**/*_test.mocks.dart,lib/**/*.g.dart

Linhas 2–4: você os obterá depois de criar um novo projeto dentro do Portal.

8. Executando!

No passo final, vamos juntar tudo e ir para a raiz do projeto Flutter e executar o seguinte:

flutter pub get
flutter test --machine --coverage > tests.output
sonar-scanner

!https://miro.medium.com/v2/resize:fit:700/1*lfe89OsG5TeOhsSsL-xl2Q.jpeg

9. Ponto Extra

Lembra do ponto 3? Obtivemos a imagem inicial de algum lugar, então a configuramos para atender ao nosso caso particular.

Se quisermos salvar a imagem de toda a configuração para uso em outro Mac ou até mesmo distribuí-la para o mundo, podemos publicar nosso container como um repositório privado ou público.

Primeiro, vá para a sua conta do Docker Hub e crie um novo repositório (privado ou público).

docker commit sonarqubeapp
docker images # get the newly created empty image id
docker tag [Empty Image Id] [Docker Id]/[Repository Name]:[Version]
docker push [Docker Id]/[Image Name]:[Version]

Exemplo:

docker commit sonarqubeapp
docker images
docker tag b0dcc123456 myaccount/project-image:1.0
docker push myaccount/project-image:1.0

Na próxima vez, como já configuramos tudo, podemos pular os passos 2–5.

Considerações finais

O SonarQube é uma excelente ferramenta que pode aumentar a velocidade da sua equipe e as métricas de qualidade do código aproveitando estatísticas como code smells, cobertura de código, linhas duplicadas, complexidade ciclomática, etc.

Ele também pode ser integrado a um ambiente CI/CD abrindo um novo mundo de possibilidades, como decorar seus pull requests ou configurar os trilhos de qualidade da sua própria equipe (como, por exemplo, todo o código enviado deve ter nenhum code smell ou cobertura de testes acima de 75%) e a lista pode continuar.

E isso é apenas uma pequena parte das funcionalidades.