Reusable workflows

Por: Artiko
githubgithub-actionsreusable-workflowsdevops

Reusable workflows

Un reusable workflow es un workflow completo que otros workflows pueden invocar como si fuera un bloque. En vez de copiar la definición de un pipeline de deploy en veinte repos, la escribís una vez y la llamás desde cada uno. Es el siguiente escalón sobre las composite actions del capítulo anterior.

Definir un reusable workflow

Se convierte un workflow en reusable agregándole el evento workflow_call, con inputs y secrets tipados que declaran su interfaz pública:

# .github/workflows/deploy.yml (el reusable)
on:
  workflow_call:
    inputs:
      entorno:
        type: string
        required: true
    secrets:
      TOKEN_DEPLOY:
        required: true

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - run: echo "Deploy a ${{ inputs.entorno }}"

Invocarlo

Se llama desde la clave uses: a nivel de job (no de step). La sintaxis depende de dónde viva el reusable:

# el caller
jobs:
  llamar-deploy:
    uses: mi-org/mi-repo/.github/workflows/deploy.yml@v1
    with:
      entorno: production
    secrets:
      TOKEN_DEPLOY: ${{ secrets.TOKEN_DEPLOY }}

Pasaje de secrets

Este es un punto que sorprende: los secrets no se heredan automáticamente hacia el reusable workflow. Un secret de environment del caller no llega solo al workflow llamado; hay que pasarlo de forma explícita. Dos opciones:

# Opción 1: heredar todos los secrets del caller
    secrets: inherit

# Opción 2: mapeo explícito, uno por uno
    secrets:
      TOKEN_DEPLOY: ${{ secrets.TOKEN_DEPLOY }}

secrets: inherit pasa todos los secrets disponibles en el caller; el mapeo explícito es más seguro porque entrega solo lo necesario.

Límites

LímiteValor (GitHub.com / GHEC)
Profundidad de anidamientoHasta 10 niveles (un reusable que llama a otro reusable)
Reusable workflows únicos por archivoMáximo 50

Nota on-premise: estos son los límites vigentes en GitHub.com y GitHub Enterprise Cloud. Versiones más antiguas de GitHub Enterprise Server (p. ej. 3.16) tienen límites menores — del orden de 4 niveles de anidamiento y 20 workflows por archivo. Si estás en un GHES antiguo, verificá los valores de tu versión.

Reusable workflow vs composite action

Ambos combaten la repetición, pero operan en niveles distintos:

Reusable workflowComposite action
Qué defineUno o más jobs completosUna secuencia de steps
RunnerCada job estrena su propio runnerCorre dentro de un job existente
Se invoca desdejobs.<id>.uses: (nivel job)steps con uses: (nivel step)
Ubicación.github/workflows/*.yml.github/actions/<nombre>/action.yml
Cuándo usarloReutilizar un pipeline entero (build+test+deploy)Reutilizar unos pocos steps dentro de un job
flowchart TD
    subgraph RW["Reusable workflow"]
        direction TB
        RWj1["job build (runner propio)"]
        RWj2["job deploy (runner propio)"]
    end
    subgraph CA["Composite action"]
        direction TB
        CAs["step A → step B → step C<br/>(dentro de un job del caller)"]
    end

La regla práctica: si querés reutilizar jobs enteros con su propio runner, es un reusable workflow; si querés reutilizar un puñado de steps dentro de un job que ya existe, es una composite action.


AnteriorCapítulo 4: Actions avanzado · SiguienteCapítulo 6: Seguridad en Actions