Nederlands
  • github
  • automatisering

Je GitHub workflow automatisch opnieuw uitvoeren na een mislukking

Soms is je GitHub Actions workflow grillig en mislukt om willekeurige redenen. Laten we eens kijken hoe je het automatisch opnieuw kunt laten uitvoeren om tijd te besparen.

Gao
Gao
Founder

Inleiding

We houden van GitHub Actions. Het is krachtig en biedt een royaal gratis abonnement.

Naarmate ons project groeit, hebben we meer en meer integratietests toegevoegd aan onze GitHub Actions workflow. Net als andere coole projecten voeren we onze tests uit voor elke pull request, push en release.

Echter, vanwege de aard van integratietests, mislukt onze workflow soms om willekeurige redenen. Het kan een netwerkprobleem zijn, een browser probleem of andere redenen die moeilijk te reproduceren zijn.

Wanneer de workflow mislukt, moeten we het handmatig opnieuw uitvoeren. Het is in het begin geen groot probleem, maar het is toch vervelend voor hoog-efficiënte ontwikkelaars zoals wij.

Hoe het werkt

Op het moment van schrijven biedt GitHub Actions geen ingebouwde manier om een mislukte workflow automatisch opnieuw uit te voeren. Laten we het dus opsplitsen en kijken hoe we dit kunnen bereiken.

Wanneer een workflow NIET draait en is mislukt, kun je het handmatig opnieuw uitvoeren door op de knop "Opnieuw uitvoeren" te klikken. Er wordt een dropdownmenu geopend met de optie "Opnieuw uitvoeren van mislukte taken" om de succesvolle taken over te slaan.

Het idee is dus simpel:

  1. We moeten detecteren wanneer een workflow is mislukt.
  2. We moeten de actie van opnieuw uitvoeren NA het voltooien van de workflow activeren.

Blijkbaar kunnen we dit niet doen in dezelfde workflow, omdat een workflow niets kan doen als het niet draait. Dus we hebben een andere workflow nodig om de status van de vorige workflow te monitoren en de actie voor opnieuw uitvoeren te activeren. Dit kan als volgt worden geïllustreerd:

Werk je workflows bij

Maak een nieuw workflow-bestand in je repository, bijvoorbeeld .github/workflows/rerun.yml:

Dankzij de GitHub CLI kunnen we eenvoudig de status van een workflow bekijken en het opnieuw uitvoeren met twee simpele commando's:

  • gh run watch om de status van een workflow te bekijken (documentatie hier).
  • gh run rerun om een workflow opnieuw uit te voeren. De --failed vlag zal alleen de mislukte taken opnieuw uitvoeren (documentatie hier).

Alles wat je hoeft te doen is de run_id van de mislukte workflow te geven, wat kan worden gedaan door de github.run_id context te gebruiken. Je kunt bijvoorbeeld de opnieuw uitvoeren workflow activeren door de volgende stap aan je oorspronkelijke workflow toe te voegen:

De if: failure() conditie zal de stap alleen activeren wanneer de job is mislukt. De fromJSON(github.run_attempt) < 3 conditie zal alleen de eerste 2 pogingen opnieuw uitvoeren. Je kunt het aantal aanpassen naar je behoeften.

Deze stap gebruikt het gh workflow run commando om de opnieuw uitvoeren workflow te activeren. Zie de documentatie voor meer details.

Bonus: Voer de opnieuw uitvoeren workflow uit vanuit de branch die is mislukt

Als je de opnieuw uitvoeren workflow wilt uitvoeren vanuit de branch die is mislukt, in plaats van de standaard branch, kun je de volgende command gebruiken:

De github.head_ref context zal worden gebruikt als het een pull request is, anders wordt github.ref_name gebruikt.

Credits

Het idee van deze aanpak komt oorspronkelijk van deze GitHub-discussie opmerking.