Construa Seu Primeiro Pipeline Declarativo Jenkins para CI/CD

Construa um primeiro Pipeline Declarativo Jenkins com estágios, agentes, checkout, testes, portões de implantação, credenciais e ações pós.

Construa Seu Primeiro Pipeline Declarativo Jenkins para CI/CD

Seu primeiro Pipeline Declarativo Jenkins deve responder a uma pergunta prática: o Jenkins pode verificar seu código, compilá-lo, testá-lo e executar etapas de implantação apenas quando a branch correta passar? Um Jenkinsfile fornece esse fluxo de trabalho como código no mesmo repositório do seu aplicativo.

A sintaxe declarativa é um bom ponto de partida porque fornece uma estrutura previsível: pipeline, agent, stages, steps e post.

Entendendo a Estrutura do Pipeline Declarativo

O Pipeline Declarativo define todo o fluxo de trabalho em um arquivo chamado Jenkinsfile, que é armazenado junto com o código do seu aplicativo no repositório SCM (por exemplo, Git). Essa prática é conhecida como Pipeline as Code.

Elementos Centrais de um Pipeline Declarativo

Um Pipeline Declarativo deve conter os seguintes blocos de nível superior:

  1. pipeline: O bloco mais externo obrigatório que define o conteúdo do pipeline.
  2. agent: Especifica onde o pipeline ou um estágio específico será executado (por exemplo, any, none ou rótulos específicos).
  3. stages: Contém um ou mais blocos stage sequenciais.
  4. stage: Define um bloco conceitual de trabalho (por exemplo, Build, Test, Deploy).
  5. steps: Contém um ou mais comandos ou funções executados dentro de um stage.
pipeline {
    agent any 
    environment { // Opcional: Define variáveis de ambiente
        APP_VERSION = '1.0.0'
    }
    stages {
        stage('Build') {
            steps {
                // Comandos vão aqui
            }
        }
    }
    post { // Opcional: Ações executadas após a conclusão do pipeline
        always { 
            echo 'Pipeline finalizado.' 
        }
    }
}

Passo 1: Configurando o Job Jenkins

Para executar um Pipeline a partir do código, você precisa configurar um job Jenkins para ler o Jenkinsfile do seu repositório.

  1. Navegue até o painel do Jenkins e selecione New Item.
  2. Digite um nome para o seu pipeline (por exemplo, my-first-ci-pipeline).
  3. Selecione o tipo de item Pipeline e clique em OK.
  4. Na página de configuração, role para baixo até a seção Pipeline.
  5. Altere a definição de Pipeline script para Pipeline script from SCM.
  6. Selecione seu SCM (por exemplo, Git).
  7. Digite a Repository URL e configure suas credenciais, se necessário.
  8. Certifique-se de que o Script Path esteja definido como Jenkinsfile (o padrão).

Passo 2: Definindo o Jenkinsfile para CI/CD

Criaremos um Jenkinsfile abrangente que simula um fluxo de trabalho CI/CD simples, integrando estágios padrão para uma implantação bem-sucedida.

Suponha que você tenha uma estrutura de repositório contendo o código-fonte do seu aplicativo (por exemplo, um projeto Python ou Java simples) e o Jenkinsfile na raiz.

Exemplo Completo de Pipeline Declarativo

Este pipeline usa o agente node (se configurado) e utiliza etapas básicas de shell (sh) para simular trabalho real. O estágio de implantação é condicional, executando apenas após a conclusão bem-sucedida dos estágios anteriores.

