• github
  • automatyzacja

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.

Gao
Gao
Founder

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:

  1. Musimy wykryć, kiedy workflow nie powiodło się.
  2. 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.