Skip to main content

Optimisation de l’intégration continue pour les demandes de tirage empilées

Découvrez comment GitHub Actions les flux de travail s’exécutent pour une pile, accèdent aux métadonnées de pile dans vos flux de travail et réduisent l’utilisation redondante de ci.

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.

ExpressionDescription
github.event.pull_request.stack.numberNombre de la pile, délimité au référentiel.
github.event.pull_request.stack.sizeNombre total de demandes de tirage dans la pile.
github.event.pull_request.stack.positionPosition basée sur 1 de cette demande de tirage au sein de la pile (1 en bas).
github.event.pull_request.stack.base.refLa branche de la pile entière cible, par mainexemple .
github.event.pull_request.stack.base.shaSHA 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.ref est égal github.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.position est github.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.