Skip to main content
Publicamos actualizaciones para la documentación con frecuencia y es posible que aún se esté traduciendo esta página. Para obtener la información más reciente, consulta la documentación en inglés.
GitHub AE es una versión limitada en este momento.

Reutilización de flujos de trabajo

Aprende cómo evitar la duplicación al crear un flujo de trabajo reusando los flujos existentes.

Información general

En vez de copiar y pegar desde un flujo de trabajo hacia otro, puedes hacer flujos de trabajo reutilizables. Tú y cualquiera que tenga acceso a un flujo de trabajo reutilizable pueden entonces llamarlo desde otro flujo.

El reutilizar flujos de trabajo evita la duplicación. Esto hace que los flujos de trabajo se puedan mantener más fácilmente y te permite crear flujos de trabajo nuevos más fácilmente compilando sobre el trabajo de los demás, tal como lo haces con las acciones. La reutilización de flujos de trabajo también promueve las mejores prácticas al ayudarte a utilizar los flujos de trabajo que están bien diseñados, que ya se han probado y cuya efectividad ya se comprobó. Tu organización puede crear una librería de flujos de trabajo reutilizables que puede mantenerse centralmente.

En el diagrama siguiente se muestra una ejecución de flujo de trabajo en curso que usa un flujo de trabajo reutilizable.

  • Una vez que cada uno de los tres trabajos de compilación de la izquierda del diagrama se completa correctamente, se ejecuta un trabajo dependiente denominado "Implementar".
  • El trabajo "Implementar" llama a un flujo de trabajo reutilizable que contiene otros tres trabajos: "Almacenamiento provisional", "Revisión" y "Producción".
  • El job de despliegue "Production" solo se ejecuta después de que el job "Staging" se haya completado con éxito.
  • Cuando un trabajo tiene como destino un entorno, la ejecución del flujo de trabajo muestra una barra de progreso en la que se puede ver el número de etapas del trabajo. En el diagrama siguiente, el trabajo "Producción" contiene ocho pasos, y se puede ver cómo se está procesando el paso 6.
  • El utilizar un flujo de trabajo reutilizable para ejecutar jobs de despliegue te permite ejecutarlos para cada compilación sin duplicar el código en los flujos de trabajo.

Diagrama de un flujo de trabajo reutilizable para despliegue

A un flujo de trabajo que utiliza otro flujo de trabajo se le llama flujo de trabajo "llamante". El flujo de trabajo reutilizable es un flujo "llamado". Un flujo de trabajo llamante puede utilizar varios flujos de trabajo llamados. Cada flujo de trabajo llamado se referencia en una línea simple. El resultado es que el archivo de flujo de trabajo llamante podrá contener solo unas cuantas líneas de YAML, pero podría realizar una cantidad grande de tareas cuando se ejecute. Cuando reutilizas un flujo de trabajo, se utiliza todo el flujo de trabajo llamado justo como si fuera parte del flujo de trabajo llamante.

Si utilizas un flujo de trabajo desde un repositorio diferente, cualquier acción en el flujo de trabajo llamado se ejecutará como si fuera parte del llamante. Por ejemplo, si el flujo de trabajo al que se ha llamado usa actions/checkout, la acción comprueba el contenido del repositorio que hospeda el flujo de trabajo que ha iniciado la llamada y no el que la recibe.

Cuando un flujo de trabajo que inicia llamadas activa uno reutilizable, el contexto github siempre se asocia con el primer flujo. El flujo de trabajo al que se llama se le concede acceso automáticamente a github.token y secrets.GITHUB_TOKEN. Para obtener más información sobre el contexto github, consulte "Sintaxis de contexto y expresión para Acciones de GitHub".

Puedes ver los flujos de trabajo reutilizados que se referencian en tus flujos de trabajo de GitHub Actions como dependencias en la gráfica de dependencias del repositorio que los contiene. Para obtener más información, consulte "Acerca del gráfico de dependencias".

Flujos de trabajo reutilizables e iniciales

