Cada solicitud de extracción de una pila se evalúa como si tuviera como destino la base de la pila, como por ejemplo main. Esto mantiene la calidad coherente en cada capa, pero también significa que un flujo de trabajo se puede ejecutar muchas veces para un solo stack. En este artículo se explica cómo se ejecutan los flujos de trabajo para un stack y cómo reducir el uso redundante de CI.
Cómo se ejecutan los flujos de trabajo para un stack
GitHub Los flujos de trabajo de Actions se desencadenan como si cada pull request de la pila tuviera como destino la base de la pila. Un flujo de trabajo configurado para ejecutarse en pull_request eventos dirigidos a main se ejecuta para cada solicitud de incorporación de cambios de la pila, no solo la inferior, por lo que no se requieren cambios en el flujo de trabajo para que las comprobaciones se ejecuten en toda la pila.
Dado que un flujo de trabajo se ejecuta una vez por pull request, una pila grande multiplica el uso de CI. Sin embargo, puede usar metadatos de pila para ejecutar trabajos costosos solo cuando sean necesarios.
Acceder a los metadatos de la pila
Los metadatos de pila están disponibles en expresiones de flujo de trabajo a través de github.event.pull_request.stack. Esta propiedad solo está presente cuando la solicitud de incorporación de cambios pertenece a una pila, por lo que asegúrese de que los flujos de trabajo filtren por ella antes de leer cualquiera de sus campos.
| Expression | Description |
|---|---|
github.event.pull_request.stack.number | El número de la pila, con ámbito en el repositorio. |
github.event.pull_request.stack.size | Número total de pull requests en el stack. |
github.event.pull_request.stack.position | Posición basada en 1 de este pull request dentro de la pila (1 es la parte inferior). |
github.event.pull_request.stack.base.ref | La rama a la que finalmente apunta toda la pila, como main. |
github.event.pull_request.stack.base.sha | HEAD SHA de la rama base de la pila. |
Por ejemplo, el siguiente flujo de trabajo lee los metadatos de la pila y ejecuta el segundo paso solo cuando la pila tiene como destino una rama cuyo nombre comienza por release/.
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Show stack info
if: github.event.pull_request.stack != null
run: |
echo "Stack base ref: ${{ github.event.pull_request.stack.base.ref }}"
echo "PR ${{ github.event.pull_request.stack.position }} of ${{ github.event.pull_request.stack.size }} in the stack"
- name: Run only when the stack targets a release branch
if: github.event.pull_request.stack != null && startsWith(github.event.pull_request.stack.base.ref, 'release/')
run: echo "This stack targets a release branch"
Reducción del uso de CI
Dado que un flujo de trabajo se ejecuta para cada solicitud de incorporación de cambios en un stack, puede usar los campos stack para ejecutar trabajos costosos solo en las posiciones que importan. Dos condiciones son especialmente útiles:
- Solicitud de incorporación de cambios sin combinar más baja: la solicitud de incorporación de cambios actualmente en la parte inferior de la pila restante, que tiene como destino la base de la pila directamente. Es la pull request donde
github.event.pull_request.stack.base.refes igual agithub.event.pull_request.base.ref. - Pull request superior: la última pull request de la pila, que contiene el conjunto completo de cambios. Es la pull request donde
github.event.pull_request.stack.positiones igual agithub.event.pull_request.stack.size.
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Run for the lowest unmerged pull request in the stack
if: github.event.pull_request.stack != null && github.event.pull_request.stack.base.ref == github.event.pull_request.base.ref
run: echo "Lowest unmerged pull request in the stack"
- name: Run for the top pull request in the stack
if: github.event.pull_request.stack != null && github.event.pull_request.stack.position == github.event.pull_request.stack.size
run: echo "Top pull request in the stack"
A medida que las pull requests se combinan de abajo arriba, cambia la pull request sin combinar más baja. Una vez que llega la pull request inferior, la siguiente pull request se reajusta para apuntar directamente a la base de la pila, por lo que se convierte en la nueva pull request no fusionada más baja en la siguiente ejecución del flujo de trabajo.
También puede aplicar la regla a la pull request inferior original con github.event.pull_request.stack.position == 1, o a cualquier capa específica con position.