DevOpsBásico

CI/CD

Continuous Integration y Continuous Delivery/Deployment. Prácticas de desarrollo que automatizan la integración de código y su entrega a producción.

Pronunciación

/siː aɪ siː diː/
"si-ai-si-di"
Escuchar en:Forvo

Qué es

CI/CD son dos prácticas complementarias:

  • CI (Continuous Integration): Integrar código frecuentemente al repositorio principal, con tests automáticos
  • CD (Continuous Delivery/Deployment): Entregar automáticamente el código a producción o staging

Juntas, permiten entregar software de forma rápida, confiable y frecuente.

Errores comunes de pronunciación

  • ❌ “cicd” (no es una palabra, son siglas)
  • ❌ “ce-i-ce-de” (en contextos técnicos se usa la pronunciación inglesa de las siglas)

CI vs CD: La diferencia

┌─────────────────────────────────────────────────────────┐
│                    FLUJO CI/CD                           │
├─────────────────────────────────────────────────────────┤
│                                                          │
│   ┌─────────┐    ┌─────────┐    ┌─────────┐            │
│   │  Código │ →  │  Build  │ →  │  Tests  │            │
│   │  Push   │    │         │    │         │            │
│   └─────────┘    └─────────┘    └─────────┘            │
│        │                              │                 │
│        └──────── CI ──────────────────┘                 │
│                                       │                 │
│                                       ▼                 │
│                              ┌─────────────────┐        │
│                              │ Tests pasaron?  │        │
│                              └────────┬────────┘        │
│                                       │                 │
│                          Sí ──────────┴────────── No    │
│                          │                        │     │
│                          ▼                        ▼     │
│                    ┌───────────┐            ┌────────┐  │
│                    │  Deploy   │            │ Falla  │  │
│                    │  Staging  │            │        │  │
│                    └─────┬─────┘            └────────┘  │
│                          │                              │
│                          ▼                              │
│                    ┌───────────┐                        │
│                    │  Deploy   │                        │
│                    │Production │ ← Continuous Delivery  │
│                    └───────────┘                        │
│                          │                              │
│        └──────── CD ─────┘                              │
│                                                          │
└─────────────────────────────────────────────────────────┘

Continuous Integration (CI)

¿Qué incluye?

Práctica Descripción
Commits frecuentes Integrar código varias veces al día
Build automatizado Compilar código automáticamente
Tests automáticos Ejecutar tests en cada push
Feedback rápido Saber en minutos si algo falló

Ejemplo de Pipeline CI

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

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

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout código
        uses: actions/checkout@v6

      - name: Setup Node.js
        uses: actions/setup-node@v6
        with:
          node-version: '24'

      - name: Instalar dependencias
        run: npm ci

      - name: Lint
        run: npm run lint

      - name: Tests unitarios
        run: npm test

      - name: Build
        run: npm run build

Continuous Delivery vs Deployment

Aspecto Continuous Delivery Continuous Deployment
Automatización Todo listo para producción; el paso final se dispara manualmente Hasta producción, sin intervención
Aprobación humana Sí, para producción No
Requisito clave Pipeline confiable y software siempre desplegable Tests automatizados y monitoreo muy robustos
Velocidad Rápido Muy rápido

Continuous Delivery

Código → CI → Tests → Build → Staging → [Aprobación Manual] → Producción

Continuous Deployment

Código → CI → Tests → Build → Staging → Tests más → Producción (automático)

Ejemplo Completo: Pipeline CD

# .github/workflows/cd.yml
name: CD Pipeline

on:
  push:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - run: npm ci
      - run: npm test

  deploy-staging:
    needs: test
    runs-on: ubuntu-latest
    environment: staging
    steps:
      - uses: actions/checkout@v6
      - name: Deploy a Staging
        run: |
          npm ci
          npm run build
          # Deploy a servidor staging
          rsync -avz ./dist/ staging-server:/var/www/app/

  deploy-production:
    needs: deploy-staging
    runs-on: ubuntu-latest
    environment: production
    steps:
      - uses: actions/checkout@v6
      - name: Deploy a Producción
        run: |
          npm ci
          npm run build
          # Deploy a servidor producción
          rsync -avz ./dist/ prod-server:/var/www/app/

Herramientas Populares de CI/CD

Herramienta Tipo Ideal para
GitHub Actions Cloud Proyectos en GitHub
GitLab CI Cloud/Self-hosted Proyectos en GitLab
Jenkins Self-hosted Control total
CircleCI Cloud Velocidad
Azure DevOps Cloud Ecosistema Microsoft
AWS CodePipeline Cloud Ecosistema AWS

Beneficios de CI/CD

Para desarrolladores

Sin CI/CD:
"¿Funciona en mi máquina?" → Merge → 😱 Producción rota

Con CI/CD:
Push → Tests automáticos → ✅ o ❌ → Feedback inmediato

Para el negocio

Métrica Sin CI/CD Con CI/CD
Frecuencia de deploy Semanal/Mensual Diario/Múltiples por día
Tiempo de feedback Horas/Días Minutos
Bugs en producción Frecuentes Raros
Rollback Manual, lento Automático, rápido

Caso Práctico: Configurar CI/CD desde Cero

Paso 1: Estructura del proyecto

mi-proyecto/
├── src/
├── tests/
├── package.json
└── .github/
    └── workflows/
        └── ci-cd.yml

Paso 2: Pipeline básico

name: CI/CD

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

jobs:
  # CI - Se ejecuta en cada push/PR
  ci:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Setup
        uses: actions/setup-node@v6
        with:
          node-version: '24'
          cache: 'npm'

      - name: Install
        run: npm ci

      - name: Lint
        run: npm run lint

      - name: Test
        run: npm test -- --coverage

      - name: Build
        run: npm run build

  # CD - Solo en push a main
  cd:
    needs: ci
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6

      - name: Deploy
        env:
          DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
        run: |
          npm ci
          npm run build
          npm run deploy

Mejores Prácticas

Práctica Por qué
Tests rápidos primero Feedback temprano
Builds reproducibles Mismos resultados siempre
Secrets seguros Nunca en código
Rollback automático Recuperación rápida
Monitoreo post-deploy Detectar problemas

Términos relacionados

  • Deploy - Proceso de poner código en producción
  • Testing - Pruebas automáticas del código
  • Docker - Contenedores para builds consistentes
  • Git - Control de versiones

Recuerda: CI/CD no es solo herramientas, es una cultura. Empieza con CI básico y evoluciona hacia CD conforme tu equipo gane confianza en los tests y el proceso.