// Jenkinsfile
pipeline {
    // 1. Definição do Agente: Especifica onde todo o pipeline será executado
    agent { 
        label 'my-build-agent' // Use um rótulo específico se disponível, ou 'any'
    }
    
    // 2. Variáveis de Ambiente: Define variáveis utilizáveis em todo o pipeline
    environment {
        CONTAINER_REGISTRY = 'registry.example.com'
        IMAGE_NAME = 'myapp'
    }
    
    stages {
        
        // Estágio 1: Checkout (Gerenciamento de Código Fonte)
        stage('Checkout Source') {
            steps {
                // O passo 'checkout scm' verifica automaticamente o código
                // com base na configuração definida nas configurações do job Jenkins.
                checkout scm
                sh 'echo "Código fonte verificado com sucesso."'
            }
        }
        
        // Estágio 2: Compilar Artefatos
        stage('Build Artifact') {
            steps {
                sh 'echo "Iniciando compilação para $IMAGE_NAME:$BUILD_ID"'
                // Simulação: Compilar uma imagem Docker ou um arquivo jar/war
                sh "docker build --label build_id=${BUILD_ID} -t ${CONTAINER_REGISTRY}/${IMAGE_NAME}:${BUILD_ID} ."
            }
        }
        
        // Estágio 3: Testes e Portões de Qualidade
        stage('Run Tests') {
            steps {
                sh './run_unit_tests.sh'
                sh 'echo "Executando testes de integração..."'
                // Exemplo de coleta de resultados de teste (requer plugins apropriados)
                // junit '**/target/surefire-reports/*.xml'
            }
        }
        
        // Estágio 4: Implantação (Condicional)
        stage('Deploy to Staging') {
            // A diretiva 'when' garante que o estágio seja executado apenas sob condições específicas
            when {
                branch 'main'
            }
            steps {
                sh "docker push ${CONTAINER_REGISTRY}/${IMAGE_NAME}:${BUILD_ID}"
                sh 'kubectl apply -f k8s/deployment-staging.yaml'
                script {
                    // Blocos script permitem lógica Groovy tradicional dentro de etapas declarativas
                    echo "Implantação bem-sucedida no ambiente de Staging."
                }
            }
        }
    }
    
    // 3. Ações Pós: Define ações com base no status final do pipeline
    post {
        success {
            echo 'Pipeline concluído com sucesso. Notificando equipe via Slack...'
            // slackSend channel: '#devops-alerts', message: 'CI/CD Success!'
        }
        failure {
            echo 'Pipeline falhou. Revise os logs para erros.'
        }
        cleanup {
            sh 'docker image prune -f --filter "label=build_id=$BUILD_ID"'
        }
    }
}

Passo 3: Executando e Monitorando o Pipeline

Assim que o Jenkinsfile for commitado e enviado para a branch configurada no seu job Jenkins:

  1. Na página do job Jenkins, clique em Build Now (ou aguarde o polling SCM/disparo do webhook).
  2. Monitore a compilação no painel Build History.
  3. Clique no número da compilação em execução e selecione Console Output para visualizar os detalhes da execução passo a passo.
  4. Você também pode usar a visualização Stage View (se o plugin estiver instalado) para ver o progresso dos estágios Checkout, Build, Test e Deploy graficamente.

Melhores Práticas e Recursos Avançados

Utilizando Bibliotecas e Código Compartilhado

Para etapas complexas ou altamente repetitivas, evite escrever Groovy verboso diretamente no Jenkinsfile. Em vez disso, use Shared Libraries. Essas bibliotecas externas permitem definir funções comuns (como rotinas padrão de implantação ou funções de notificação) que podem ser chamadas de vários pipelines, tornando seu Jenkinsfile mais limpo.

// Chamando um passo de biblioteca compartilhada
stage('Custom Setup') {
    steps {
        customLibrary.initializeEnvironment(env: 'prod')
    }
}

Trabalhando com Credenciais

Nunca codifique informações sensíveis (senhas, tokens, chaves de API) diretamente no Jenkinsfile. Use o sistema integrado de Gerenciamento de Credenciais do Jenkins.

O passo withCredentials permite acessar segredos armazenados de forma segura:

stage('Authenticate Registry') {
    steps {
        withCredentials([usernamePassword(credentialsId: 'docker-registry-creds', 
                                          passwordVariable: 'PASS', 
                                          usernameVariable: 'USER')]) {
            sh '''
                printf '%s' "$PASS" | docker login \
                  --username "$USER" \
                  --password-stdin "$CONTAINER_REGISTRY"
            '''
        }
    }
}

Seleção de Agente

Dica: Sempre defina seu agent especificamente usando um label em vez de agent any. Usar agent any significa que o pipeline pode ser executado no nó controlador do Jenkins, o que é um risco de segurança e pode impactar o desempenho do controlador. Certifique-se de ter agentes Jenkins (nós) configurados adequadamente com as ferramentas necessárias (Docker, Maven, Node.js) instaladas.

Conclusão

Mantenha o primeiro pipeline simples e confiável: escolha um rótulo de agente real, verifique o código, compile, teste, controle a implantação por branch e mantenha segredos nas credenciais do Jenkins. Depois que isso funcionar, adicione publicação de artefatos, varredura de segurança e promoção de ambiente um passo de cada vez.