Skip to main content

Optimieren von CI für gestapelte Pullanforderungen

Verstehen, wie GitHub Actions Workflows für einen Stapel ausgeführt werden, Zugriffsstapelmetadaten in Ihren Workflows und reduzieren redundante CI-Nutzung.

Hinweis

Dieses Feature befindet sich in der öffentlichen Vorschau und kann geändert werden.

Jede Pullanforderung in einem Stapel wird ausgewertet, als ob sie auf die Basis des Stapels ausgerichtet ist, z main. B. . Dadurch bleibt die Qualität auf jeder Ebene konsistent, bedeutet aber auch, dass ein Workflow viele Male für einen einzelnen Stapel ausgeführt werden kann. In diesem Artikel wird erläutert, wie Workflows für einen Stapel ausgeführt werden und wie Sie die redundante CI-Nutzung reduzieren.

Ausführen von Workflows für einen Stapel

GitHub Aktionsworkflows lösen aus, als ob jede Pullanforderung im Stapel auf die Basis des Stapels ausgerichtet ist. Ein Workflow, der für die Ausführung für pull_request Ereignisse main konfiguriert ist, die für jede Pullanforderung im Stapel ausgeführt werden, nicht nur die untere, sodass keine Workflowänderungen erforderlich sind, damit Ihre Prüfungen im gesamten Stapel ausgeführt werden.

Da ein Workflow einmal pro Pullanforderung ausgeführt wird, multipliziert ein großer Stapel Ihre CI-Verwendung. Sie können jedoch Stapelmetadaten verwenden, um teure Aufträge nur dort auszuführen, wo sie benötigt werden.

Zugreifen auf Stapelmetadaten

Stapelmetadaten sind in Workflowausdrücken über github.event.pull_request.stack. Diese Eigenschaft ist nur vorhanden, wenn die Pullanforderung zu einem Stapel gehört. Stellen Sie daher sicher, dass Ihre Workflows vor dem Lesen eines der zugehörigen Felder filtern.

AusdruckBeschreibung
github.event.pull_request.stack.numberDie Nummer des Stapels, die auf das Repository festgelegt ist.
github.event.pull_request.stack.sizeGesamtanzahl der Pullanforderungen im Stapel.
github.event.pull_request.stack.position1-basierte Position dieser Pullanforderung innerhalb des Stapels (1 ist unten).
github.event.pull_request.stack.base.refDie Verzweigung des gesamten Stapels zielt letztlich auf , z main. B. .
github.event.pull_request.stack.base.shaDer HEAD SHA des Basiszweigs des Stapels.

Der folgende Workflow liest beispielsweise Stapelmetadaten und führt den zweiten Schritt nur aus, wenn der Stapel auf eine Verzweigung ausgerichtet ist, deren Name beginnt 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"

Verringern der CI-Nutzung

Da ein Workflow für jede Pullanforderung in einem Stapel ausgeführt wird, können Sie die stack Felder verwenden, um teure Aufträge nur an den wichtigen Positionen auszuführen. Zwei Bedingungen sind besonders nützlich:

  • Niedrigste nicht zusammengeführte Pullanforderung – die Pullanforderung , die sich derzeit am unteren Rand des verbleibenden Stapels befindet. Da sie direkt auf die Stapelbasis ausgerichtet ist, github.event.pull_request.stack.base.ref ist gleich github.event.pull_request.base.ref.
  • Obere Pullanforderung – die letzte Pullanforderung im Stapel, die den vollständigen Satz von Änderungen enthält. Es ist die Pull-Anforderung, wobei github.event.pull_request.stack.position gleich ist 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"

Wenn Pullanforderungen von unten nach oben zusammengeführt werden, ändert sich die niedrigste nicht zusammengeführte Pullanforderung. Sobald die untere Pullanforderung gelandet ist, wird die nächste Pullanforderung so neu erstellt, dass sie direkt auf die Stapelbasis ausgerichtet ist, sodass sie die neue niedrigste nicht zusammengeführte Pullanforderung für die folgende Workflowausführung wird.

Sie können auch auf der ursprünglichen unteren Pullanforderung mit github.event.pull_request.stack.position == 1oder auf einer bestimmten Ebene mit position.