Desplegar código manualmente a producción conectándose vía SSH a un servidor y ejecutando git pull es una receta para el desastre. CI/CD (Integración Continua / Despliegue Continuo) automatiza todo el proceso: cada envío de código activa pruebas, compilaciones y despliegues — de forma consistente, fiable y sin errores humanos.
CI vs CD: ¿Cuál es la diferencia?
- Integración Continua (CI): Compila y prueba el código automáticamente cada vez que un desarrollador envía cambios. Detecta errores de forma temprana.
- Entrega Continua (CD): Prepara el código automáticamente para su lanzamiento. Cada commit que pasa las pruebas está listo para desplegar.
- Despliegue Continuo: Despliega automáticamente a producción cada commit que pasa las pruebas. No requiere aprobación manual.
Un Pipeline CI/CD Típico
Etapas del Pipeline
1. 📥 Código Fuente → Desarrollador envía código a Git 2. 🔨 Compilación → Instalar dependencias, compilar TypeScript, empaquetar assets 3. 🧪 Pruebas → Ejecutar tests unitarios, de integración, linting 4. 🔍 Análisis → Verificación de calidad de código, escaneo de seguridad 5. 📦 Empaquetado → Crear imagen Docker o artefacto de despliegue 6. 🚀 Despliegue → Enviar a staging, luego a producción 7. ✅ Verificación → Chequeos de salud, pruebas de humo, alertas de monitoreo
Ejemplo con GitHub Actions
.github/workflows/ci.yml
name: Pipeline CI/CD
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configurar Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- name: Instalar dependencias
run: npm ci
- name: Ejecutar linter
run: npm run lint
- name: Ejecutar tests
run: npm test
- name: Compilar
run: npm run build
deploy:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Desplegar a producción
run: |
echo "Desplegando a producción..."
# Tu script de despliegue aquí
env:
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
Estrategias de Despliegue
- Despliegue Gradual (Rolling Deployment): Reemplaza gradualmente las instancias antiguas por las nuevas. Cero tiempo de inactividad, pero ambas versiones se ejecutan simultáneamente durante el despliegue.
- Despliegue Blue-Green: Mantiene dos entornos idénticos. Despliega en el entorno inactivo y luego cambia el tráfico. Permite un rollback instantáneo al revertir el cambio de tráfico.
- Despliegue Canary: Dirige un pequeño porcentaje del tráfico (ej. 5%) a la nueva versión. Si las métricas son buenas, aumenta gradualmente hasta el 100%.
- Feature Flags: Despliega nuevo código detrás de una bandera (flag). Habilita para usuarios específicos o porcentajes sin necesidad de volver a desplegar.
Pruebas en CI
Pirámide de Pruebas
/ Pruebas E2E \ ← Lentas, costosas, pocas
/ Pruebas Integración \ ← Velocidad media, cantidad moderada
/ Pruebas Unitarias \ ← Rápidas, baratas, muchas
Orden de ejecución en CI:
1. Linting (lo más rápido) → detectar problemas de estilo
2. Tests unitarios → detectar errores lógicos
3. Tests de integración → detectar errores de conexión
4. Tests E2E → detectar errores en flujos de usuario
Mejores Prácticas
- Mantén los pipelines rápidos — apunta a menos de 10 minutos. Paraleliza pruebas, cachea dependencias.
- Falla rápido — ejecuta primero las comprobaciones más veloces (linting, type-checking).
- Nunca omitas pruebas para desplegar más rápido. Si las pruebas son lentas, optimízalas.
- Usa gestión de secretos — nunca codifiques credenciales en las configuraciones del pipeline.
- Haz los despliegues aburridos — si desplegar da miedo, no lo haces con suficiente frecuencia.
- Siempre ten un plan de rollback — rollback de un clic a la versión anterior.
Prueba Nuestras Herramientas Gratuitas para Desarrolladores
Minifica y optimiza tu código antes del despliegue.