Files
cicd-demo-app/Jenkinsfile

128 lines
5.1 KiB
Groovy

// ============================================================
// 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.'
}
}
}