Réessayer automatiquement une étape (retry)
💡 Sujet
Il arrive qu'une étape de CI échoue de manière aléatoire ("flaky") à cause de problèmes réseaux, de timeouts ou de tests instables.
Contrairement à d'autres CI (comme GitLab CI), GitHub Actions n'a pas de mot-clé natif retry pour les étapes (steps).
Il faut donc utiliser une Action tierce ou un script manuel.
✅ La solution standard : nick-fields/retry
L'action la plus populaire et maintenue pour gérer cela est nick-fields/retry. Elle permet de relancer une commande spécifique plusieurs fois avant d'échouer le job.
Exemple d'utilisation
steps:
- name: 📦 Install dependencies (flaky network)
uses: nick-fields/retry@v3
with:
timeout_minutes: 5
max_attempts: 3
retry_wait_seconds: 10 # Attendre 10s entre chaque essai
command: npm ciParamètres utiles
max_attempts: Nombre d'essais (défaut: 2).timeout_minutes: Timeout pour chaque tentative.shell: Utile si tu veux spécifierbashoupwsh(ex: pour des commandes multi-lignes).on_retry_command: Une commande à lancer avant de réessayer (ex: nettoyer un cache).
🛠️ Alternative "Maison" (Shell script)
Si tu ne veux pas dépendre d'une Action externe pour une commande simple, tu peux utiliser une boucle dans ton shell, mais c'est moins lisible.
- name: Flaky command with bash retry
run: |
n=0
until [ "$n" -ge 5 ]
do
command_to_run && break
n=$((n+1))
sleep 5
done🧩 Résumé
- ❌ Pas de
retry: 3natif dans GitHub Actions pour les steps. - ✅ Utiliser l'action
nick-fields/retrypour une syntaxe propre et des options avancées (timeout, delais). - 💡 Idéal pour les appels API externes, les installations de paquets (npm/pip) ou les tests E2E instables.