Inicio > Cursos > Docker & Kubernetes > Deploy Continuo y Rollback
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.
← CI con GitHub Actions

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