Los flujos de trabajo iniciales permiten que toda persona en tu organización que tenga permiso para crear flujos de trabajo lo haga de forma más fácil y rápida. Cuando las personas crean un flujo de trabajo nuevo, pueden elegir un flujo de trabajo inicial y parte o todo el trabajo de escribir dicho flujo de trabajo se hará automáticamente. Dentro de un flujo de trabajo inicial, también puedes referenciar los flujos de trabajo reutilizables para hacer más fácil que las personas se beneficien de reutilizar el código de flujo de trabajo que se administra centralmente. Si utilizas un SHA de confirmación cuando referencias el flujo de trabajo reutilizable, puedes garantizar que todo aquél que reutilice ese flujo de trabajo siempre estará utilizando el mismo código de YAML. Sin embargo, si referencias un flujo de trabajo reutilizable mediante una etiqueta o rama, asegúrate de que puedas confiar en esa versión del flujo de trabajo. Para obtener más información, consulte "Protección de seguridad de GitHub Actions".

Para obtener más información, consulte "Creación de flujos de trabajo de inicio para la organización".

Acceso a los flujos de trabajo reutilizables

Un flujo de trabajo reutilizable puede utilizar otro de ellos si alguna de las siguientes condiciones es verdadera:

  • Ambos flujos de trabajo están en el mismo repositorio.
  • El flujo de trabajo que recibe la llamada se almacena en un repositorio público.
  • El flujo de trabajo llamado se almacena en un repositorio interno y los ajustes de dicho repositorio permiten que se acceda a él. Para más información, consulta "Administración de la configuración de GitHub Actions para un repositorio".

Utilizar ejecutores

Los flujos de trabajo llamados que pertenecen al mismo usuario u organización o empresa que el flujo de trabajo llamante pueden acceder a los ejecutores auto-hospedados desde el contexto del llamante. Esto significa que el flujo de trabajo llamado puede acceder a los ejecutores auto-hospedados que están:

  • En el repositorio del llamador
  • En la organización o empresa, de la organización del repositorio, siempre y cuando se haya hecho disponible al ejecutor para el repositorio llamante

Limitaciones

  • Los flujos de trabajo reutilizables no pueden llamar a otros que también sean reutilizables.
  • Puedes llamar un máximo de 20 flujos de trabajo reutilizables desde un único archivo de flujo de trabajo.
  • Los flujos de trabajo reutilizables almacenados en un repositorio privado solo los pueden usar los flujos de trabajo dentro del mismo repositorio. * La propiedad strategy no se admite en ningún trabajo que llame a un flujo de trabajo reutilizable.
  • Las variables de entorno que se configuren en un contexto env y que se definan a nivel del flujo de trabajo que inicia la llamada no se propagan al flujo de trabajo que recibe la llamada. Para más información, consulta "Variables" y "Contextos".
  • Para reutilizar variables en varios flujos de trabajo, debes establecerlas en los niveles de organización, repositorio o entorno, y hacer referencia a ellas mediante el contexto vars. Para más información, consulta "Variables" y "Contextos".
  • No puedes usar un flujo de trabajo reutilizable desde otro repositorio si usas una acción compuesta. Para obtener más información, consulte "Acerca de las acciones personalizadas".

Crear un flujo de trabajo reutilizable

Los flujos de trabajo reutilizables son archivos con formato YAML, muy similares a cualquier otro archivo de flujo de trabajo. Al igual que con otros archivos de flujo de trabajo, puede buscar flujos de trabajo reutilizables en el directorio .github/workflows de un repositorio. No se admiten subdirectorios del directorio workflows.

Para que un flujo de trabajo sea reutilizable, los valores de on deben incluir workflow_call:

on:
  workflow_call:

Utilizar entradas y secretos en un flujo de trabajo reutilizable

