Skip to main content
Skip to content

Optimización de CI para pull requests en pila

Comprenda cómo se ejecutan los flujos de trabajo para una pila con GitHub Actions, acceda a los metadatos de la pila en los flujos de trabajo y reduzca el uso redundante de CI.

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.

ExpressionDescription
github.event.pull_request.stack.numberEl número de la pila, con ámbito en el repositorio.
github.event.pull_request.stack.sizeNúmero total de pull requests en el stack.
github.event.pull_request.stack.positionPosición basada en 1 de este pull request dentro de la pila (1 es la parte inferior).
github.event.pull_request.stack.base.refLa rama a la que finalmente apunta toda la pila, como main.
github.event.pull_request.stack.base.shaHEAD 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.ref es igual a github.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.position es igual a github.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.