Français
  • github
  • automatisation

Relancer automatiquement votre workflow GitHub après un échec

Parfois, votre workflow GitHub Actions peut être capricieux et échouer pour des raisons aléatoires. Voyons comment vous pouvez le relancer automatiquement pour vous faire gagner du temps.

Gao
Gao
Founder

Introduction

Nous aimons GitHub Actions. Il est puissant et offre une généreuse gratuité.

Au fur et à mesure que notre projet grandit, nous avons ajouté de plus en plus de tests d'intégration à exécuter dans notre workflow GitHub Actions. Comme d'autres projets cool, nous exécutons nos tests pour chaque pull request, push, et release.

Cependant, en raison de la nature des tests d'intégration, notre workflow échoue parfois pour des raisons aléatoires. Cela pourrait être un problème de réseau, un pépin de navigateur, ou d'autres raisons difficiles à reproduire.

Lorsque le workflow échoue, nous devons le relancer manuellement. Ce n'est pas un gros problème au début, mais c'est quand même agaçant pour des développeurs à haute efficacité comme nous.

Comment ça marche

Au moment où nous écrivons ceci, GitHub Actions ne fournit pas de manière intégrée pour relancer automatiquement un workflow échoué. Décortiquons cela pour voir comment nous pouvons y parvenir.

Lorsque qu'un workflow N'EST PAS en cours d'exécution et qu'il a échoué, vous pouvez le relancer manuellement en cliquant sur le bouton "Re-run jobs". Un menu déroulant s'ouvre, offrant une belle option "Re-run failed jobs" pour ignorer les jobs réussis.

Ainsi, l'idée est simple :

  1. Nous devons détecter quand un workflow a échoué.
  2. Nous devons déclencher l'action de relance APRÈS que le workflow se termine.

Évidemment, nous ne pouvons pas faire cela dans le même workflow, car un workflow ne peut rien faire lorsqu'il n'est pas en cours d'exécution. Nous avons donc besoin d'un autre workflow pour surveiller l'état du workflow précédent et déclencher l'action de relance. Cela peut être illustré comme suit :

Mettez à jour vos workflows

Créez un nouveau fichier de workflow dans votre dépôt, par exemple, .github/workflows/rerun.yml :

Grâce à GitHub CLI, nous pouvons facilement surveiller l'état d'un workflow et le relancer avec deux simples commandes :

  • gh run watch pour surveiller l'état d'un workflow (docs ici).
  • gh run rerun pour relancer un workflow. L'option --failed ne relancera que les jobs échoués (docs ici).

Tout ce que vous avez à faire est de fournir le run_id du workflow échoué, ce qui peut être fait en utilisant le contexte github.run_id. Par exemple, vous pouvez déclencher le workflow de relance en ajoutant l'étape suivante à votre workflow original :

La condition if: failure() ne déclenchera l'étape que lorsque le job a échoué. La condition fromJSON(github.run_attempt) < 3 ne relancera qu'aux deux premières tentatives. Vous pouvez ajuster le nombre selon vos besoins.

Cette étape utilise la commande gh workflow run pour déclencher le workflow de relance. Voir la documentation pour plus de détails.

Bonus : Exécuter le workflow de relance à partir de la branche qui a échoué

Si vous souhaitez relancer le workflow depuis la branche qui a échoué, au lieu de la branche principale par défaut, vous pouvez utiliser la commande suivante :

Le contexte github.head_ref sera utilisé s'il s'agit d'une pull request, sinon, github.ref_name sera utilisé.

Remerciements

L'idée de cette approche provient à l'origine de ce commentaire de discussion GitHub.