FundamentosDevOps y CI/CD

CI/CD — integración y entrega continuas

El pipeline que convierte cada commit en software desplegable, qué automatizar en cada etapa y las prácticas que lo hacen sostenible.

En esta página

Antes de la integración continua, los equipos integraban su trabajo cada semanas o meses — y esa integración era un infierno de conflictos apodado merge hell. CI/CD ataca el problema con una idea contraintuitiva: si algo duele, hazlo más a menudo. Integra cada día y el conflicto es pequeño; despliega cada día y el riesgo de cada despliegue se desploma.

El pipeline

Cada push dispara una cadena automática de etapas. Si una falla, la cadena se corta y nadie hereda el problema:

commit build tests staging prod cada etapa es una puerta: si falla, el pipeline se detiene

Del commit a producción sin manos humanas — o con una sola aprobación, según cuánto CD practiques.

  • Build: compila, resuelve dependencias, empaqueta (a menudo, una imagen de contenedor). Falla aquí = ni siquiera compila.
  • Tests: la pirámide entera — unitarios siempre; integración y E2E según el presupuesto de tiempo. También linters y análisis estático.
  • Staging: despliegue real en un entorno clon de producción. Aquí cazas lo que solo aparece desplegado: variables de entorno, migraciones, permisos.
  • Producción: el despliegue final — automático o tras un botón.

CI, delivery y deployment no son lo mismo

Práctica Qué automatiza La decisión de desplegar
Integración continua (CI) Build + tests en cada push a la rama principal
Entrega continua (delivery) Todo hasta dejar el artefacto listo para producción La toma una persona (un clic)
Despliegue continuo (deployment) Todo, incluida producción La toma el pipeline: verde = desplegado

El salto de uno a otro no es de herramientas, es de confianza en tus tests. Si un pipeline verde no te da tranquilidad para desplegar un viernes, el problema no es el viernes.

Un pipeline real (GitHub Actions)

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

jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 22, cache: npm }
      - run: npm ci          # instalación exacta desde el lockfile
      - run: npm run lint    # estilo y errores estáticos
      - run: npm test        # la suite completa
      - run: npm run build   # ¿el artefacto se genera?

Nota los detalles: npm ci (no install) garantiza las versiones del lockfile, y el pipeline corre también en cada pull request — el error se descubre antes del merge, no después.

Las prácticas que lo hacen funcionar

  • La rama principal siempre está desplegable. Es el contrato del equipo entero; todo lo demás deriva de aquí.
  • Pipeline rápido (<10 min). Más lento y la gente hace push sin esperar el resultado — y el semáforo deja de funcionar como semáforo.
  • Arreglar el build roto es la prioridad del equipo. Un main rojo bloquea a todos; se arregla o se revierte en minutos, sin drama con el revert.
  • Ramas cortas. Una rama de tres semanas es integración diferida — exactamente lo que CI vino a eliminar.
  • Feature flags para separar desplegar (mover código) de publicar (activarlo a usuarios): el código llega a producción apagado y se enciende gradualmente.

Cuando algo sale mal en producción

El objetivo con el que medirse no es “no fallar nunca” (imposible) sino recuperarse en minutos: detectar rápido (monitorización y alertas), y volver atrás barato — rollback a la versión anterior o apagar el feature flag. Los equipos de élite no despliegan menos por miedo; despliegan más pequeño y más a menudo, porque un cambio de 50 líneas se diagnostica y se revierte solo.