GitHub Actions e SonarCloud - Validando o código
Tags: codequality, codereview, github, sonarcloud
Published: 2021-10-30 16:59:15

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](https://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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/63knb6y4nfvtxv5to2jc.png)
 
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hb082dstis5o8f0875jc.png)
 
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/st3phuqfn4u8kxdyd26a.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2sqmthhmf7wq229wq22i.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2xincpfzj00nb2zl3u3w.png)
 
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/15gni55tay8p21eehreh.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/79kjyccbfewznz2pwoiz.png)

### 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pede9ykq47xm7gds0yvr.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/62fxwxifcrian11wgacg.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h4hwcp219ktdcl1eftxy.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/81b6ogm5yi4d851br3q0.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bcms2ne7r16ca8zr5fua.png)

### 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1gdhy3g2pa8q84oy8sfb.png) 

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y884zo2sn5q0ze0zk7ju.png)
 
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mj5tjx05d2p94yr4tpid.png)
 
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9s8sqxab56brtrnle9so.png)
 

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

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b7g6eq64pcg0i6jwo4jy.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yjhfe4jxlz93n9t1v2og.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbq4lemi24o76vz71z3u.png)
 
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0y4qlxyx32rznqcgyvay.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lc8kx6ce0zudp3jjm7fn.png)

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:

- https://community.sonarsource.com/
- https://sonarcloud.io/
- https://sonarcloud.io/pricing
- https://sonarcloud.io/code-quality
- https://github.com/features/actions
- https://docs.github.com/pt/actions