🚀 GitHub Actions Cheatsheet Completo 🚀

GitHub Actions es una plataforma de CI/CD que te permite automatizar flujos de trabajo de desarrollo de software directamente desde tu repositorio de GitHub. Puedes crear workflows personalizados que se ejecutan en respuesta a eventos de GitHub (como pushes, pull requests, creación de issues) o en un cronograma.


1. 🌟 Conceptos Clave


2. 🛠️ Estructura Básica de un Workflow (.github/workflows/*.yml)

Todos los workflows se definen en archivos YAML dentro del directorio .github/workflows/ en la raíz de tu repositorio.

# .github/workflows/my-first-workflow.yml
name: Mi Primer Workflow de CI # Nombre visible del workflow

on: # Define los eventos que disparan este workflow
  push:
    branches: [ "main", "develop" ] # Se ejecuta en cada push a estas ramas
  pull_request:
    branches: [ "main" ] # Se ejecuta en cada Pull Request a la rama main
  workflow_dispatch: {} # Permite ejecutar el workflow manualmente desde GitHub UI

jobs: # Define uno o más trabajos
  build-and-test: # ID único del trabajo
    name: Construir y Probar la Aplicación # Nombre visible del trabajo
    runs-on: ubuntu-latest # Especifica el runner (ubuntu-latest, windows-latest, macos-latest)

    steps: # Una secuencia de pasos
      - name: Checkout del Repositorio # Nombre del paso
        uses: actions/checkout@v4 # Usa una Action predefinida para clonar el repositorio

      - name: Configurar Node.js # Configura el entorno de Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '18' # Versión específica de Node.js

      - name: Instalar Dependencias # Ejecuta un comando de shell
        run: npm ci # 'npm ci' es mejor para CI/CD que 'npm install'

      - name: Ejecutar Pruebas Unitarias
        run: npm test

      - name: Ejecutar Build de Producción
        run: npm run build # Asume que tu package.json tiene un script 'build'

  deploy: # Otro trabajo, que depende del anterior
    name: Desplegar a Producción
    runs-on: ubuntu-latest
    needs: [build-and-test] # Este trabajo se ejecutará SÓLO si 'build-and-test' se completa con éxito
    if: github.ref == 'refs/heads/main' # Condición para ejecutar este job (solo en push a main)

    steps:
      - name: Checkout de nuevo (si es necesario)
        uses: actions/checkout@v4

      - name: Desplegar Aplicación
        env: # Variables de entorno para este paso/job
          DEPLOY_HOST: ${{ secrets.FTP_HOST }} # Acceso a un secreto
          DEPLOY_USER: ${{ secrets.FTP_USER }}
          DEPLOY_PASS: ${{ secrets.FTP_PASS }}
        run: | # Multi-línea de comando de shell
          echo "Desplegando a ${{ env.DEPLOY_HOST }}..."
          # ftp -n $DEPLOY_HOST &lt;<END_SCRIPT
          # user $DEPLOY_USER $DEPLOY_PASS
          # put build/index.html /var/www/html/index.html
          # END_SCRIPT
          echo "Despliegue completado!"

3. 🎯 Eventos (on) - Disparadores del Workflow

Define cuándo se ejecuta el workflow.


4. 🏃 Runners (runs-on)

El entorno donde se ejecutan los jobs.


5. 🧰 Pasos (steps) y Acciones (uses, run)

5.1. uses: <action> (Usar una Action)

5.2. run: <command> (Ejecutar Comandos de Shell)

- name: Ejecutar un comando simple
  run: echo "Hola desde un comando de shell"

- name: Ejecutar múltiples comandos
  run: | # Usa | para comandos multilínea
    npm install
    npm test --coverage
    ./scripts/deploy.sh

5.3. Entradas (with) y Salidas (outputs)


6. 🔒 Variables, Contextos y Secretos

6.1. Variables de Entorno (env)

6.2. Contextos (${{ <context>.<property> }})

Objetos globales que contienen información.

6.3. Secretos (secrets)


7. ⚖️ Expresiones Condicionales (if)

Ejecuta un step o job solo si una condición es verdadera.

- name: Ejecutar solo si es un push a main
  if: github.event_name == 'push' && github.ref == 'refs/heads/main'
  run: echo "Desplegando..."

- name: Ejecutar solo si el job anterior falló
  if: failure()
  run: echo "El job anterior falló, enviando notificación de error."

- name: Ejecutar solo si el job anterior fue exitoso
  if: success()
  run: echo "El job anterior fue exitoso."

- name: Ejecutar siempre (incluso si el job anterior falló)
  if: always()
  run: echo "Este paso siempre se ejecuta."

- name: Ejecutar si una variable es verdadera
  if: ${{ env.FEATURE_FLAG == 'true' }}
  run: echo "Feature activada."

8. 📊 Estrategia de Matriz (strategy.matrix)

Ejecuta un job con múltiples configuraciones.

jobs:
  build-matrix:
    runs-on: ${{ matrix.os }} # El SO variará según la matriz
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest] # Array de sistemas operativos
        node_version: [16, 18, 20] # Array de versiones de Node.js
    steps:
      - uses: actions/checkout@v4
      - name: Setup Node.js ${{ matrix.node_version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node_version }}
      - name: Instalar dependencias y probar
        run: npm ci && npm test

9. 💡 Buenas Prácticas y Consejos


Este cheatsheet te proporciona una referencia completa de GitHub Actions, cubriendo sus conceptos esenciales, estructura de workflows, eventos, tipos de jobs, gestión de variables y secretos, y las mejores prácticas para construir pipelines de CI/CD automatizados y robustos.