// ============================================================ // JENKINSFILE — Definição do Pipeline CI/CD // ============================================================ // Este arquivo é o coração do CI/CD. Ele descreve, em código, // TODAS as etapas que o Jenkins deve executar quando você faz // um "git push". // // Conceito: "Pipeline as Code" — o pipeline é versionado junto // com o código da aplicação. Se alguém perguntar "como o deploy // funciona?", a resposta está aqui. // // SINTAXE: Groovy (linguagem do Jenkins). Não precisa saber // Groovy — a estrutura é declarativa e autoexplicativa. // ============================================================ pipeline { // "agent any" = executa em qualquer worker disponível. // No nosso lab, só temos um (o próprio SRVJENKINS). agent any // Variáveis de ambiente disponíveis em todos os stages environment { REGISTRY = '10.15.1.211:5000' // Docker Registry (roda no próprio SRVJENKINS) APP_NAME = 'cicd-demo-app' // Nome da imagem Docker STAGING_IP = '10.15.1.212' // IP do SRVSTAGING } stages { // ================================================== // STAGE 1: Instalar Dependências // ================================================== // O Jenkins já clonou o repositório automaticamente // (configurado no Job). Agora instalamos as dependências // Node.js listadas no package.json. stage('Install') { steps { echo '📦 Instalando dependências (npm install)...' sh 'npm install' } } // ================================================== // STAGE 2: Executar Testes // ================================================== // Roda os testes automatizados (Jest). // Se QUALQUER teste falhar, o pipeline PARA AQUI. // Código quebrado NUNCA chega ao servidor de staging. stage('Test') { steps { echo '🧪 Executando testes automatizados...' sh 'npm test' } } // ================================================== // STAGE 3: Construir Imagem Docker // ================================================== // Cria a imagem Docker da aplicação usando o Dockerfile. // Gera duas tags: // - BUILD_NUMBER: versão específica (ex: :14) // - latest: sempre aponta para a versão mais recente stage('Build Image') { steps { echo '🐳 Construindo imagem Docker...' sh "docker build -t ${REGISTRY}/${APP_NAME}:${BUILD_NUMBER} ." sh "docker tag ${REGISTRY}/${APP_NAME}:${BUILD_NUMBER} ${REGISTRY}/${APP_NAME}:latest" } } // ================================================== // STAGE 4: Enviar Imagem para o Registry // ================================================== // "Push" da imagem para o Docker Registry local. // O Registry é o "repositório de templates" — o staging // vai buscar a imagem de lá. stage('Push to Registry') { steps { echo '📤 Enviando imagem para o Registry local...' sh "docker push ${REGISTRY}/${APP_NAME}:${BUILD_NUMBER}" sh "docker push ${REGISTRY}/${APP_NAME}:latest" } } // ================================================== // STAGE 5: Deploy no Staging // ================================================== // Conecta via SSH no SRVSTAGING e: // 1. Puxa a imagem mais recente do Registry // 2. Para e remove o container antigo (se existir) // 3. Sobe um novo container com a versão nova // // PREREQUISITO: A credencial 'staging-ssh-key' precisa // estar cadastrada no Jenkins (Manage Jenkins → Credentials) stage('Deploy to Staging') { steps { echo '🚀 Fazendo deploy no SRVSTAGING...' sshagent(credentials: ['staging-ssh-key']) { sh """ ssh -o StrictHostKeyChecking=no root@${STAGING_IP} ' docker pull ${REGISTRY}/${APP_NAME}:latest && (docker stop ${APP_NAME} || true) && (docker rm ${APP_NAME} || true) && docker run -d \ --name ${APP_NAME} \ --restart unless-stopped \ -p 3001:3000 \ ${REGISTRY}/${APP_NAME}:latest ' """ } } } } // Ações executadas APÓS o pipeline terminar post { success { echo '✅ Pipeline executado com sucesso!' echo '🌐 App disponível em: http://10.15.1.212:3001' } failure { echo '❌ Pipeline falhou. Verifique os logs acima.' } } }