Jenkins e SonarQube para simulações do entorno

Jenkins e SonarQube para simulações do entorno

Resolver problemas é parte inerente da rotina de um desenvolvedor de software, seja na escrita de códigos para features descritas em novas regras de negócio, otimização de código legado, ou ainda refatoraração de estruturas existentes. Para garantir a qualidade na resolução destes problemas, é natural e imprescindível que o desenvolvedor escreva testes, visando aumentar a confiabilidade da solução proposta, entregando ao ambiente de produção software com risco reduzido de falhas operacionais e alta satisfação dos utilizadores.

Desde o código escrito e funcional na máquina do desenvolvedor, até aquilo que os usuários têm acesso como produto, existe um caminho a ser trilhado. Compilação do código, validação dos casos de teste (sejam unitários e/ou de integração), validação em ambiente de qualidade e só então a disponibilização do produto.

Dito isto, o objetivo deste artigo é explicar como combinar o Jenkins com o SonarQube em um ambiente local de desenvolvimento.

  • Jenkins é uma ferramenta que auxilia os desenvolvedores no processo de CI (do inglês Continuous Integration – Integração Contínua), e garante que cada incremento de código seja integrado, testado e então implantado;
  • SonarQube é uma ferramenta que visa avaliar a qualidade do código fonte em desenvolvimento, por meio de checagem de complexidade, duplicidade de código, entre outras métricas;

OBS.: Como pré-requisito para execução dos passos descritos no artigo é necessário ter o Docker instalado. Para validar o funcionamento do ambiente configurado, este projeto pode ser utilizado (trata-se de uma API REST simples escrita em Java com Maven+SpringBoot).

Problemática

Um bom código não é apenas aquele que compila, executa e funciona. Em aplicações de mercado ele deve ser de fácil manutenibilidade, coberto por testes, com baixa complexidade, alta confiabilidade e segurança... Parece muita coisa para abordar, não é mesmo? Mas calma! Existe uma maneira automatizada para fornecer aos desenvolvedores análise para estes pontos durante o processo Integração Contínua. Vamos falar sobre isso neste artigo logo abaixo.

Solução

Conforme descrito anteriormente, é necessário possuir o Docker instalado para implementar a solução proposta. Com isto feito, vamos botar a mão na massa:

Configurações a nível de Container

1) Execute o container do SonarQube:

2) Execute o Jenkins no Docker com o seguinte comando:

OBS.: Para facilitar os testes e evitar de ter que enviar commits para o repositório remoto (push para o GitHub, por exemplo), toda vez que uma alteração de for executada, o diretório do workspace no qual o projeto teste está clonado está sendo montado como volume no container do Jenkins, adicionado de uma opção as variáveis de ambiente que permite ao Jenkins fazer uso do checkout de repositórios locais.

3) Configure o sonar-scanner-client no Jenkins:


Configurações a nível de Interface Gráfica

Com os containers rodando e devidamente configurados, vamos as configurações de interface, começando pelo SonarQube:

SonarQube

1) Acesse o endereço do SonarQube (http://localhost:9000/) e efetue o login com usuário admin e senha admin. Na sequência redefina sua senha, conforme solicitado:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

2) Selecione o menu “My account”, no canto superior direito:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

3) Selecione o submenu security e gere um token para utilização do Jenkins, com os seguintes parâmetros:

Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

4) Copie o valor do token gerado, clicando em copy. Salve ele em um lugar para que ele possa ser copiado e utilizado no futuro:

Interface gráfica do usuário

Descrição gerada automaticamente

5) Crie um webhook para o Jenkins utilizar, clicando em Administration -> Configuration -> Webhooks:

Interface gráfica do usuário

Descrição gerada automaticamente

6) Na tela seguinte, clique em create e informe os seguintes parâmetros – importante frisar que na URL o valor informado não pode ser localhost, e sim o valor do IP local:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente


Jenkins

As próximas configurações serão feitas no Jenkins:

1) Acesse o endereço do Jenkins (http://localhost:8080/). Utilize aqui o valor reservado na etapa de configuração do container do Jenkins:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

2) Instale os plugins sugeridos, clicando em “Install suggested plugins”; e aguarde que a instalação seja finalizada.

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

3) Na próxima tela você pode clicar em “Skip and continue as admin”, se preferir:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

4) Configure a URL do Jenkins como desejar – eu costumo assumir os valores sugeridos – e após isso, clique em “Save and Finish”:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