Puedes definir entradas y secretos, las cuales pueden pasarse desde el flujo de trabajo llamante y luego utilizarse dentro del flujo llamado. Existen tres etapas para utilizar una entrada o un secreto en un flujo de trabajo reutilizable.

  1. En el flujo de trabajo reutilizable, use las palabras clave inputs y secrets para definir entradas o secretos que se enviarán desde un flujo de trabajo que inicia una llamada.

    on:
      workflow_call:
        inputs:
          config-path:
            required: true
            type: string
        secrets:
          envPAT:
            required: true
    

    Para obtener más información sobre la sintaxis para definir entradas y secretos, consulte on.workflow_call.inputs y on.workflow_call.secrets.

  2. En el flujo de trabajo reutilizable, haz referencia a la entrada o el secreto que definiste en la clave on del paso anterior.

    jobs:
      reusable_workflow_job:
        runs-on: ubuntu-latest
        environment: production
        steps:
        - uses: actions/labeler@v4
          with:
            repo-token: ${{ secrets.envPAT }}
            configuration-path: ${{ inputs.config-path }}
    

    En el ejemplo anterior, envPAT es un secreto de entorno que se ha agregado al entorno production. Por lo tanto, este ambiente se referencia dentro del job.

    Nota: Los secretos de entorno son cadenas cifradas que se almacenan en un entorno definido para un repositorio. Los secretos de ambiente solo se encuentran disponibles para los jobs de flujo de trabajo que referencian al ambiente adecuado. Para más información, vea "Uso de entornos para la implementación".

  3. Pasa la entrada o secreto desde el flujo de trabajo llamante.

    Para pasar entradas con nombre a un flujo de trabajo con nombre, use la palabra clave with en un trabajo. Use la palabra clave secrets para pasar secretos con nombre. Para las entradas, el tipo de datos del valor de entrada debe empatar con el tipo especificado en el flujo de trabajo llamado (ya sea booleano, número o secuencia).

    jobs:
      call-workflow-passing-data:
        uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main
        with:
          config-path: .github/labeler.yml
        secrets:
          envPAT: ${{ secrets.envPAT }}
    

Flujo de trabajo reutilizable de ejemplo

Este archivo de flujo de trabajo reutilizable llamado workflow-B.yml (nos referiremos a él más adelante en el flujo de trabajo llamante de ejemplo) toma una cadena de entrada y un secreto del flujo que inicia la llamada y lo utiliza en una acción.

YAML
name: Reusable workflow example

on:
  workflow_call:
    inputs:
      config-path:
        required: true
        type: string
    secrets:
      token:
        required: true

jobs:
  triage:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/labeler@v4
      with:
        repo-token: ${{ secrets.token }}
        configuration-path: ${{ inputs.config-path }}

Llamar a un flujo de trabajo reutilizable

Para llamar a un flujo de trabajo reutilizable, use la palabra clave uses. A diferencia de cuando utilizas acciones en un flujo de trabajo, los flujos de trabajo reutilizables se llaman directamente desde un job y no dentro de los pasos de un job.

jobs.<job_id>.uses

Para hacer referencia a archivos de flujos de trabajo reutilizables, usa la sintaxis:

  • {owner}/{repo}/.github/workflows/{filename}@{ref}

{ref} puede ser un SHA, una etiqueta de versión o un nombre de rama. Utilizar el SHA de la confirmación es lo más seguro para la estabilidad y seguridad. Para más información, vea "Refuerzo de la seguridad para Acciones de GitHub".

Puedes llamar a flujos de trabajo múltiples, referenciando cada uno en un job separado.

jobs:
  call-workflow-1-in-local-repo:
    uses: octo-org/this-repo/.github/workflows/workflow-1.yml@172239021f7ba04fe7327647b213799853a9eb89
  call-workflow-in-another-repo:
    uses: octo-org/another-repo/.github/workflows/workflow.yml@v1

Pasar entradas y secretos a un flujo de trabajo reutilizable

Para pasar entradas con nombre a un flujo de trabajo con nombre, use la palabra clave with en un trabajo. Use la palabra clave secrets para pasar secretos con nombre. Para las entradas, el tipo de datos del valor de entrada debe empatar con el tipo especificado en el flujo de trabajo llamado (ya sea booleano, número o secuencia).

jobs:
  call-workflow-passing-data:
    uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main
    with:
      config-path: .github/labeler.yml
    secrets:
      envPAT: ${{ secrets.envPAT }}

Palabras clave compatibles con los jobs que llaman a un flujo de trabajo reutilizable

Cuando llamas a un flujo de trabajo reutilizable, solo puedes utilizar las siguientes palabras clave en el job que contiene la llamada:

Flujo de trabajo llamante de ejemplo

Este archivo de flujo de trabajo llama a otros dos archivos de flujo de trabajo. El segundo, workflow-B.yml (que se muestra en el flujo de trabajo reutilizable de ejemplo), recibe una entrada (config-path) y un secreto (token).

YAML
name: Call a reusable workflow

on:
  pull_request:
    branches:
      - main

