Skip to main content

Otimizando a CI para solicitações de pull empilhadas

Entenda como os GitHub Actions fluxos de trabalho são executados para uma pilha, acesse metadados de pilha em seus fluxos de trabalho e reduza o uso redundante de CI.

Observação

Esse recurso está em versão prévia pública e está sujeito a alterações.

Cada solicitação de pull em uma pilha é avaliada como se tivesse como destino a base da pilha, como main. Isso mantém a qualidade consistente em todas as camadas, mas também significa que um fluxo de trabalho pode ser executado muitas vezes para uma única pilha. Este artigo explica como os fluxos de trabalho são executados para uma pilha e como reduzir o uso redundante de CI.

Como os fluxos de trabalho são executados para uma pilha

GitHub Os fluxos de trabalho de ações disparam como se cada solicitação de pull na pilha tivesse como destino a base da pilha. Um fluxo de trabalho configurado para ser executado em pull_request eventos main direcionados é executado para cada solicitação de pull na pilha, não apenas a parte inferior, portanto, nenhuma alteração de fluxo de trabalho é necessária para que suas verificações sejam executadas em toda a pilha.

Como um fluxo de trabalho é executado uma vez por solicitação de pull, uma pilha grande multiplica seu uso de CI. No entanto, você pode usar metadados de pilha para executar trabalhos caros somente onde eles são necessários.

Acessando metadados de pilha

Metadados de pilha estão disponíveis em expressões de fluxo de trabalho por meio de github.event.pull_request.stack. Essa propriedade só está presente quando a solicitação de pull pertence a uma pilha, portanto, verifique se os fluxos de trabalho filtram para ela antes de ler qualquer um de seus campos.

ExpressionDescrição
github.event.pull_request.stack.numberO número da pilha, com escopo para o repositório.
github.event.pull_request.stack.sizeNúmero total de solicitações de pull na pilha.
github.event.pull_request.stack.positionPosição baseada em 1 dessa solicitação de pull dentro da pilha (1 é a parte inferior).
github.event.pull_request.stack.base.refA ramificação de toda a pilha é direcionada, como main.
github.event.pull_request.stack.base.shaO HEAD SHA do branch base da pilha.

Por exemplo, o fluxo de trabalho a seguir lê metadados de pilha e executa a segunda etapa somente quando a pilha é direcionada a um branch cujo nome começa com 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"

Reduzindo o uso de CI

Como um fluxo de trabalho é executado para cada solicitação de pull em uma pilha, você pode usar os stack campos para executar trabalhos caros apenas nas posições que importam. Duas condições são especialmente úteis:

  • Solicitação de pull não mesclada mais baixa – a solicitação de pull atualmente na parte inferior da pilha restante. Como ele tem como destino a base de pilha diretamente, github.event.pull_request.stack.base.ref é github.event.pull_request.base.refigual a .
  • Solicitação de pull superior – a última solicitação de pull na pilha, contendo o conjunto completo de alterações. É a solicitação de pull em que github.event.pull_request.stack.position é github.event.pull_request.stack.sizeigual a .
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"

À medida que as solicitações de pull se mesclam de baixo para cima, a solicitação de pull não mesclada mais baixa é alterada. Depois que a solicitação de pull inferior chegar, a próxima solicitação de pull será rebasada para direcionar diretamente a base de pilha, portanto, ela se tornará a nova solicitação de pull não mesclada mais baixa na execução do fluxo de trabalho a seguir.

Você também pode acessar a solicitação de pull inferior original com github.event.pull_request.stack.position == 1, ou em qualquer camada específica usando position.