Automatisches Neustarten deines GitHub-Workflows nach einem Fehlschlag
Manchmal ist dein GitHub Actions-Workflow launisch und schlägt aus zufälligen Gründen fehl. Lass uns sehen, wie du ihn automatisch neu starten kannst, um Zeit zu sparen.
Einführung
Wir lieben GitHub Actions. Es ist leistungsstark und bietet eine großzügige kostenlose Stufe.
Während unser Projekt wächst, haben wir immer mehr Integrationstests hinzugefügt, die in unserem GitHub Actions-Workflow ausgeführt werden sollen. Wie bei anderen coolen Projekten führen wir unsere Tests bei jedem Pull Request, Push und Release aus.
Allerdings schlägt unser Workflow aufgrund der Natur von Integrationstests manchmal aus zufälligen Gründen fehl. Es könnte ein Netzwerkproblem, ein Browser-Hickup oder andere schwer reproduzierbare Gründe sein.
Wenn der Workflow fehlschlägt, müssen wir ihn manuell neu starten. Am Anfang ist das keine große Sache, aber für hocheffiziente Entwickler wie uns ist es dennoch ärgerlich.
Wie es funktioniert
Zum Zeitpunkt des Schreibens bietet GitHub Actions keine eingebaute Möglichkeit, einen fehlgeschlagenen Workflow automatisch neu zu starten. Schauen wir also, wie wir dies erreichen können.
Wenn ein Workflow NICHT läuft und fehlgeschlagen ist, kannst du ihn manuell neu starten, indem du auf die Schaltfläche "Jobs erneut ausführen" klickst. Es wird ein Dropdown-Menü geöffnet und bietet eine nette Option "Fehlgeschlagene Jobs erneut ausführen", um die erfolgreichen Jobs zu überspringen.
Die Idee ist also einfach:
- Wir müssen erkennen, wann ein Workflow fehlgeschlagen ist.
- Wir müssen die Neustart-Aktion NACHDEM der Workflow abgeschlossen ist, auslösen.
Offensichtlich können wir dies nicht im selben Workflow tun, da ein Workflow nichts tun kann, wenn er nicht läuft. Also benötigen wir einen anderen Workflow, um den Status des vorherigen Workflows zu überwachen und die Neustart-Aktion auszulösen. Dies kann wie folgt veranschaulicht werden:
Aktualisiere deine Workflows
Erstelle eine neue Workflow-Datei in deinem Repository, z.B. .github/workflows/rerun.yml
:
Dank der GitHub CLI können wir den Status eines Workflows einfach überwachen und ihn mit zwei einfachen Befehlen neu starten:
gh run watch
, um den Status eines Workflows zu überwachen (Dokumentation hier).gh run rerun
, um einen Workflow erneut auszuführen. Das Flag--failed
führt nur die fehlgeschlagenen Jobs erneut aus (Dokumentation hier).
Alles, was du tun musst, ist die run_id
des fehlgeschlagenen Workflows bereitzustellen, was durch Verwendung des github.run_id
-Kontexts geschehen kann. Zum Beispiel kannst du den Neustart-Workflow auslösen, indem du den folgenden Schritt zu deinem Original-Workflow hinzufügst:
Die Bedingung if: failure()
löst den Schritt nur aus, wenn der Job fehlgeschlagen ist. Die Bedingung fromJSON(github.run_attempt) < 3
führt nur die ersten 2 Versuche erneut aus. Du kannst die Anzahl entsprechend deiner Bedürfnisse anpassen.
Dieser Schritt verwendet den Befehl gh workflow run
, um den Neustart-Workflow auszulösen. Siehe die Dokumentation für weitere Details.
Bonus: Den Neustart-Workflow aus dem fehlerhaften Branch ausführen
Wenn du den Neustart-Workflow aus dem fehlerhaften Branch und nicht aus dem Standard-Branch ausführen möchtest, kannst du den folgenden Befehl verwenden:
Der Kontext github.head_ref
wird verwendet, wenn es sich um einen Pull Request handelt, ansonsten wird github.ref_name
verwendet.
Credits
Die Idee für diesen Ansatz stammt ursprünglich aus diesem GitHub-Diskussionskommentar.