DEV Community

Jhony Walker
Jhony Walker

Posted on

GitHub Actions e SonarCloud - Validando o código

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.

Vinculando Sonar com sua conta no Github

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...

Tela Inicial

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.

Selecionando projetos

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.

Vinculando com 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.

Token

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.

Arquivo de exemplo de workflow .NET

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.

SonarCloud My Projects

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

Selecionando 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.

General Settings

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.

Image description

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)

Image description

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.

Image description

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 ‘**’.

Image description

Os demais pontos são autoexplicativos, mas ainda quero te chamar atenção para:

Image description

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:

Image description

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:

Image description

Aqui entra a parte de teste e análise, que de fato tanto importa para nós.

Image description

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).

Image description

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:

Image description

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:

Image description

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:
Image description

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:

Discussion (0)