Freneticamente os versionadores de código estão juntando o fruto do trabalho das várias pessoas envolvidas em um projeto. Contudo, ainda que você tenha testes unitários, se a execução deles não estiver atrelada e condicionando o PR, nada impede que um código que quebre padrões e comportamentos seja adicionado a sua base de códigos. Neste breve post vamos aprender como configurar uma GitHub Action que rode os testes de unidade e rode uma análise do Sonar, enviando para o SonaCloud.io. É importante Ressaltar que, para utilizar o SonarCloud gratuitamente, você terá que tornar público o seu repositório mas caso opte por pagar a assinatura do SonarCloud (cerca de 10€ ou na nossa moeda R$65,12 por mês), os passos são os mesmos apenas o repositório que poderá ser privado. Caso você também possua uma opção on-premisse do SonarQube, poderá utilizá-la normalmente.
Configurando o SonarCloud.io
Acesse sonarcloud.io e logo na tela inicial irá pedir que você se cadastre ou faça o login, meu conselho é que você faça o cadastro e integre a sua conta do GitHub com o SonarCloud dessa forma vai facilitar a sua vida.
Após cadastrado você terá acesso a tela de projetos onde já até pode selecionar projetos durante o processo, mas não faça isso por agora, temos mais algumas coisas a fazer...
Agora é o momento de você configurar um projeto e diferente da versão on-premisse, onde os projetos são adicionados ao seu sonar por padrão, no SonarCloud você precisa configurá-los de antemão. É o que vamos fazer, você pode clicar no botão Analyze new project, que está no centro da tela, ou no botão com o símbolo "+" que está no canto superior direito da página, ao lado da sua foto de perfil e selecionar a opção Analyze new project.
Na janela que abriu, você verá todos os projetos do seu GitHub (os privados aparecem acinzentados e com um cadeado, impedindo sua seleção), agora marque o projeto que deseja analisar e clique no botão Set Up.
Neste momento, o SonarCloud fará uma análise do conteúdo do seu projeto, tentando descobrir se ele oferece suporte. Para alguns tipos de projeto o Sonar provê integração automática, com projetos C#, contudo, é preciso que você faça uso de algum pipeline de CI. Nessa exemplo vamos usar GitHub então pra isso clique no botão With GitHub Actions.
A próxima etapa é muito importante! Para que você não exponha suas credenciais de acesso, as GitHub Actions e o SonarCloud fazem uso de um token de autenticação. O token é mostrada logo após clicar no botão então COPIE IMEDIATAMENTE o conteúdo do token. Se você o perder, terá de criar outro (daqui a pouco te explico o que você vai fazer com esse token). Apenas clique no botão Continue.
Ao selecionar a opção .NET, o Sonar te mostra um arquivo de exemplo de workflow. Em situações mais simples, você poderia utilizar esse arquivo mas como temos outros planos, apenas ignore.
E assim está completa a configuração do nosso projeto. Pelo menos o que diz respeito a integração. Você pode clicar no ícone SonarCloud ou ainda em My Projects para visualizar os projetos configurados.
Configurações de análise
Ainda é necessário configurar a análise, e essa etapa serve para você dizer ao Sonar onde estão os arquivos com informações do code-coverage, quais projetos devem ser ignorados, quais arquivos devem ser ignorados (os gerados automaticamente, por exemplo) e afins.
Se você não acertar todas a configurações de primeira, não se preocupe, você pode alterar e disparar manualmente novas execuções. Clique no projeto ou em Configure Analysis. O SonarCloud irá te redirecionar para uma página que já vimos antes. Mas diferente do que fizemos, clique no menu Administration -> General Settings
Nesta tela, todas as configurações de análise de código estão acessíveis e agora apenas vá alternando entre as abas para configurar o que for pertinente.
Ao clicar em “Language” e selecionar C#, por exemplo, você pode informar a localização dos arquivos de cobertura em vários formatos. Na aplicação de exemplo, estamos utilizando o opencover, que é gerado dentro dos projetos de testes, que estão em __tests__
. Como o nome dos arquivos tem suporte a Glob, posso digitar __tests__/**/coverage.opencover.xml
para encontrar a cobertura de código.
Você pode fazer mais configurações no SonarCloud, definindo arquivos que deve ignorar na análise, por exemplo (veja a aba Analysis Scope), mas não vou me aprofundar nesse ponto agora. Este é o momento em que mudamos do SonarCloud para o GitHub.
Configurando o repositório no GitHub
Depois de acessar o seu repositório no GitHub, clique na aba Actions. O GitHub já é esperto o bastante para saber qual é a linguagem do seu projeto e já sugere opções de Actions para utilizar. Clique na opção .NET Core. (Nosso projeto de exemplo é em C# por isso selecionamos essa opção)
Gentilmente o GitHub irá criar um template de Action que, basicamente, já compila e roda os testes do seu projeto. E do lado direito também é apresentada uma lista de Snippets que podem auxiliar na criação da sua Action.
Customizando a Action padrão de .NET Core
Vamos aproveitar esse arquivo para explicar algumas coisas básicas:
Nesta parte do código você está definindo quando a sua Action deve ser executada. Para este caso, nossa Action será executado sempre que um push
for feito na branch develop
ou um PR for aberto para a branch develop
. Caso você queira que a execução seja feita para todas as branches, substitua develop
por ‘**’
.
Os demais pontos são autoexplicativos, mas ainda quero te chamar atenção para:
Esse conjunto de código tem instalada a versão especificada em dotnet-version
no ambiente em que estamos rodando – ubuntu-latest. Será possível utilizar a versão dotnet 5, que está em pré-release? Claro que sim! Basta que você altere a versão do SDK para:
Precisa ser esse nome grande, porque é o disponível no metadata da versão (disponível em https://dotnetcli.blob.core.windows.net/dotnet/release-metadata/5.0/releases.json). Um ponto triste é que AINDA não há versão do dotnet-sonarscanner
rodando na versão net5. Contudo, já existe PR aberto para essa atualização. Aguarde um pouco antes de atualizar os projetos caso esteja utilizando em projetos C# e .NET Core.
Adicionar análise do SonarCloud na Action de .NET Core
Eu não utilizei o arquivo que o SonarCloud sugeriu por um motivo simples: Ele usa Windows por padrão. E eu quero que os meus artefatos sejam produzidos e validados no Linux por isso grande parte do que vamos utilizar aqui é o mesmo que já foi fornecido pela SonarCloud, mas com as devida adaptações.
O script que o SonarCloud fornece possui algumas opções de caching que são interessantes, elas podem tornar o processo mais rápido, já que reaproveitam etapas já executadas. Por isso, vamos introduzir esse conteúdo no nosso arquivo:
Aqui entra a parte de teste e análise, que de fato tanto importa para nós.
A parte importante nesse trecho de código é o ${{ secretes.SONAR_TOKEN }}
. Lembra que no começo nós guardamos essa informação que o SonarCloud gerou para nós? É hora de utilizá-la! NÃO! Você não vai colar essa chave no seu arquivo. Para funcionar o CI corretamente, o GitHub implementou uma área no repositório chamada Secrets, onde todos os dados sensíveis podem ser armazenados. Entre eles, o nosso Token! Para acessar, você precisa ir até o seu repositório, clicar na aba Settings, e depois acessar o menu Secrets. Clique em New Secret para criarmos uma nova Secret com o nome SONAR_TOKEN
(ou qualquer outro que você preferir).
Nem você e nem ninguém jamais terá acesso ao conteúdo dessa secret novamente. E agora voltando ao nosso arquivo, ele deverá ficar assim:
Você pode criar dois Jobs: Um para análise e outro para o build (e quem sabe um terceiro para deploy). Porém isso ampliaria demais o contexto e a complexidade desse artigo.
Agora, quando você abrir um pull request
para a develop
ou fazer qualquer push
, o seu PR ficará decorado da seguinte maneira:
Mas claro, só se você tiver passado pelo code review, e voltando para o SonarCloud, o que nós temos todos os detalhes da análise do nosso código:
Nada mal mas ainda tem algumas coisinhas para melhorar... Esse exemplo que utilizei pode ser aplicado a demais linguagens mas obviamente você vai selecionar a Action que é completível com a mesma que está utilizando.
Fontes onde pesquisei esse conteúdo:
Top comments (1)
Probably I should also write my own blog... for those who does not feel comfy in send code to a 3rd party SonarCloud but still want to have a airgapped solution. Check out sonarless It has a cli for local scan + works in GitHub Action too. Essentially, it automates SonarQube install, setup and scanning on your local machine