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.
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:
- We moeten detecteren wanneer een workflow is mislukt.
- 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.