Fundamentos del workflow
Workflow mínimo
# .github/workflows/ci.yml name: CI on: push jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: echo "Hello from CI"
Conceptos clave
WorkflowArchivo YAML en .github/workflows/ que define la automatización
EventTrigger que inicia un workflow (push, PR, schedule, etc.)
JobConjunto de steps que se ejecutan en el mismo runner
StepTarea individual — ejecuta un comando o usa una action
RunnerVM que ejecuta los jobs (ubuntu-latest, macos-latest, windows-latest)
ActionUnidad de código reutilizable referenciada con uses:
Triggers
Eventos comunes
on: push: branches: [main] pull_request: branches: [main] schedule: - cron: "0 6 * * 1" # cada lunes 6 AM UTC workflow_dispatch: # trigger manual
Filtros de eventos
branches:Activar solo para ramas específicas
paths:Activar solo cuando cambian archivos coincidentes
tags:Activar en push de tags (v*)
types: [opened, synchronize]Filtrar tipos de actividad de PR
branches-ignore:Excluir ramas específicas
paths-ignore:Excluir rutas de archivo específicas
Jobs y Steps
Configuración de job
jobs: test: runs-on: ubuntu-latest needs: build # depende del job build if: github.ref == 'refs/heads/main' timeout-minutes: 10 steps: - uses: actions/checkout@v4 - run: npm test
Tipos de step
run:Ejecutar un comando shell
uses:Usar una action publicada
with:Pasar entradas a una action
name:Nombre visible en la interfaz
id:Referenciar salidas del step con steps..outputs
if:Ejecución condicional
continue-on-error: trueNo fallar el job si falla el step
Actions
Usar actions
steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - uses: ./.github/actions/my-action # action local
Actions populares
actions/checkout@v4Obtener código del repositorio
actions/setup-node@v4Instalar Node.js
actions/setup-python@v5Instalar Python
actions/upload-artifact@v4Subir artefactos del build
actions/download-artifact@v4Descargar artefactos de otro job
actions/cache@v4Cachear dependencias entre ejecuciones
actions/github-script@v7Ejecutar JS con el cliente de la API de GitHub
Variables de entorno
Establecer variables
env: # a nivel de workflow NODE_ENV: production jobs: build: env: # a nivel de job CI: true steps: - run: echo "$MY_VAR" env: # a nivel de step MY_VAR: hello
Variables predeterminadas
github.shaSHA del commit que activó el workflow
github.refRef de rama o tag (refs/heads/main)
github.repositoryNombre owner/repo
github.actorUsuario que activó el workflow
github.event_nameEvento que activó el workflow
runner.osOS del runner (Linux, macOS, Windows)
Secretos
Usar secretos
steps: - run: deploy --token "$TOKEN" env: TOKEN: ${{ secrets.DEPLOY_TOKEN }} - uses: some/action@v1 with: api-key: ${{ secrets.API_KEY }}
Reglas de secretos
secrets.GITHUB_TOKENToken autogenerado con scope del repo
Settings → SecretsAgregar secretos en la configuración del repo u org
MaskingLos valores de secretos se enmascaran en los logs automáticamente
Environment secretsCon scope a un entorno de despliegue
Org secretsCompartidos entre repos de una organización
Estrategia de matriz
Builds en matriz
jobs: test: strategy: matrix: os: [ubuntu-latest, macos-latest] node: [18, 20] runs-on: ${{ matrix.os }} steps: - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }}
Opciones de matriz
matrix:Definir combinaciones de variables a expandir
include:Agregar combinaciones adicionales a la matriz
exclude:Eliminar combinaciones específicas
fail-fast: falseContinuar otros jobs si uno falla
max-parallel: 2Limitar jobs de matriz concurrentes
Caché
Cachear dependencias
- uses: actions/cache@v4 with: path: ~/.npm key: npm-${{ hashFiles('package-lock.json') }} restore-keys: npm-
Caché integrado
- uses: actions/setup-node@v4 with: node-version: 20 cache: npm # auto-caché para npm/yarn/pnpm - uses: actions/setup-python@v5 with: python-version: "3.12" cache: pip # auto-caché para pip
Artefactos
Subir y descargar
- uses: actions/upload-artifact@v4 with: name: build-output path: dist/ retention-days: 7 - uses: actions/download-artifact@v4 with: name: build-output
Notas sobre artefactos
retention-daysAuto-eliminar después de N días (por defecto 90)
pathArchivo o directorio a subir (admite globs)
Cross-jobSubir en un job, descargar en otro con needs:
compression-level0 (ninguna) a 9 (máxima), por defecto 6
Patrones comunes
Despliegue condicional
- name: Deploy to production if: github.ref == 'refs/heads/main' run: ./deploy.sh - name: Post PR comment if: github.event_name == 'pull_request' run: gh pr comment $PR --body "Build passed"
Expresiones útiles
success()Verdadero si todos los steps anteriores pasaron
failure()Verdadero si algún step anterior falló
always()Ejecutar sin importar el estado (limpieza)
cancelled()Verdadero si el workflow fue cancelado
contains(github.ref, 'release')Verificar si la cadena contiene
startsWith(github.ref, 'refs/tags')Verificar prefijo de cadena
hashFiles('**/lock*')SHA-256 de archivos (para claves de caché)