Pipeline CI/CD com Terraform|AWS|Jenkins|SonarQuber|Gitlab|Golang

ivan amado
8 min readJan 7, 2024

Introdução

Usando o Terraform para provisionar a infraestrutura necessária na AWS, como instâncias EC2, grupos de segurança,IP Elático.

O Jenkins é usado para automatizar o processo de CI/CD, permitindo a construção, testes e implantação contínuos do aplicativo.

O SonarQube é uma ferramenta de análise estática de código que ajuda a identificar problemas de qualidade e vulnerabilidades no código.

GitLab é uma plataforma de controle de versão que permite o gerenciamento do código-fonte do projeto.

Nesse artigo, será descrito o processo de configuração dessas ferramentas, como criar e configurar o ambiente na AWS usando o Terraform, configurar o Jenkins para executar pipelines, integrar o SonarQube para análise de qualidade do código e o GitLab como repositório de código. também será explicado como configurar os estágios do pipeline, como construção, testes e implantação, e como automatizar o processo de CI/CD.

O código deste tutorial estará disponível no meu gitHub.

Pre-requisitos

1-Conta AWS

2-Terraform instalado e configurado

3-AWS CLI Instalado e configurado.

Objetivo:

1- Provisionar a infraestrutura com Terraform na AWS

-EC2 t2.micro para o jeankins
-EC2 t2.small para sonarqube
-EC2 t2.micro a aplicação em docker-Golang

2- processo de configuração e integração das ferramentas

- jenkins
- gitlab
- SonarQuber
-Pipeline in Application Golang

1-Provisionando a Infraestrutura com Terraform.

  • modules: Este diretório contém os módulos Terraform para diferentes componentes do pipeline. Cada módulo tem seu próprio conjunto de arquivos Terraform (main.tf, variables.tf, outputs.tf) que definem os recursos e configurações para esse componente.
  • data: Este diretório contém scripts de shell que são usados para configurar os serviços Jenkins e SonarQube nas instâncias EC2. Esses scripts são referenciados nos arquivos main.tf dos módulos correspondentes.

Arquivo main

terraform {
required_version = ">=1.5.4"
required_providers {
aws = ">= 5.11.0"
local = ">=2.4.0"
}
backend "s3" {
bucket = "my-bucket-pipeline-ci-cd"
key = "terraform-pipeline.tfstate"
region = "us-east-1"
}
}

provider "aws" {
region = "us-east-1"
}

module "new-vpc" {
source = "./modules/new_vpc"
prefix = var.prefix
vpc_cidr_block = var.vpc_cidr_block
}

module "aws_key_pair" {
source = "./modules/aws_key_pair"
namespace = var.namespace

depends_on = [
module.new-vpc
]
}
module "ec2_docker" {
source = "./modules/ec2_docker"
vpc_id = module.new-vpc.vpc_id
subnet_ids = module.new-vpc.subnet_ids
key_name = module.aws_key_pair.key_name
depends_on = [
module.new-vpc
]

}
module "ec2_jenkins" {
source = "./modules/ec2_jenkins"
vpc_id = module.new-vpc.vpc_id
subnet_ids = module.new-vpc.subnet_ids
key_name = module.aws_key_pair.key_name
depends_on = [
module.new-vpc
]

}
module "ec2_sonarquber" {
source = "./modules/ec2_sonarquber"
vpc_id = module.new-vpc.vpc_id
subnet_ids = module.new-vpc.subnet_ids
key_name = module.aws_key_pair.key_name
depends_on = [
module.new-vpc
]
}

O arquivo main.tf na raiz do projeto é o ponto de entrada principal para o Terraform. Ele define os recursos que serão criado e gerenciado.

  1. terraform: Este bloco define a versão do Terraform necessária para executar este código. Também define o backend onde o estado do Terraform será armazenado.
  2. provider "aws": Este bloco define o provedor que o Terraform usará para criar e gerenciar recursos. Neste caso, é o provedor AWS.
  3. module "new-vpc": Este bloco define um módulo chamado new-vpc. Um módulo é uma coleção de recursos relacionados que são agrupados juntos para facilitar a reutilização e a organização do código. Este módulo cria uma nova VPC na AWS.
  4. module "aws_key_pair": Este bloco define um módulo chamado aws_key_pair. Este módulo cria um par de chaves SSH na AWS.
  5. module "ec2_docker", module "ec2_jenkins", module "ec2_sonarquber": Estes blocos definem módulos que criam instâncias EC2 para Docker, Jenkins e SonarQube, respectivamente. Cada módulo depende do módulo new-vpc e aws_key_pair, o que significa que esses módulos devem ser criados primeiro.

Em resumo, este arquivo main.tf está definindo a infraestrutura do projeto, que inclui uma VPC, um par de chaves SSH e três instâncias EC2 para Docker, Jenkins e SonarQube.

Link do git com a infra estrutura.

Inicializando os módulos

terraform init
terraform validate
terraform plan
terraform apply

