Concepto clave
GitHub Actions es una plataforma de integración continua y despliegue continuo (CI/CD) que permite automatizar flujos de trabajo directamente en tu repositorio de GitHub. Imagina que tienes un equipo de asistentes virtuales que revisan cada cambio en tu código, ejecutan pruebas, construyen tu aplicación y la despliegan automáticamente cuando todo está correcto. Esto elimina tareas manuales repetitivas y reduce errores humanos.
La analogía del mundo real sería una fábrica automatizada: cuando llega nueva materia prima (código nuevo), una línea de ensamblaje (workflow) se activa automáticamente para probar, empaquetar y enviar el producto terminado. Los componentes principales son workflows (flujos de trabajo definidos en archivos YAML), jobs (tareas dentro del workflow que se ejecutan en runners), y actions (componentes reutilizables que realizan operaciones específicas).
Cómo funciona en la práctica
Cuando configuras GitHub Actions, creas un archivo YAML en la carpeta .github/workflows de tu repositorio. Este archivo define qué debe ocurrir cuando se disparan ciertos eventos, como un push a la rama main o la creación de un pull request. El proceso paso a paso es:
- Un evento (como un push) activa el workflow
- GitHub busca runners disponibles (máquinas virtuales o self-hosted)
- Se ejecutan los jobs en paralelo o secuencialmente según la configuración
- Cada job ejecuta steps que pueden usar actions predefinidas o comandos personalizados
- Los resultados se muestran en la pestaña Actions de tu repositorio
Código en acción
Este es un ejemplo básico de workflow que se ejecuta en cada push a main:
name: CI Pipeline
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout código
uses: actions/checkout@v3
- name: Configurar Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Instalar dependencias
run: npm ci
- name: Ejecutar tests
run: npm testAhora, mejorémoslo agregando cache para acelerar builds:
name: CI Pipeline Optimizado
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout código
uses: actions/checkout@v3
- name: Configurar Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Cache node_modules
uses: actions/cache@v3
with:
path: ~/.npm
key: npm-${{ hashFiles('package-lock.json') }}
restore-keys: |
npm-
- name: Instalar dependencias
run: npm ci
- name: Ejecutar tests
run: npm test
- name: Build de producción
run: npm run buildErrores comunes
- No usar cache para dependencias: Cada ejecución descarga todas las dependencias desde cero, aumentando tiempo y costos. Solución: implementar actions/cache como en el ejemplo anterior.
- Secretos en el código: Incluir contraseñas o tokens directamente en el YAML. Solución: usar GitHub Secrets y referenciarlos con
${{ secrets.NOMBRE_SECRET }}. - Jobs sin dependencias definidas: Ejecutar jobs en paralelo cuando necesitan resultados de otros. Solución: usar
needspara definir dependencias entre jobs. - No limpiar recursos: Dejar contenedores o archivos temporales después de la ejecución. Solución: agregar steps de cleanup o usar actions como
actions/upload-artifactyactions/download-artifactcorrectamente. - Ignorar el matrix strategy: No probar en múltiples versiones de runtime o sistemas operativos. Solución: usar
strategy.matrixpara ejecutar tests en diferentes entornos.
Checklist de dominio
- Puedo crear un workflow básico que se ejecute en push y pull requests
- Sé configurar diferentes runners (ubuntu-latest, windows-latest, self-hosted)
- Entiendo cómo usar actions del marketplace y crear mis propias actions
- Puedo manejar secretos de forma segura usando GitHub Secrets
- Sé implementar cache para optimizar tiempos de ejecución
- Puedo definir dependencias entre jobs usando
needs - Entiendo cómo usar artifacts para pasar datos entre jobs
Configura un pipeline CI básico para una aplicación Node.js
En este ejercicio práctico, configurarás un pipeline de integración continua para una aplicación Node.js existente. Sigue estos pasos:
- Crea un nuevo repositorio en GitHub o usa uno existente con una aplicación Node.js simple
- En la raíz del repositorio, crea la carpeta
.github/workflows - Dentro de esta carpeta, crea un archivo llamado
ci.yml - Configura el workflow para que se active en push a la rama main y en pull requests
- Define un job llamado
testque useubuntu-latestcomo runner - Agrega steps para: checkout del código, setup de Node.js versión 18, instalación de dependencias con
npm ci, y ejecución de tests connpm test - Commit y push los cambios a tu repositorio
- Verifica en la pestaña Actions de GitHub que el workflow se ejecute correctamente
- Opcional: Agrega un step adicional para construir la aplicación con
npm run build
- Recuerda que la estructura YAML es sensible a indentación
- Puedes encontrar actions populares en el GitHub Marketplace
- Usa
actions/checkout@v3para obtener el código del repositorio
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.