Concepto clave
Una pipeline CI/CD completa es un flujo automatizado que integra continuamente cambios de código, ejecuta pruebas y despliega aplicaciones de manera confiable. Imagina una fábrica de automóviles: cada pieza (código) pasa por una línea de ensamblaje donde se verifica su calidad (tests), se ensambla (build) y finalmente se entrega al cliente (deploy). En GitHub Actions, esto se logra mediante workflows que definen jobs y steps en archivos YAML.
La clave está en la automatización end-to-end: desde que un desarrollador hace un push hasta que la aplicación está en producción. Esto reduce errores humanos, acelera el tiempo de entrega y mejora la calidad del software. Para aplicaciones modernas, una pipeline típica incluye: build, test de unidad/integración, análisis de código, y deploy a entornos como staging y producción.
Cómo funciona en la práctica
Veamos un ejemplo paso a paso para una aplicación Node.js con despliegue a AWS:
- Un desarrollador hace un push a la rama
mainen GitHub. - GitHub Actions detecta el evento y ejecuta el workflow definido en
.github/workflows/ci-cd.yml. - El workflow inicia un job de build que instala dependencias y compila la aplicación.
- Luego, un job de test ejecuta pruebas unitarias y de integración.
- Si los tests pasan, un job de deploy despliega la aplicación a un entorno de staging usando AWS CLI.
- Finalmente, tras una aprobación manual, se despliega a producción.
Este flujo asegura que solo el código probado y funcional llegue a producción, similar a cómo un control de calidad en una fábrica evita productos defectuosos.
Codigo en accion
Aquí tienes un ejemplo funcional de un workflow básico para una app Node.js:
name: CI/CD Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build application
run: npm run build
Ahora, mejoremos este código añadiendo despliegue a AWS S3 (antes y después):
Antes: Solo build y test.
Después: Añadimos deploy.
name: CI/CD Pipeline con Deploy
on:
push:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build application
run: npm run build
- name: Upload build artifacts
uses: actions/upload-artifact@v3
with:
name: build-output
path: ./dist
deploy:
needs: build-and-test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Download build artifacts
uses: actions/download-artifact@v3
with:
name: build-output
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Deploy to S3
run: aws s3 sync ./ s3://my-app-bucket/ --deleteErrores comunes
- No usar secrets de forma segura: Exponer claves API en el código. Solución: Usa GitHub Secrets y referéncialas con
${{ secrets.NOMBRE }}. - Falta de manejo de fallos: Si un step falla, el workflow continúa. Solución: Usa
continue-on-error: falseo maneja errores con condiciones. - Jobs sin dependencias claras: Ejecutar deploy antes de tests. Solución: Usa
needspara definir dependencias entre jobs. - No optimizar tiempo de ejecución: Jobs lentos que retrasan la pipeline. Solución: Usa caching con
actions/cachey paraleliza jobs cuando sea posible. - Ignorar el entorno: Asumir que el entorno de CI es igual al local. Solución: Usa contenedores Docker o matrix strategies para pruebas en múltiples entornos.
Checklist de dominio
- ¿Puedes crear un workflow que se active en push y pull requests?
- ¿Sabes configurar jobs con dependencias usando
needs? - ¿Manejas secrets de GitHub de forma segura en tus workflows?
- ¿Implementas caching para acelerar builds recurrentes?
- ¿Despliegas a un entorno cloud (ej. AWS, Azure) automáticamente?
- ¿Incluyes steps para rollback en caso de fallo en deploy?
- ¿Monitorizas el estado de tus pipelines con notificaciones?
Optimiza y Extiende una Pipeline CI/CD Existente
En este ejercicio, mejorarás una pipeline CI/CD básica para una aplicación web. Sigue estos pasos:
- Clona el repositorio de ejemplo desde
https://github.com/example/ci-cd-demo(usa un fork si es necesario). - Revisa el archivo
.github/workflows/pipeline.yml: actualmente solo hace build y test. - Añade un job de deploy que:
- Dependa del job de build-and-test.
- Se ejecute solo en la rama
main. - Despliegue los archivos build a GitHub Pages (usa la acción
peaceiris/actions-gh-pages).
- Implementa caching para las dependencias de Node.js usando
actions/cache. - Añade un step que envíe una notificación a Slack si el deploy falla (simula con un webhook).
- Prueba tu pipeline haciendo un push a tu rama y verifica que todos los jobs pasen.
Entrega un enlace a tu repositorio con los cambios y una captura del workflow ejecutado.
Pistas- Usa la documentación de GitHub Actions para encontrar acciones específicas como peaceiris/actions-gh-pages.
- Recuerda configurar secrets en tu repositorio para claves de API o webhooks.
- Prueba cada cambio en una rama feature antes de merge a main.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.