CI/CD — Integración y Despliegue Continuo

Pipelines de integración continua, testing automatizado y estrategias de despliegue: blue-green, canary y rolling updates.

¿Qué es CI/CD?

CI/CD (Continuous Integration / Continuous Delivery o Deployment) es un conjunto de prácticas que automatizan el proceso de llevar código desde el repositorio hasta producción.

  • CI (Integración Continua): cada cambio de código se integra frecuentemente, se compila y se testea automáticamente
  • CD (Entrega Continua): el código que pasa CI está siempre listo para desplegarse en producción
  • CD (Despliegue Continuo): el código se despliega automáticamente a producción sin intervención manual

Pipeline de CI/CD

Un pipeline es una secuencia de etapas automatizadas que el código atraviesa desde el commit hasta producción.

Etapas típicas

Commit → Build → Test → Análisis → Artefacto → Deploy Staging → Deploy Producción
  1. Build: compilar el código, generar artefactos
  2. Test unitarios: ejecutar tests rápidos que validan la lógica
  3. Test de integración: verificar que los componentes funcionan juntos
  4. Análisis estático: linting, type checking, análisis de seguridad
  5. Construcción de artefacto: crear imagen Docker, paquete, etc.
  6. Deploy a staging: desplegar automáticamente para pruebas finales
  7. Deploy a producción: desplegar con la estrategia elegida

Ejemplo con GitHub Actions

name: CI/CD Pipeline
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci
      - run: npm run lint
      - run: npm run test
      - run: npm run build

  deploy-staging:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build Docker image
        run: docker build -t my-app:${{ github.sha }} .
      - name: Push to registry
        run: docker push my-app:${{ github.sha }}
      - name: Deploy to staging
        run: kubectl set image deployment/my-app my-app=my-app:${{ github.sha }} -n staging

Testing automatizado en CI

El testing es la columna vertebral de CI. Sin tests confiables, la automatización no tiene sentido.

Pirámide de tests en CI

  • Tests unitarios (muchos, rápidos): validan funciones y módulos individuales
  • Tests de integración (moderados): validan la comunicación entre componentes
  • Tests end-to-end (pocos, lentos): validan flujos completos del usuario

Buenas prácticas

  • Los tests deben ser deterministas: el mismo código siempre produce el mismo resultado
  • Los tests deben ser rápidos: un pipeline lento desincentiva la integración frecuente
  • Los tests deben ser independientes: no depender del orden de ejecución ni de estado compartido
  • Usar paralelización para reducir el tiempo total del pipeline

Estrategias de despliegue

Rolling update

La estrategia por defecto en Kubernetes. Reemplaza gradualmente las instancias antiguas con las nuevas.

  • Ventaja: no requiere infraestructura adicional
  • Desventaja: durante el update, coexisten dos versiones
  • Rollback: automático si los health checks fallan
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0

Blue-Green deployment

Mantiene dos entornos idénticos: Blue (actual) y Green (nuevo). El tráfico se redirige de Blue a Green cuando Green está listo.

  • Ventaja: rollback instantáneo (volver a Blue)
  • Desventaja: requiere el doble de infraestructura durante el despliegue
  • Ideal para: cambios grandes o migraciones de base de datos

Canary deployment

Despliega la nueva versión a un pequeño porcentaje de usuarios primero. Si todo va bien, se incrementa gradualmente hasta el 100%.

  • Ventaja: riesgo mínimo, detección temprana de problemas
  • Desventaja: más complejo de implementar y monitorear
  • Ideal para: cambios con riesgo o features experimentales
Fase 1: 5% del tráfico → nueva versión
Fase 2: 25% del tráfico → nueva versión
Fase 3: 50% del tráfico → nueva versión
Fase 4: 100% del tráfico → nueva versión

Feature flags

No es una estrategia de despliegue per se, pero complementa a las anteriores. Permite activar o desactivar features sin redesplegar.

  • El código nuevo se despliega pero está desactivado por defecto
  • Se activa gradualmente para usuarios específicos
  • Si hay problemas, se desactiva sin rollback

Buenas prácticas de CI/CD

  1. Hacer commits pequeños y frecuentes: facilita la detección de errores
  2. El pipeline debe ser rápido: idealmente menos de 10 minutos para CI
  3. Nunca saltarse el pipeline: todo cambio pasa por CI, sin excepciones
  4. Artefactos inmutables: el mismo artefacto se promueve entre entornos
  5. Monitorear los despliegues: alertas automáticas si algo falla post-deploy
  6. Automatizar rollbacks: si las métricas se degradan, revertir automáticamente

Resumen

CI/CD automatiza el camino del código a producción. La integración continua garantiza que cada cambio se valida automáticamente, mientras que las estrategias de despliegue (rolling, blue-green, canary) permiten llevar cambios a producción con confianza y mínimo riesgo.