Remarque
Cette fonctionnalité est disponible en préversion publique et peut être modifiée.
Chaque demande de tirage dans une pile est évaluée comme si elle cible la base de la pile, par exemple main. Cela maintient la cohérence de la qualité sur chaque couche, mais cela signifie également qu’un flux de travail peut s’exécuter plusieurs fois pour une seule pile. Cet article explique comment les flux de travail s’exécutent pour une pile et comment réduire l’utilisation redondante de l’intégration continue.
Comment les flux de travail s’exécutent pour une pile
GitHub Les workflows d’actions se déclenchent comme si chaque demande de tirage dans la pile cible la base de la pile. Un flux de travail configuré pour s’exécuter sur pull_request les événements ciblant les main exécutions pour chaque demande de tirage dans la pile, pas seulement le bas, donc aucune modification de flux de travail n’est requise pour que vos vérifications s’exécutent sur l’ensemble de la pile.
Étant donné qu’un flux de travail s’exécute une fois par demande de tirage, une grande pile multiplie votre utilisation ci. Toutefois, vous pouvez utiliser les métadonnées de pile pour exécuter des travaux coûteux uniquement lorsqu’ils sont nécessaires.
Accès aux métadonnées de pile
Les métadonnées de pile sont disponibles dans les expressions de flux de travail via github.event.pull_request.stack. Cette propriété est présente uniquement lorsque la demande de tirage appartient à une pile. Assurez-vous donc que vos flux de travail filtrent dessus avant de lire l’un de ses champs.
| Expression | Description |
|---|---|
github.event.pull_request.stack.number | Nombre de la pile, délimité au référentiel. |
github.event.pull_request.stack.size | Nombre total de demandes de tirage dans la pile. |
github.event.pull_request.stack.position | Position basée sur 1 de cette demande de tirage au sein de la pile (1 en bas). |
github.event.pull_request.stack.base.ref | La branche de la pile entière cible, par mainexemple . |
github.event.pull_request.stack.base.sha | SHA HEAD de la branche de base de la pile. |
Par exemple, le flux de travail suivant lit les métadonnées de pile et exécute la deuxième étape uniquement lorsque la pile cible une branche dont le nom commence par 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"
Réduction de l’utilisation de l’intégration continue
Étant donné qu’un flux de travail s’exécute pour chaque demande de tirage dans une pile, vous pouvez utiliser les stack champs pour exécuter des travaux coûteux uniquement aux positions qui comptent. Deux conditions sont particulièrement utiles :
- Demande de tirage non fusionnée la plus basse : la demande de tirage en bas de la pile restante. Étant donné qu’il cible directement la base de la pile,
github.event.pull_request.stack.base.refest égalgithub.event.pull_request.base.refà . - Demande de tirage supérieure : dernière demande de tirage dans la pile, contenant l’ensemble complet de modifications. Il s’agit de la demande de tirage où
github.event.pull_request.stack.positionestgithub.event.pull_request.stack.sizeégale .
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"
À mesure que les demandes de tirage fusionnent à partir du bas en haut, les modifications de demande de tirage non fusionnées les plus basses. Une fois que la demande de tirage inférieure atterrit, la demande de tirage suivante est rebase pour cibler directement la base de la pile, de sorte qu’elle devient la nouvelle demande de tirage non fusionnée la plus basse lors de l’exécution de workflow suivante.
Vous pouvez également effectuer une porte sur la demande de tirage en bas d’origine avec github.event.pull_request.stack.position == 1, ou sur n’importe quelle couche spécifique à l’aide position.