Riesegui automaticamente il tuo workflow di GitHub dopo un fallimento
A volte il tuo workflow di GitHub Actions è umorale e fallisce per motivi casuali. Vediamo come puoi rieseguirlo automaticamente per risparmiare tempo.
Introduzione
Amiamo GitHub Actions. È potente e offre un generoso livello gratuito.
Man mano che il nostro progetto cresce, abbiamo aggiunto sempre più test di integrazione da eseguire nel nostro workflow di GitHub Actions. Come altri progetti interessanti, eseguiamo i nostri test per ogni pull request, push e release.
Tuttavia, a causa della natura dei test di integrazione, a volte il nostro workflow fallisce per motivi casuali. Potrebbe essere un problema di rete, un intoppo del browser o altre ragioni difficili da riprodurre.
Quando il workflow fallisce, dobbiamo rieseguirlo manualmente. Non è un grosso problema all'inizio, ma è comunque fastidioso per sviluppatori ad alta efficienza come noi.
Come funziona
Al momento della scrittura, GitHub Actions non fornisce un modo integrato per rieseguire automaticamente un workflow fallito. Quindi, analizziamolo e vediamo come possiamo realizzarlo.
Quando un workflow NON è in esecuzione e ha fallito, puoi rieseguirlo manualmente facendo clic sul pulsante "Re-run jobs". Si aprirà un menu a tendina e avrà una comoda opzione "Re-run failed jobs" per saltare i job riusciti.
Quindi l'idea è semplice:
- Dobbiamo rilevare quando un workflow ha fallito.
- Dobbiamo attivare l'azione di riesecuzione DOPO che il workflow si è concluso.
Ovviamente, non possiamo farlo nello stesso workflow perché un workflow non può fare nulla quando non è in esecuzione. Quindi, abbiamo bisogno di un altro workflow per monitorare lo stato del workflow precedente e attivare l'azione di riesecuzione. Questo può essere illustrato come segue:
Aggiorna i tuoi workflow
Crea un nuovo file di workflow nel tuo repository, ad es., .github/workflows/rerun.yml
:
Grazie al GitHub CLI, possiamo facilmente monitorare lo stato di un workflow e rieseguirlo con due comandi semplici:
gh run watch
per monitorare lo stato di un workflow (documentazione qui).gh run rerun
per rieseguire un workflow. Il flag--failed
rieseguirà solo i job falliti (documentazione qui).
Tutto ciò che devi fare è fornire il run_id
del workflow fallito, che può essere fatto utilizzando il contesto github.run_id
. Ad esempio, puoi attivare il workflow di riesecuzione aggiungendo il seguente step al tuo workflow originale:
La condizione if: failure()
attiverà lo step solo quando il job è fallito. La condizione fromJSON(github.run_attempt) < 3
rieseguirà solo i primi 2 tentativi. Puoi regolare il numero in base alle tue esigenze.
Questo step utilizza il comando gh workflow run
per attivare il workflow di riesecuzione. Vedi la documentazione per maggiori dettagli.
Bonus: Esegui il workflow di riesecuzione dal branch che ha fallito
Se vuoi rieseguire il workflow di riesecuzione dal branch che ha fallito, anziché dal branch predefinito, puoi usare il seguente comando:
Il contesto github.head_ref
verrà utilizzato se è una pull request, altrimenti, verrà utilizzato github.ref_name
.
Crediti
L'idea di questo approccio proviene originariamente da questo commento nella discussione di GitHub.