5) Com tudo pronto, basta clicar em “Start using Jenkins”. Lembrando que, caso você não tenha criado seu próprio usuário administrativo, a senha do usuário admin é a mesma que foi reservada na etapa de configuração do container do Jenkins e utilizada no primeiro acesso:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

Agora vamos adicionar o token de acesso criado no SonarQube ao Jenkins. Isto permitirá que as informações geradas no processo de construção do projeto sejam enviadas para análise no SonarQube.

6) Para isso, no menu esquerdo clique em “Gerenciar Jenkins”:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

7)  Em seguida, “Manage Credentials”:

Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

8) Na tabela “Stores scoped to Jenkins”, clique no item “System” (ao lado do ícone).

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente


9) Na tabela System, clique sobre “Global Credentials (unrestricted)”:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

10) E por último em “Add Credentials”:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

11) Preencha os dados da do formulário New credentials com os seguintes valores: Kind -> Secrete text, Scope -> Global, Secret -> valor do secret criado no SonarQube, ID -> JenkinsTokenSonar, Description -> Jenkins Token Sonar.

12) Retornando ao passo 6, clique em Gerenciar Extensões:

Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

13) No menu esquerdo da tela de Plugins, clique em “Available Plugins” e na barra de busca, informe o valor “SonarQube Scanner”. Selecione o checkbox instalar e clique no botão “Instalar sem reiniciar”:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

14) Quando o download for finalizado, volte ao passo 6 e clique em “Ferramenta de configuração global”:

Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

15) Navegue até a seção SonarQube Scanner e clique em “Adicionar SonarQube Scanner”:

Interface gráfica do usuário, Aplicativo, Teams

Descrição gerada automaticamente

16) Preencha o formulário com os seguintes valores: Name: sonarqube, desmarque o checkbox “Instalar automaticamente” e preencha o campo SONAR_RUNNER_HOME com o valor /var/jenkins_home/sonar-scanner/sonar-scanner-4.7.0.2747-linux. Finalize clicando em “save”:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

17) Volte ao passo 6 e clique em “Configurar o sistema”:

Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

18) Navegue até SonarQube servers clique em “Add SonarQube”, preencha os valores Name -> sonarqubeserver e Server URL -> o valor informado não pode ser localhost, e sim o valor do IP local. Para o campo Server authentication token selecione o valor criado “Jenkins Token Sonar”. Isto feito, clique em salvar:

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente


Integração concluída

Com todos os passos executados, a integração entre Jenkins e SonarQube está concluída. Cada projeto no Jenkins deverá ter seu próprio Job e cada Job deverá ser configurado respeitando as particularidades de build da linguagem de programação na qual o código foi desenvolvido.

Os passos a seguir são opcionais e servem para demonstrar o funcionamento do processo de build e integração com SonarQube de um projeto escrito em Java com Maven+SpringBoot. O projeto está pronto e pode ser clonado a partir da URL: https://github.com/kckoerich/simple-test-project.

Jenkins + Maven

Para o build de projetos Java que utilizam Maven, são necessárias algumas configurações adicionais no Jenkins – relacionadas a configuração do JDK (Java Development Kit) e do Maven (Gerenciador de Dependências e Builds), utilizados no processo de construção automatizado em um Job. Primeiramente, configure o JDK.

1) Tomando como referência a etapa 6 dos passos descritos anteriormente, clique em “Gerenciar Jenkins” e em seguida, em “Ferramenta de configuração global”:

Interface gráfica do usuário, Aplicativo, Site

Descrição gerada automaticamente

2) Navegue até a seção JDK, clique em adicionar JDK, preencha o campo nome com o valor Java, selecione a versão Java SE Development Kit 8u221, marque o checkbox “Eu concordo com a licença do Java SE Development”. É necessário ter uma conta Oracle para instalar o JDK. Com seu usuário e senha, faça login na conta clicando em “Por favor informe seu usuário/senha”. Na tela a seguir, preencha seus dados e clique em OK. Ao retornar para a Seção JDK, clique em Save, para confirmar a instalação:

3)

Interface gráfica do usuário, Texto, Aplicativo, Email

Descrição gerada automaticamente

Em seguida, configure o Maven:

  1. Tomando como referência o passo 1 descrito na seção de configuração do JDK, clique em “Gerenciar Jenkins” e em seguida, em “Ferramenta de configuração global”.
  2. Navegue até a seção Maven, clique em adicionar Maven, preencha o campo nome com o valor Maven, marque o checkbox “Instalar Automaticamente”, selecione a versão 3.8.6; por último, clique em Save:
Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

