Skip to main content

Enterprise Server 3.21 actualmente está disponible como versión candidata para lanzamiento.

Control de la simultaneidad de flujos de trabajo y tareas

Administra qué flujos de trabajo y trabajos se pueden ejecutar simultáneamente.

Uso de la simultaneidad en diferentes escenarios

Use jobs.<job_id>.concurrency para asegurarse de que solo se ejecute al mismo tiempo un trabajo o flujo de trabajo que use el mismo grupo de concurrencia. Un grupo de concurrencia puede ser cualquier secuencia o expresión. Contextos de expresión permitidos: github, inputs, vars, needs, strategy y matrix. Para más información sobre las expresiones, consulta Evaluación de expresiones en flujos de trabajo y acciones.

También puede especificar concurrency en el nivel de flujo de trabajo. Para más información, vea concurrency.

Esto significa que en cualquier momento puede haber a lo sumo un trabajo en ejecución y otro pendiente en un grupo de concurrencia. Cuando un trabajo o flujo de trabajo concurrente se pone en cola, si otro trabajo o flujo de trabajo que utilicen el mismo grupo de simultaneidad en el repositorio se encuentra en curso, el trabajo o flujo de trabajo en cola se mostrará como pending. Cualquier trabajo o flujo de trabajo pending existente en el mismo grupo de concurrencia, si existe, se cancelará, y el nuevo trabajo o flujo de trabajo en cola tomará su lugar.

Para cancelar también cualquier trabajo o flujo de trabajo actualmente en ejecución en el mismo grupo de simultaneidad, especifica cancel-in-progress: true. Para cancelar condicionalmente los trabajos o flujos de trabajo en ejecución actualmente en el mismo grupo de simultaneidad, puede especificar cancel-in-progress como una expresión con cualquiera de los contextos de expresión permitidos.

Nota:

  • El nombre de grupo de simultaneidad no distingue mayúsculas de minúsculas. Por ejemplo, prod y Prod se tratarán como el mismo grupo de simultaneidad.
  • Los trabajos o ejecuciones de flujo de trabajo en el mismo grupo de concurrencia se procesan en el orden primero en entrar, primero en salir (FIFO) según el momento en que cada uno comenzó a esperar en el grupo de concurrencia, no en el momento en que se envió cada flujo de trabajo. Dado que la hora de inicio real de un trabajo o ejecución puede variar, no se garantiza la ordenación.

Ejemplos: Utilizar la simultaneidad y el comportamiento predeterminado

El comportamiento predeterminado de GitHub Actions es permitir que varios trabajos o ejecuciones de flujos de trabajo se ejecuten al mismo tiempo. La concurrency palabra clave permite controlar la simultaneidad de las ejecuciones de flujo de trabajo.

Por ejemplo, puedes usar la concurrency palabra clave inmediatamente después de donde se definen las condiciones del gatillo para limitar la simultaneidad de ejecuciones de flujo de trabajo completas para una rama específica:

on:
  push:
    branches:
      - main

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

También puede limitar la simultaneidad de los trabajos dentro de un flujo de trabajo usando la concurrency palabra clave en el nivel de trabajo:

on:
  push:
    branches:
      - main

jobs:
  job-1:
    runs-on: ubuntu-latest
    concurrency:
      group: example-group
      cancel-in-progress: true

Ejemplo: Grupos de concurrencia

Los grupos de simultaneidad proporcionan un método para administrar y limitar las ejecuciones de flujos de trabajo o trabajos que comparten la misma clave de simultaneidad.

La concurrency tecla se usa para agrupar flujos de trabajo o trabajos en un grupo de concurrencia. Al definir una concurrency clave, GitHub Actions garantiza que solo se ejecute un flujo de trabajo o trabajo con esa clave en un momento dado. Si una nueva ejecución de flujo de trabajo o trabajo comienza con la misma concurrency clave, GitHub Actions cancelará cualquier flujo de trabajo o trabajo que ya se ejecute con esa clave. La concurrency clave puede ser una cadena codificada de forma rígida o puede ser una expresión dinámica que incluya variables de contexto.

Es posible definir condiciones de simultaneidad en el flujo de trabajo para que el flujo de trabajo o el trabajo formen parte de un grupo de simultaneidad.

