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.
| Expression | Descrição |
|---|---|
github.event.pull_request.stack.number | O número da pilha, com escopo para o repositório. |
github.event.pull_request.stack.size | Número total de solicitações de pull na pilha. |
github.event.pull_request.stack.position | Posição baseada em 1 dessa solicitação de pull dentro da pilha (1 é a parte inferior). |
github.event.pull_request.stack.base.ref | A ramificação de toda a pilha é direcionada, como main. |
github.event.pull_request.stack.base.sha | O 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.