Quiz Final: Evaluación de la Pipeline CI/CD

Quiz
15 min~4 min lectura

Quiz Interactivo

Pon a prueba tus conocimientos

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:

  1. Un desarrollador hace un push a la rama main en GitHub.
  2. GitHub Actions detecta el evento y ejecuta el workflow definido en .github/workflows/ci-cd.yml.
  3. El workflow inicia un job de build que instala dependencias y compila la aplicación.
  4. Luego, un job de test ejecuta pruebas unitarias y de integración.
  5. Si los tests pasan, un job de deploy despliega la aplicación a un entorno de staging usando AWS CLI.
  6. 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/ --delete

Errores 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: false o maneja errores con condiciones.
  • Jobs sin dependencias claras: Ejecutar deploy antes de tests. Solución: Usa needs para definir dependencias entre jobs.
  • No optimizar tiempo de ejecución: Jobs lentos que retrasan la pipeline. Solución: Usa caching con actions/cache y 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:

  1. Clona el repositorio de ejemplo desde https://github.com/example/ci-cd-demo (usa un fork si es necesario).
  2. Revisa el archivo .github/workflows/pipeline.yml: actualmente solo hace build y test.
  3. 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).
  4. Implementa caching para las dependencias de Node.js usando actions/cache.
  5. Añade un step que envíe una notificación a Slack si el deploy falla (simula con un webhook).
  6. 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.