Esto significa que cuando se inicia una ejecución o un trabajo, GitHub cancelará las ejecuciones o trabajos que ya estén en curso en el mismo grupo de concurrencia. Esto resulta útil en escenarios en los que desea evitar ejecuciones paralelas para un determinado conjunto de flujos de trabajo o trabajos, como los que se usan para las implementaciones en un entorno de ensayo, con el fin de evitar acciones que puedan provocar conflictos o consumir más recursos de los necesarios.

En este ejemplo, job-1 forma parte de un grupo de simultaneidad denominado staging_environment. Esto significa que si se desencadena una nueva ejecución de job-1, se cancelarán las ejecuciones del mismo trabajo en el grupo de simultaneidad staging_environment que ya están en curso.

jobs:
  job-1:
    runs-on: ubuntu-latest
    concurrency:
      group: staging_environment
      cancel-in-progress: true

Alternativamente, el uso de una expresión dinámica como concurrency: ci-${{ github.ref }} en el flujo de trabajo significa que el flujo de trabajo o el trabajo formarían parte de un grupo de simultaneidad denominado ci- seguido de la referencia de la rama o etiqueta que desencadenó el flujo de trabajo. En este ejemplo, si se inserta un nuevo compromiso en la rama principal mientras una ejecución anterior sigue en curso, se cancelará la ejecución anterior y se iniciará la nueva:

on:
  push:
    branches:
      - main

concurrency:
  group: ci-${{ github.ref }}
  cancel-in-progress: true

Ejemplo: Utilizar la concurrencia para cancelar cualquier tarea o ejecución en curso

Para usar la concurrencia para cancelar cualquier trabajo en curso o ejecución en GitHub Actions, puede usar la clave concurrency con la opción cancel-in-progress establecida en true.

concurrency:
  group: ${{ github.ref }}
  cancel-in-progress: true

Tenga en cuenta que en este ejemplo, sin definir un grupo de simultaneidad determinado, GitHub Actions cancelará cualquier ejecución en curso del trabajo o flujo de trabajo.

Ejemplo: Utilizar un valor de respaldo

Si compilas el nombre de grupo con una propiedad que solo se defina para eventos específicos, puedes utilizar un valor de segunda opción. Por ejemplo, github.head_ref solo se define en eventos pull_request. Si tu flujo de trabajo responde a otros eventos además de los eventos pull_request, necesitarás proporcionar una segunda opción para evitar un error de sintaxis. El siguiente grupo de simultaneidad cancela los trabajos en curso o solo se ejecuta en eventos pull_request; si github.head_ref no está definido, el grupo de simultaneidad revertirá al identificador de ejecución, que se garantiza que es único y definido para la ejecución.

concurrency:
  group: ${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

Ejemplo: Cancelar únicamente las tareas o ejecuciones en curso para el flujo de trabajo actual

Si tienes múltiples flujos de trabajo en el mismo repositorio, los nombres de los grupos de concurrencia deben ser únicos en todos los flujos de trabajo para evitar que se cancelen tareas o ejecuciones en progreso de otros flujos de trabajo. De lo contrario, cualquier tarea pendiente o previamente en curso se cancelará, sin importar el flujo de trabajo.

Para cancelar solo las ejecuciones en curso del mismo flujo de trabajo, puedes usar la propiedad github.workflow para compilar el grupo de simultaneidad:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

Ejemplo: Cancelar solo trabajos en curso en ramas específicas

Si desea cancelar trabajos en curso en determinadas ramas, pero no en otras, puede usar expresiones condicionales con cancel-in-progress. Por ejemplo, puede hacerlo si desea cancelar trabajos en curso en ramas de desarrollo, pero no en ramas de lanzamiento.

Para cancelar solo las ejecuciones en curso del mismo flujo de trabajo cuando no se ejecutan en una rama de versión, puede establecer en cancel-in-progress una expresión similar a la siguiente:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ !contains(github.ref, 'release/')}}

En este ejemplo, hacer múltiples push en una rama release/1.2.3 no cancelaría las ejecuciones en curso. Las inserciones a otra rama, como main, cancelarían las ejecuciones en curso.