Implantação de CI/CD com Jenkins

Guia detalhado para implementação de CI/CD utilizando Jenkins:

1. Instalação do Jenkins

1.1 Requisitos do ambiente

  • Java 8 ou 11 (recomenda-se JDK11)
  • Sistema operacional: Linux/Windows/macOS

1.2 Método de instalação (exemplo no Ubuntu)

# Instalação do Java
sudo apt install openjdk-11-jdk

# Adicionando o repositório do Jenkins
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'

# Instalação do Jenkins
sudo apt update
sudo apt install jenkins

# Iniciando o serviço
sudo systemctl start jenkins
sudo systemctl enable jenkins


Acesse http://<IPdoServidor>:8080 para concluir a configuração inicial.

2. Configurações básicas do Jenkins

2.1 Gerenciamento de plugins

  1. Após o login, vá para Manage Jenkins > Plugins
  2. Instale os plugins necessários:
  • Git Parameter
  • Pipeline
  • Docker
  • Blue Ocean
  • SSH Pipeline Steps
  • Plugins de repositório de código (GitHub/GitLab)

2.2 Configuração de ferramentas

Acesse Manage Jenkins > Global Tool Configuration

  • Adicione configurações de instalação automática para JDK, Maven, Gradle, etc.
  • Configure o caminho do Docker (padrão /usr/bin/docker)

3. Criação de Pipeline CI/CD

3.1 Novo tarefa Pipeline

  1. Crie novo Item > Selecione Pipeline
  2. Configure os parâmetros:
  • Construção parametrizada: adicione parâmetro de branch do Git
  • SCM: configure o endereço do repositório Git e credenciais
  • Gatilhos: configure Webhook ou builds agendados

3.2 Exemplo de configuração de Webhook (GitHub)

  1. Nas configurações do repositório GitHub, adicione Webhook:
  • URL do Payload: http://<url-jenkins>/github-webhook/
  • Tipo de conteúdo: application/json
  1. Na tarefa do Jenkins, configure o gatilho:
  • GitHub hook trigger for GITScm polling

4. Exemplo de script Pipeline (declarativo)

pipeline {
    agent any
    environment {
        REGISTRO_DOCKER = "registro.exemplo.com"
        VERSAO_PROJETO = "1.0.${BUILD_NUMBER}"
    }
    stages {
        stage('Checkout do código') {
            steps {
                git branch: 'main', 
                url: 'https://github.com/seurepositorio/aplicacao.git'
            }
        }
        stage('Compilação') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }
        stage('Testes') {
            steps {
                sh 'mvn test'
                junit '**/target/surefire-reports/*.xml'
            }
        }
        stage('Construção Docker') {
            steps {
                script {
                    docker.build("${REGISTRO_DOCKER}/app:${VERSAO_PROJETO}")
                }
            }
        }
        stage('Implantação em Staging') {
            when {
                branch 'main'
            }
            steps {
                sshagent(['servidor-staging']) {
                    sh """
                    scp target/*.jar usuario@staging:/app/
                    ssh usuario@staging "sudo systemctl restart app-service"
                    """
                }
            }
        }
        stage('Implantação em Produção') {
            when {
                expression { 
                    return env.BRANCH_NAME == 'main' && 
                    currentBuild.resultIsBetterOrEqualTo('SUCCESS') 
                }
            }
            steps {
                timeout(time: 15, unit: 'MINUTES') {
                    input message: 'Implantar em produção?', ok: 'Confirmar'
                }
                kubernetesApply(
                    kubeconfigId: 'cluster-producao',
                    configs: 'k8s/deployment.yaml'
                )
            }
        }
    }
    post {
        success {
            slackSend channel: '#ci-cd',
                     message: "Construção ${BUILD_NUMBER} bem-sucedida ✅"
        }
        failure {
            mail to: 'equipe@exemplo.com',
                 subject: "Falha na Construção ${BUILD_NUMBER}",
                 body: "Verifique o console de saída em ${BUILD_URL}"
        }
    }
}


5. Técnicas avançadas de implantação

5.1 Liberação Canary (Canary Release)

stage('Implantação Canary') {
    steps {
        script {
            // Implantando 10% do tráfego
            sh 'kubectl apply -f canary-deployment.yaml'
            sleep(time: 300, unit: 'SECONDS')  // Período de monitoramento
            // Decisão com base nos métricas
            if (metricasAPI.getTaxaErro() < 0.01) {
                sh 'kubectl apply -f full-deployment.yaml'
            } else {
                error "Implantação Canary falhou"
            }
        }
    }
}


5.2 Mecanismo de rollback automático

post {
    failure {
        script {
            if (currentStage == 'producao') {
                sshagent(['servidor-producao']) {
                    sh """
                    ssh usuario@prod "kubectl rollout undo deployment/app"
                    """
                }
            }
        }
    }
}


6. Recomendações de segurança

  1. Controle de acesso:
  • Use Controle de Acesso Baseado em Função (RBAC)
  • Crie grupos de usuários com diferentes níveis de permissão
  1. Gerenciamento de credenciais:
  • Use Jenkins Credentials para armazenar informações sensíveis
  • Restinja o escopo das credenciais
  1. Logs de auditoria:
  • Ative o plugin Audit Trail
  • Integre ELK para análise de logs

7. Otimização de desempenho

  1. Construção distribuída:
  • Adicione múltiplos nós Agent
  • Use o plugin Kubernetes para criar Pods dinamicamente
  1. Estratégia de cache:
  • Cache de dependências Maven/Gradle
  • Cache de camadas Docker
  1. Execução paralela:
stage('Testes Paralelos') {
    parallel {
        stage('Testes Unitários') {
            steps { sh './executar_testes_unitarios.sh' }
        }
        stage('Testes de Integração') {
            steps { sh './executar_testes_integracao.sh' }
        }
    }
}


8. Monitoramento e alertas

  1. Integração com Prometheus:
  • Instale o plugin Prometheus
  • Configure endpoints de métricas
  1. Painel do Grafana:
  • Monitorar taxa de sucesso de builds
  • Análise de tendências de duração de builds
  • Monitoramento de utilização de recursos

Solução de problemas comuns

  1. Builds travados:
  • Verifique as configurações de memória do Jenkins Master (JAVA_OPTS="-Xmx4g -XX:MaxRAMPercentage=70.0")
  • Verifique o espaço em disco (/var/lib/jenkins)
  1. Falha na conexão SSH:
  • Veriifque a configuração StrictHostKeyChecking em ~/.ssh/config
  • Valide o formato da chave SSH (deve ser formato PEM)
  1. Problemas de permissão do Docker:
# Adicionar usuário Jenkins ao grupo docker
sudo usermod -aG docker jenkins
sudo systemctl restart jenkins


Com estas etapas, você pode estabelecer um fluxo de CI/CD completo, adaptando as tarefas de cada fase conforme as necessidades do seu projeto. Recomenda-se combinar com cenários de negócio específicos para gradualmente aperfeiçoar testes automatizados, análise de segurança (SAST/DAST) e controles de qualidade.

Tags: Jenkins CI/CD devops Integração Contínua Entrega Contínua

Publicado em 6-8 18:15 por Thomas