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
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.
Pronunciación
IPA: /siː aɪ siː diː/
Suena como: “si-ai-si-di” - cada letra por separado
Errores comunes:
- ❌ “cicd” (no es una palabra, son siglas)
- ❌ “ce-i-ce-de” (usar pronunciación inglesa)
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@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- 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 | Hasta staging | Hasta producción |
| Aprobación humana | Sí, para producción | No |
| Riesgo | Menor | Mayor (requiere más tests) |
| 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@v4
- run: npm ci
- run: npm test
deploy-staging:
needs: test
runs-on: ubuntu-latest
environment: staging
steps:
- uses: actions/checkout@v4
- 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@v4
- 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@v4
- name: Setup
uses: actions/setup-node@v4
with:
node-version: '20'
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@v4
- 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.