Agora que o Jenkins está configurado para construir projetos Java utilizando Maven, iremos criar um Job que irá realizar a etapa de build para o projeto simple-test-project. O projeto deverá ser clonado no diretório $PATH_TO_WORKSPACE, montado no container do Jenkins como volume, na etapa de configuração do container. No meu caso o diretório de workspaces é /Users/kckoerich/Development/workspaces. Programaticamente, tomando meu caso como exemplo, eu teria:

# navegando até o diretório de workspaces montado no container do Jenkins

cd /Users/kckoerich/Development/workspaces/java


# clonando o projeto

git@github.com:kckoerich/simple-test-project.git

Com o projeto clonado, vamos configurar o Job

1) Para isso, na tela inicial do Jenkins, clique em “Create a job”:

Interface gráfica do usuário, Aplicativo, Teams

Descrição gerada automaticamente



2) Na tela de configuração do Job, preencha o campo nome com o valor simple-test-project, selecione a opção Pipeline e clique em OK (tudo certo):

Interface gráfica do usuário, Texto, Aplicativo

Descrição gerada automaticamente

3) Na tela seguinte, navegue até a seção Pipeline, em definition selecione “Pipeline script from SCM”. Em SCM selecione GIT e na subseção Repository URL informe o valor file:///var/workspaces/java/simple-test-project. Após isso, clique em salvar:

Tela de computador com texto preto sobre fundo branco

Descrição gerada automaticamente

Isto feito, o Job para construir o projeto no Jenkins está finalizado. Agora é necessário criar um projeto no SonarQube, para que, durante o processo de build do Pipeline do Jenkins, o projeto alcance o SonarQube e publique os relatórios gerados durante o build. Para isso, acesse http://localhost:9000:

1) Na tela principal do SonarQube, selecione a criação de um projeto clicando em Manually:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente

2) Preencha o campo Project display name com o valor simple-test-project e finalize clicando em Set Up:

Interface gráfica do usuário, Texto

Descrição gerada automaticamente



Agora vamos voltar ao nosso Job e testar sua execução do build e integração com o SonarQube! Para isto, confira os passos abaixo:

1) Acesse a URL http://localhost:8080/job/simple-test-project/ e no menu lateral esquerdo clique em construir agora:

Interface gráfica do usuário, Aplicativo

Descrição gerada automaticamente



2) A primeira execução irá demorar um pouco, pois o Jenkins precisa baixar todas as dependências do projeto. Quando o build finalizar, a última mensagem do log deve ser “Finished: SUCCESS”:

Interface gráfica do usuário

Descrição gerada automaticamente

Ao acessar o SonarQube na URL do projeto (http://localhost:9000/dashboard?id=simple-test-project) é possível visualizar todas as informações associadas as métricas captadas durante o processo de compilação. Existe um universo grande de informações associadas a Débito Técnico, Confiabilidade, Segurança, Manutenibilidade, Cobertura de Testes, Duplicação de Código, Tamanho, Complexidade etc:

Interface gráfica do usuário, Texto

Descrição gerada automaticamente

Além das informações configuradas por padrão, é possível customizar o que e como se deseja fazer as análises. Mas isso é pauta para uma outra conversa!

Conclusão

O processo de automatização de builds proposto pelo Jenkins torna a construção do código incrementado mais suave e enxuto. Durante o processo de construção executado no pipeline do projeto, estatísticas são fornecidas ao SonarQube, para que nele sejam feitas análises de informações associadas a diversos aspectos do código (tais como: Confiabilidade, Segurança, Cobertura de Testes, etc.), que podem ser customizadas conforme os parâmetros que se deseja analisar.

Apesar de ser um artigo extenso, com uma série de configurações, é positivo pensar que elas serão executadas apenas uma vez e fornecerão informações preciosas sobre o produto desenvolvido durante todo o seu ciclo de vida. Imagine você, a cada incremento de código ter que se preocupar em analisar cada um dos parâmetros cobertos pelo ambiente integrado de qualidade!? Humanamente inviável em diversos aspectos.

⚠️
As opiniões e comentários expressos neste artigo são de propriedade exclusiva de seu autor e não representam necessariamente o ponto de vista da Revelo.

A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.Jueves, 5 de enero