Pipeline CI/CD com Terraform|AWS|Jenkins|SonarQuber|Gitlab|Golang
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 arquivosmain.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.
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.provider "aws"
: Este bloco define o provedor que o Terraform usará para criar e gerenciar recursos. Neste caso, é o provedor AWS.module "new-vpc"
: Este bloco define um módulo chamadonew-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.module "aws_key_pair"
: Este bloco define um módulo chamadoaws_key_pair
. Este módulo cria um par de chaves SSH na AWS.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ódulonew-vpc
eaws_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
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 .