Docker & KubernetesCI/CD y DeployLección 12 de 12
Deploy Continuo y Rollback
El deploy continuo (CD) lleva tu imagen desde el registro hasta produccion automaticamente. Las estrategias mas comunes:
• SSH Deploy: el pipeline se conecta al servidor y actualiza los contenedores • Registry + Pull: push al registro, el servidor detecta la nueva imagen y hace pull • Kubernetes: actualiza el tag de imagen en los manifests y ArgoCD lo aplica • Platform deploys: Heroku, Railway, Fly.io detectan push y despliegan
Siempre necesitas: 1. Versionado semantico de imagenes (no solo :latest) 2. Health checks post-deploy 3. Plan de rollback automatico 4. Notificaciones de exito/fallo
# .github/workflows/deploy.yml
name: Deploy a Produccion
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login a GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build y Push con version
uses: docker/build-push-action@v5
with:
push: true
tags: |
ghcr.io/${{ github.repository }}:latest
ghcr.io/${{ github.repository }}:${{ github.sha }}
- name: Deploy via SSH
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SERVER_IP }}
username: deploy
key: ${{ secrets.SSH_KEY }}
script: |
cd /app
docker compose pull
docker compose up -d
sleep 10
curl -sf http://localhost:3000/health || {
echo "Health check fallo, rollback..."
docker compose down
docker tag mi-app:previous mi-app:latest
docker compose up -d
exit 1
}
- name: Notificar en Discord
if: always()
uses: sarisia/actions-status-discord@v1
with:
webhook: ${{ secrets.DISCORD_WEBHOOK }}
status: ${{ job.status }}
title: "Deploy de ${{ github.repository }}"
# ROLLBACK manual rapido
# Ver imagenes anteriores en el registro
docker images ghcr.io/mi-org/mi-app --format "{{.Tag}} {{.CreatedAt}}"
# Rollback a un commit especifico
docker pull ghcr.io/mi-org/mi-app:abc123def
docker tag ghcr.io/mi-org/mi-app:abc123def ghcr.io/mi-org/mi-app:latest
docker compose up -d
# VERSIONADO SEMANTICO automatico
# En tu CI, genera tags basados en la fecha o semver:
# v1.2.3, v2026.06.24, sha-abc123
# Script de deploy seguro con rollback automatico
#!/bin/bash
set -euo pipefail
IMAGEN="ghcr.io/mi-org/mi-app"
NUEVA="$IMAGEN:$1"
ANTERIOR=$(docker inspect --format='{{.Config.Image}}' mi-app 2>/dev/null || echo "")
echo "Desplegando $NUEVA (anterior: $ANTERIOR)"
docker pull "$NUEVA"
docker compose up -d
sleep 10
if ! curl -sf http://localhost:3000/health > /dev/null; then
echo "FALLO! Rollback a $ANTERIOR"
docker compose down
if [ -n "$ANTERIOR" ]; then
docker tag "$ANTERIOR" "$IMAGEN:latest"
docker compose up -d
fi
exit 1
fi
echo "Deploy exitoso!"
ConsejoNunca uses solo :latest en produccion. Siempre tagea con el SHA del commit o semver. Asi puedes hacer rollback a cualquier version exacta.
Practica esta lección
Resuelve los ejercicios del curso de Docker & Kubernetes en la app, gratis y con corrección automática.
Empezar a practicar