Sobes.tech
Junior

Fala sobre as principais etapas de CI/CD.

sobes.tech IA

Resposta da IA

Conceitualmente, o CI/CD divide-se em duas fases principais:

  1. Integração Contínua (CI):

    • Commit (Confirmação de alterações): Os desenvolvedores confirmam alterações num repositório de código comum (por exemplo, Git).
    • Build (Construção): A construção da aplicação a partir do código fonte é iniciada automaticamente.
    • Test (Testes): São executados testes automatizados (unitários, de integração, analisadores estáticos).
  2. Entrega/Implantação Contínua (CD):

    • Deploy em Staging: O artefato construído e testado com sucesso é implantado num ambiente intermédio (Stage), que simula produção.
    • Testes de aceitação automatizados: São realizados testes de aceitação automatizados em Stage para verificar a lógica de negócio.
    • Testes manuais/Exploratórios: São realizados testes manuais em Stage, se necessário.
    • Deploy em Produção: Após passar por todas as etapas anteriores, o artefato é implantado em produção. Em Deployment Contínuo, esta etapa é totalmente automatizada. Em Entrega Contínua, pode ser necessária confirmação manual.
    • Monitorização e feedback: Após o deploy, monitora-se o funcionamento em produção para identificar problemas e recolher feedback.

Aqui um exemplo de pipeline no Jenkinsfile:

// Jenkinsfile
pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                sh 'mvn clean install -DskipTests' // Exemplo de build Maven, pulando testes nesta fase
            }
        }
        stage('Test') {
            steps {
                sh 'mvn test' // Execução de testes unitários e de integração
            }
            post {
                always {
                    junit '**/TEST-*.xml' // Publicação dos resultados de testes
                }
            }
        }
        stage('Static Analysis') {
           steps {
               sh 'mvn sonar:sonar' // Exemplo de análise estática com SonarQube
           }
        }
        stage('Build Docker Image') {
            steps {
                script {
                    docker.build("my-app:${env.BUILD_NUMBER}") // Construção da imagem Docker com a tag do número de build
                }
            }
        }
        stage('Deploy to Stage') {
            steps {
                sh 'ssh user@stage-server "deploy_script.sh my-app:${env.BUILD_NUMBER}"' // Exemplo de deploy em Stage via SSH
            }
        }
        stage('Acceptance Tests') {
            steps {
                sh 'run_acceptance_tests.sh' // Execução de testes de aceitação automáticos em Stage
            }
        }
        stage('Deploy to Production') {
            when {
                environment name: 'CONTINUOUS_DEPLOYMENT', value: 'true' // Condição para deploy automático em Production
            }
            steps {
                sh 'ssh user@prod-server "deploy_script.sh my-app:${env.BUILD_NUMBER}"' // Deploy em Production
            }
        }
        stage('Manual Approval for Production') { // Esta etapa pode ser incluída na Entrega Contínua
           when {
              environment name: 'CONTINUOUS_DEPLOYMENT', value: 'false'
           }
           steps {
             input message: 'Deploy to Production?', ok: 'Deploy Now'
             sh 'ssh user@prod-server "deploy_script.sh my-app:${env.BUILD_NUMBER}"'
           }
        }
    }
    post {
        failure {
            mail to: 'devops@example.com', subject: "Build ${env.BUILD_NUMBER} Failed", body: "Build failed for ${env.JOB_NAME}" // Notificação de falha
        }
        success {
            mail to: 'devops@example.com', subject: "Build ${env.BUILD_NUMBER} Succeeded", body: "Build succeeded for ${env.JOB_NAME}" // Notificação de sucesso
        }
    }
}

Principais diferenças entre Entrega Contínua e Implantação Contínua:

Característica Entrega Contínua Implantação Contínua
Desploy em Produção Requer confirmação manual Totalmente automatizado
Frequência de deploys Pode fazer deploy frequentemente O deploy ocorre a cada mudança bem-sucedida
Estabilidade Alta, mas com controlo manual Máxima, com testes automatizados adequados
Riscos Menores devido ao controlo manual Maiores, mas reduzidos por testes abrangentes

Cada etapa do pipeline deve ser automatizada e realizar sua tarefa específica.