Desplegar código manualmente a producción conectándose vía SSH a un servidor y ejecutando git pull es una receta para el desastre. CI/CD (Integración Continua / Despliegue Continuo) automatiza todo el proceso: cada envío de código activa pruebas, compilaciones y despliegues — de forma consistente, fiable y sin errores humanos.

CI vs CD: ¿Cuál es la diferencia?

  • Integración Continua (CI): Compila y prueba el código automáticamente cada vez que un desarrollador envía cambios. Detecta errores de forma temprana.
  • Entrega Continua (CD): Prepara el código automáticamente para su lanzamiento. Cada commit que pasa las pruebas está listo para desplegar.
  • Despliegue Continuo: Despliega automáticamente a producción cada commit que pasa las pruebas. No requiere aprobación manual.

Un Pipeline CI/CD Típico

Etapas del Pipeline
1. 📥 Código Fuente  → Desarrollador envía código a Git
2. 🔨 Compilación   → Instalar dependencias, compilar TypeScript, empaquetar assets
3. 🧪 Pruebas       → Ejecutar tests unitarios, de integración, linting
4. 🔍 Análisis      → Verificación de calidad de código, escaneo de seguridad
5. 📦 Empaquetado   → Crear imagen Docker o artefacto de despliegue
6. 🚀 Despliegue     → Enviar a staging, luego a producción
7. ✅ Verificación   → Chequeos de salud, pruebas de humo, alertas de monitoreo

Ejemplo con GitHub Actions

.github/workflows/ci.yml
name: Pipeline CI/CD

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Configurar Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'

      - name: Instalar dependencias
        run: npm ci

      - name: Ejecutar linter
        run: npm run lint

      - name: Ejecutar tests
        run: npm test

      - name: Compilar
        run: npm run build

  deploy:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Desplegar a producción
        run: |
          echo "Desplegando a producción..."
          # Tu script de despliegue aquí
        env:
          DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}

Estrategias de Despliegue

  • Despliegue Gradual (Rolling Deployment): Reemplaza gradualmente las instancias antiguas por las nuevas. Cero tiempo de inactividad, pero ambas versiones se ejecutan simultáneamente durante el despliegue.
  • Despliegue Blue-Green: Mantiene dos entornos idénticos. Despliega en el entorno inactivo y luego cambia el tráfico. Permite un rollback instantáneo al revertir el cambio de tráfico.
  • Despliegue Canary: Dirige un pequeño porcentaje del tráfico (ej. 5%) a la nueva versión. Si las métricas son buenas, aumenta gradualmente hasta el 100%.
  • Feature Flags: Despliega nuevo código detrás de una bandera (flag). Habilita para usuarios específicos o porcentajes sin necesidad de volver a desplegar.

Pruebas en CI

Pirámide de Pruebas
           / Pruebas E2E \          ← Lentas, costosas, pocas
          / Pruebas Integración \      ← Velocidad media, cantidad moderada
         /    Pruebas Unitarias    \   ← Rápidas, baratas, muchas

Orden de ejecución en CI:
1. Linting (lo más rápido) → detectar problemas de estilo
2. Tests unitarios → detectar errores lógicos
3. Tests de integración → detectar errores de conexión
4. Tests E2E → detectar errores en flujos de usuario

Mejores Prácticas

  • Mantén los pipelines rápidos — apunta a menos de 10 minutos. Paraleliza pruebas, cachea dependencias.
  • Falla rápido — ejecuta primero las comprobaciones más veloces (linting, type-checking).
  • Nunca omitas pruebas para desplegar más rápido. Si las pruebas son lentas, optimízalas.
  • Usa gestión de secretos — nunca codifiques credenciales en las configuraciones del pipeline.
  • Haz los despliegues aburridos — si desplegar da miedo, no lo haces con suficiente frecuencia.
  • Siempre ten un plan de rollback — rollback de un clic a la versión anterior.

Prueba Nuestras Herramientas Gratuitas para Desarrolladores

Minifica y optimiza tu código antes del despliegue.