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.