jobs:
  call-workflow:
    uses: octo-org/example-repo/.github/workflows/workflow-A.yml@v1

  call-workflow-passing-data:
    permissions:
      contents: read
      pull-requests: write
    uses: octo-org/example-repo/.github/workflows/workflow-B.yml@main
    with:
      config-path: .github/labeler.yml
    secrets:
      token: ${{ secrets.GITHUB_TOKEN }}

Utilizar salidas desde un flujo de trabajo reutilizable

Un flujo de trabajo reutilizable podría generar datos que quieras utilizar en el flujo de trabajo llamante. Para utilizar estas salidas, debes especificarlas como las salidas del flujo de trabajo reutilizable

Los siguientes flujos de trabajo reutilizables tienen un solo job que contiene dos pasos. En cada uno de estos pasos, configuramos una sola palabra como la salida: "hello" y "world". En la sección outputs del trabajo, asignamos estas salidas de paso a las salidas de trabajo llamadas: output1 y output2. En la sección on.workflow_call.outputs, definimos dos salidas para el propio flujo de trabajo: una denominada firstword que se asigna a output1 y otra denominada secondword que se asigna a output2.

YAML
name: Reusable workflow

on:
  workflow_call:
    # Map the workflow outputs to job outputs
    outputs:
      firstword:
        description: "The first output string"
        value: ${{ jobs.example_job.outputs.output1 }}
      secondword:
        description: "The second output string"
        value: ${{ jobs.example_job.outputs.output2 }}

jobs:
  example_job:
    name: Generate output
    runs-on: ubuntu-latest
    # Map the job outputs to step outputs
    outputs:
      output1: ${{ steps.step1.outputs.firstword }}
      output2: ${{ steps.step2.outputs.secondword }}
    steps:
      - id: step1
        run: echo "::set-output name=firstword::hello"
      - id: step2
        run: echo "::set-output name=secondword::world"

Ahora podemos utilizar las salidas en el flujo de trabajo llamante, de la misma forma en la que utilizarías las salidas de un job dentro del mismo flujo de trabajo. Hacemos referencia a las salidas mediante los nombres definidos a nivel de flujo de trabajo en el flujo de trabajo reutilizable: firstword y secondword. En este flujo de trabajo, job1 llama al flujo de trabajo reutilizable y job2 imprime las salidas del flujo de trabajo reutilizable ("hola mundo") a la salida estándar del registro de flujo de trabajo.

YAML
name: Call a reusable workflow and use its outputs

on:
  workflow_dispatch:

jobs:
  job1:
    uses: octo-org/example-repo/.github/workflows/called-workflow.yml@v1

  job2:
    runs-on: ubuntu-latest
    needs: job1
    steps:
      - run: echo ${{ needs.job1.outputs.firstword }} ${{ needs.job1.outputs.secondword }}

Para obtener más información sobre el uso de salidas de trabajo, consulte "Sintaxis de flujo de trabajo para GitHub Actions".

Monitorear qué flujos de trabajo se están utilizando

Puedes utilizar la API de REST de GitHub para monitorear cómo se utilizan los flujos de trabajo reutilizables. La acción de registro de auditoría prepared_workflow_job se desencadena cuando se inicia un trabajo de flujo de trabajo. Entre los datos registrados se incluyen:

  • repo: la organización o el repositorio donde se ubica el trabajo de flujo de trabajo. Para un job que llama a otro flujo de trabajo, esta es la organización/repositorio del flujo llamador.

  • @timestamp: la fecha y hora en que se inició el trabajo, en formato de tiempo de Unix.

  • job_name: el nombre del trabajo que se ejecutó.

  • job_workflow_ref: el archivo de flujo de trabajo que se usó, con el formato {owner}/{repo}/{path}/{filename}@{ref}. Para un job que llama a otro flujo de trabajo, esto identifica al flujo llamado.

Para obtener información sobre el uso de la API de REST para consultar el registro de auditoría de una organización, consulte "Organizaciones".

Nota: Los datos de auditoría de prepared_workflow_job solo se pueden ver mediante la API de REST. No se puede ver en la interfaz web de GitHub ni se incluye en los datos de auditoría exportados en JSON/CSV.

Pasos siguientes

Para continuar el aprendizaje sobre GitHub Actions, consulte "Eventos que desencadenan flujos de trabajo".