Chaque pull request dans une stack est évaluée comme si elle cible la base de la stack, 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 stack. Cet article explique comment les workflows s’exécutent pour une stack et comment réduire l’utilisation redondante de l’intégration continue.
Comment les workflows s’exécutent dans une pile
GitHub Les workflows d’actions se déclenchent comme si chaque pull request dans la pile cible la base de la pile. Un flux de travail configuré pour s’exécuter sur les événements pull_request ciblant main s’exécute pour chaque pull request dans la pile, pas seulement celle du bas, donc aucune modification du flux de travail n’est requise pour que vos vérifications s’exécutent sur l’ensemble de la pile.
Étant donné qu’un workflow s’exécute une fois par pull request, une pile importante multiplie votre utilisation de CI. Toutefois, vous pouvez utiliser les métadonnées de pile pour exécuter des tâches coûteuses uniquement lorsqu’elles 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 pull request appartient à une stack. 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 | Numéro de la pile, limité au dépôt. |
github.event.pull_request.stack.size | Nombre total de pull requests dans la stack. |
github.event.pull_request.stack.position | Position basée sur 1 de cette pull request au sein de la pile (1 en bas). |
github.event.pull_request.stack.base.ref | La branche vers laquelle toute la pile pointe finalement, comme main. |
github.event.pull_request.stack.base.sha | Le HEAD SHA 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éduire l’utilisation de CI
Étant donné qu’un flux de travail s’exécute pour chaque pull request dans une pile, vous pouvez utiliser les champs stack pour exécuter des tâches coûteuses uniquement aux emplacements pertinents. Deux conditions sont particulièrement utiles :
- Pull request non fusionnée la plus en bas de la pile — la pull request actuellement en bas de la pile restante, ciblant directement la base de la pile. Il s’agit de la demande de fusion où
github.event.pull_request.stack.base.refest égal àgithub.event.pull_request.base.ref. - Pull request du haut — la dernière pull request de la pile, contenant l’ensemble complet des modifications. Il s’agit de la pull request où
github.event.pull_request.stack.positionest égal à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"
À mesure que les pull requests sont fusionnées de bas en haut, la pull request non fusionnée la plus basse change. Une fois que la pull request inférieure est fusionnée, la pull request suivante est rebasée pour cibler directement la base de la pile, de sorte qu’elle devient la pull request non fusionnée la plus basse de la pile lors de l’exécution suivante du workflow.
Vous pouvez également appliquer un verrouillage sur la pull request de base d’origine avec github.event.pull_request.stack.position == 1, ou sur n’importe quel layer spécifique à l’aide de position.