128 lines
5.1 KiB
Groovy
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.'
|
|
}
|
|
}
|
|
}
|