Guía9 min

Reusable workflows: workflow_call, no copies el YAML entre repos

Resumen

on.workflow_call define un workflow llamable. jobs.<id>.uses: org/repo/.github/workflows/ci.yml@v1 lo invoca. Un agente que pega el mismo ci.yml en 8 repos no versiona el pin. Distinct de workflow_dispatch. Docs GitHub reusing workflows.

GitHub
Un caller con uses: org/repo/ci.yml@sha, no YAML copiado

Qué resuelve

Esta pieza se queda en la decisión práctica: qué instalar, qué riesgo agrega y cómo aplicarlo sin romper operación.

workflow_dispatch es el botón. workflow_call es función: otro workflow lo llama con uses:.

Pin SHA o tag, no @main. Un agente que apunta a main del repo de org se come el próximo commit roto.

El curso instalar un agente no cubre reusable. gh pr no versiona el pin.

Receta callee

# .github/workflows/ci.yml
on:
  workflow_call:
    inputs:
      node:
        type: string
        default: "22"
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ inputs.node }}

Caller:

jobs:
  ci:
    uses: org/tooling/.github/workflows/ci.yml@a1b2c3d
    with:
      node: "22"
    secrets: inherit

secrets: inherit pasa los secrets del caller. No lo uses en un workflow público que un fork pueda llamar.

Pin SHA, no @main

Qué no hacer

  • Copiar 200 líneas de ci.yml a cada repo “por ahora”.
  • workflow_call y pull_request en el mismo file sin entender que el callee no tiene el evento del caller igual.
  • Nested reusables más allá de lo que GitHub permite (documenta el límite).

Receta AGENTS.md

Reusable workflows: uses: owner/repo/.github/workflows/file.yml@sha
Never pin @main. secrets: inherit only for trusted callers.
Do not duplicate CI YAML across repos if a callee exists.

Caller vs callee

FAQ

¿outputs? El callee declara on.workflow_call.outputs. El caller lee needs.ci.outputs.*.

¿permissions? El caller fija permissions: del job uses. El callee no sube privilegios solo.

¿local? uses: ./.github/workflows/ci.yml en el mismo repo. Sigue siendo un call.

Verificado 2026-09-03 contra GitHub Docs reusing workflows y on.workflow_call.