Se tudo ocorrer bem 3 instâncias EC2 serão criadas.

2-Instalação do jenkins em uma instancia EC2

2.1 acessar a instacia ec2_jenkins

ssh -i caminho_key.pem ubuntu@ip_publico

execute o seguinte código :

setar o nome do host

sudo hostnamectl set-hostname jenkins
/bin/bash
sudo apt update

sudo apt install openjdk-11-jre
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null



sudo apt-get update

sudo apt-get install jenkins

systemctl status jenkins

2.2 Configurando Jeankins

-acesse o servidor jeankins

acessar a url http//:Ip_public_instacia_ec2:8080

2.3 -Em seguida, copie a senha do administrador

sudo cat /var/lib/jeankins/secrets/initialAdmin/Password

2.3- Instalando Plugin Sugeridos

2.3-Criando o Primeiro usuário Administrativo

2.4-inserindo a url do jeankins

http://ip-public-ec2:8080/

clique em gravar e continuar

2.5-Instalando o plugin Pipeline

  • Inicie o Jenkins e vá para Gerenciar Jenkins -> Gerenciar Plugins -> Disponível

2.6-Instalar SonarQuber Scanner

Assim que a reinicialização for concluída, você deve configurar o Sonar Scanner, que é uma ferramenta autônoma usada para escanear o código-fonte e enviar o resultado ao servidor SonarQube. Aqui você irá instalá-lo no próprio servidor Jenkins, embora possa lançar um contêiner separado para a mesma finalidade.

  • Abra o Jenkins e vá para o painel principal.
  • No menu à esquerda, clique em “Gerenciar Jenkins” e, em seguida, em “Gerenciar Plugins”.
  • Vá para a guia “Disponíveis” e pesquise por “SonarQube Scanner”.
  • Marque a caixa de seleção ao lado do plugin “SonarQube Scanner for Jenkins” e clique em “Instalar sem reinicialização”.

3-Instalação do SonarQube em uma instância EC2

Para instar instalar o sonarQuber siga o passo a passo desse post:

3.1-Configure SonarQube on Ubuntu 22.04 LTS

acessee o servidor sonarquber

http://ip-dainstacia-ec2:9000

3.2-mudar a senha padrão

4-COFIGURAÇÃO JENKINS/SONARQUBER/GITLAB

4.1-Gerando token no SonarQuber

Faça login no painel do SonarQube e vá para a guia Administrador. No menu suspenso Security, selecione a guia User conforme mostrado na imagem abaixo:

clica em update token. Guarde o Token gerado para ser usado futuramente.

4.2-Criação do repositório no Gitlab

para criar um repositório no gitlab você pode seguir as instruções do link a baixo:

repositório utilizado no pipeline:

4.3-Gerando Token do GitLab

Para estabelecer uma conexão entre GitLab e Jenkins, novamente, precisamos gerar um token de acesso.

Para gerar um token de acesso, vá para o painel do GitLab e siga Painel > Configuração > Tokens de acesso no GitLab.

Depois de ter o token com você, copie-o para uso posterior.

4.5- Integrando SonarQube e GitLabs no Jenkins

Este guia pressupõe que você já tenha feito a configuração básica do Jenkins. Agora, vamos configurar o GitLab e o SonarQube no servidor Jenkins.

4.6-Instalar o sonar scanner na instância do jeankins

acesse o servidor do jeankins via ssh

ssh -i sshkey-key.pem ubuntu@3.231.55.218

e execute o código a baixo :

cd /var/jenkins_home 
$wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.2.0.1873-linux.zip
unzip sonar-scanner-cli-4.2.0.1873-linux.zip

4.7-Criar Webhook no sonarQuber

Como Jenkins e SonarQube estão sendo executados em servidores separados, precisamos criar um Webhook no servidor SonarQube para que ambos possam se comunicar.

Para fazer isso no servidor SonarQube, siga Dashboard > Administrador > Configuração > Webhook:

E adicione a url do jenkins

4.8-Ensira o token gerado no servidor sonarQuber no jeankins

http://your-ip-addr-here:8080/credentials/store/system/

Ou vá em Dashboard > Credentials > System

4.9-Adicione o servidor SonarQube ao seu ambiente Jenkins.

Vá para Painel > Gerenciar Jenkins > Configurar Sistema.

Encontre o servidor SonarQube na página e adicione os detalhes necessários conforme mencionado abaixo:

4.10-adicionar o token do gitLab no jenkins

Agora, você precisa adicionar o Gitlab no Jenkins, visite Dashboard > Credentials > System. Aqui, você adicionará o token de acesso criado anteriormente ao seu servidor Jenkins

4.11-adicionando gitLab no jenkins

O Jenkins já está pronto para executar pipelines, integrado com o SonarQube para análise de qualidade do código e o GitLab como repositório de código.

Próximo passo e implementar o Pipeline no jeankins utilizando uma pequena aplicação em golang armazenado no gitlab esse passo a passo será feito em uma segunda parte do Artigo segue o link da parte 2 .

--

--