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.