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 puede haber como máximo un trabajo en ejecución y otro pendiente en un grupo de simultaneidad en cualquier momento. 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 simultaneidad, si existe, se cancelará y el nuevo trabajo o flujo de trabajo en cola ocupará 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,
prodyProdse tratarán como el mismo grupo de simultaneidad. - No se garantiza la ordenación de trabajos o ejecuciones de flujo de trabajo mediante grupos de simultaneidad. Los trabajos o ejecuciones de flujo de trabajo en el mismo grupo de simultaneidad se controlan en un orden arbitrario.
Ejemplos: Utilizar la simultaneidad y el comportamiento predeterminado
El comportamiento predeterminado de GitHub Actions es permitir que varios trabajos o ejecuciones de flujo de trabajo se ejecuten simultáneamente. 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 simultaneidad
Los grupos de simultaneidad ofrecen una manera de administrar y limitar las ejecuciones de flujo de trabajo o trabajos que comparten la misma clave de simultaneidad.
La concurrency clave se usa para agrupar flujos de trabajo o trabajos en un grupo de simultaneidad. Al definir una concurrency clave, GitHub Actions garantizas 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 esté ejecutando 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 de flujo de trabajo, GitHub cancelará las ejecuciones o trabajos de flujo de trabajo que ya estén en curso en el mismo grupo de simultaneidad. 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 job o ejecución en curso
Si deseas usar la simultaneidad para cancelar cualquier trabajo en curso o ejecutarlo en GitHub Actions, puedes usar la clave concurrency con el conjunto de opciones cancel-in-progress trueen:
concurrency:
group: ${{ github.ref }}
cancel-in-progress: true
Ten en cuenta que en este ejemplo, si no se define un grupo de simultaneidad determinado, GitHub Actions se cancelará cualquier ejecución en curso del trabajo o flujo de trabajo.
Ejemplo: Utilizar un valor para segunda opción
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 los jobs o ejecuciones en curso para el flujo de trabajo actual
Si tienes flujos de trabajo múltiples en el mismo repositorio, los nombres del grupo de concurrencia deben ser únicos en todos los flujos de trabajo para evitar que se cancelen jobs o ejecuciones en curso desde otros flujos de trabajo. De otra forma, cualquier job 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 versión.
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, realizar múltiples inserciones 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.
Supervisar tus trabajos actuales en tu organización
Para identificar las restricciones con simultaneidad o puesta en cola, puede comprobar cuántos trabajos se procesan actualmente en los ejecutores hospedados en GitHub en la organización o empresa. Para más información, consulta Visualización de los trabajos actuales.