Automatyczne ponowne uruchomienie workflow GitHub po niepowodzeniu
Czasami workflow GitHub Actions bywa kapryśny i nie udaje się z powodu losowych powodów. Zobaczmy, jak automatycznie ponownie go uruchomić, aby zaoszczędzić czas.
Wprowadzenie
Uwielbiamy GitHub Actions. Jest potężny i oferuje hojny darmowy poziom.
W miarę jak nasz projekt rośnie, dodaliśmy coraz więcej testów integracyjnych do uruchomienia w naszym workflow GitHub Actions. Podobnie jak w innych świetnych projektach, uruchamiamy nasze testy dla każdego pull requesta, pushu i wydania.
Niemniej jednak, z powodu natury testów integracyjnych, czasami nasz workflow nie udaje się z losowych powodów. Może to być problem z siecią, czkawka przeglądarki lub inne powody, które trudno odtworzyć.
Kiedy workflow zawodzi, musimy ręcznie go ponownie uruchomić. Na początku to nie jest duży problem, ale jest to nadal irytujące dla deweloperów o wysokiej wydajności, takich jak my.
Jak to działa
W momencie pisania tego tekstu, GitHub Actions nie oferuje wbudowanego sposobu automatycznego ponownego uruchamiania nieudanego workflow. Przeanalizujmy więc to i zobaczmy, jak możemy to osiągnąć.
Kiedy workflow NIE działa i nie powiodło się, możesz ręcznie go ponownie uruchomić, klikając przycisk "Re-run jobs". Pojawi się menu rozwijane z opcją "Re-run failed jobs", która pozwala pominąć udane zadania.
Pomysł jest prosty:
- Musimy wykryć, kiedy workflow nie powiodło się.
- Musimy wyzwolić akcję ponownego uruchomienia PO zakończeniu workflow.
Oczywiście, nie możemy tego zrobić w tym samym workflow, ponieważ workflow nie może nic zrobić, gdy nie działa. Więc potrzebujemy innego workflow, aby monitorować status poprzedniego workflow i wyzwolić akcję ponownego uruchomienia. Można to zilustrować następująco:
Zaktualizuj swoje workflowy
Utwórz nowy plik workflow w swoim repozytorium, np. .github/workflows/rerun.yml
:
Dzięki GitHub CLI możemy łatwo śledzić status workflow i ponownie go uruchomić za pomocą dwóch prostych poleceń:
gh run watch
do śledzenia statusu workflow (dokumentacja tutaj).gh run rerun
do ponownego uruchomienia workflow. Flaga--failed
ponownie uruchamia tylko nieudane zadania (dokumentacja tutaj).
Wszystko, co musisz zrobić, to podać run_id
nieudanego workflowu, co można zrobić za pomocą kontekstu github.run_id
. Na przykład, możesz wyzwolić workflow ponownego uruchomienia, dodając następujący krok do swojego pierwotnego workflow:
Warunek if: failure()
wyzwoli krok tylko wtedy, gdy zadanie się nie uda. Warunek fromJSON(github.run_attempt) < 3
ponownie uruchomi tylko pierwsze 2 próby. Możesz dostosować liczbę do swoich potrzeb.
Ten krok używa polecenia gh workflow run
, aby wyzwolić workflow ponownego uruchomienia. Zobacz dokumentację po więcej szczegółów.
Bonus: Uruchom workflow ponownego uruchamiania z gałęzi, która się nie powiodła
Jeśli chcesz ponownie uruchomić workflow ponownego uruchamiania z gałęzi, która się nie powiodła, zamiast z domyślnej gałęzi, możesz użyć następującego polecenia:
Kontekst github.head_ref
zostanie użyty, jeśli jest to pull request, w przeciwnym razie zostanie użyty github.ref_name
.
Podziękowania
Pomysł na to podejście pochodzi z tego komentarza w dyskusji na GitHubie.