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.
| Ausdruck | Beschreibung |
|---|---|
github.event.pull_request.stack.number | Die Nummer des Stapels, die auf das Repository festgelegt ist. |
github.event.pull_request.stack.size | Gesamtanzahl der Pullanforderungen im Stapel. |
github.event.pull_request.stack.position | 1-basierte Position dieser Pullanforderung innerhalb des Stapels (1 ist unten). |
github.event.pull_request.stack.base.ref | Die Verzweigung des gesamten Stapels zielt letztlich auf , z main. B. . |
github.event.pull_request.stack.base.sha | Der 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.refist gleichgithub.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.positiongleich istgithub.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.