Reexecutar automaticamente o seu fluxo de trabalho do GitHub após falha
Às vezes, o fluxo de trabalho do GitHub Actions é temperamental e falha por razões aleatórias. Vamos ver como pode reexecutá-lo automaticamente para lhe poupar tempo.
Introdução
Adoramos o GitHub Actions. É poderoso e oferece um generoso nível gratuito.
À medida que o nosso projeto cresce, adicionamos mais e mais testes de integração para serem executados no nosso fluxo de trabalho do GitHub Actions. Como outros projetos de destaque, executamos os nossos testes em cada pull request, push e release.
No entanto, devido à natureza dos testes de integração, às vezes o nosso fluxo de trabalho falha por razões aleatórias. Pode ser um problema de rede, uma falha no navegador ou outros motivos difíceis de reproduzir.
Quando o fluxo de trabalho falha, temos que reexecutá-lo manualmente. No início, não parece grande coisa, mas é irritante para desenvolvedores de alta eficiência como nós.
Como funciona
No momento em que escrevo, o GitHub Actions não oferece uma maneira integrada de reexecutar automaticamente um fluxo de trabalho falhado. Então, vamos destrinçá-lo e ver como podemos atingir esse objetivo.
Quando um fluxo de trabalho NÃO está a ser executado e falhou, pode reexecutá-lo manualmente clicando no botão "Reexecutar trabalhos". Será aberta uma lista suspensa com uma opção conveniente chamada "Reexecutar trabalhos falhados" para pular os trabalhos bem-sucedidos.
Então a ideia é simples:
- Precisamos de detectar quando um fluxo de trabalho falhou.
- Precisamos de acionar a ação de reexecução DEPOIS que o fluxo de trabalho for concluído.
Obviamente, não podemos fazer isso no mesmo fluxo de trabalho, pois um fluxo de trabalho não pode fazer nada quando não está a ser executado. Então, precisamos de outro fluxo de trabalho para monitorizar o status do fluxo de trabalho anterior e acionar a ação de reexecução. Isso pode ser ilustrado da seguinte forma:
Atualize os seus fluxos de trabalho
Crie um novo ficheiro de fluxo de trabalho no seu repositório, por exemplo, .github/workflows/rerun.yml
:
Graças à cli do GitHub, podemos facilmente monitorizar o status de um fluxo de trabalho e reexecutá-lo com dois comandos simples:
gh run watch
para monitorizar o status de um fluxo de trabalho (documentação aqui).gh run rerun
para reexecutar um fluxo de trabalho. O sinalizador--failed
apenas reexecutará os trabalhos falhados (documentação aqui).
Tudo o que precisa de fazer é fornecer o run_id
do fluxo de trabalho falhado, que pode ser obtido utilizando o contexto github.run_id
. Por exemplo, pode ativar o fluxo de trabalho de reexecução adicionando o seguinte passo ao seu fluxo de trabalho original:
A condição if: failure()
apenas ativará o passo quando o trabalho falhar. A condição fromJSON(github.run_attempt) < 3
apenas reexecutará as duas primeiras tentativas. Pode ajustar o número de acordo com as suas necessidades.
Este passo utiliza o comando gh workflow run
para ativar o fluxo de trabalho de reexecução. Consulte a documentação para mais detalhes.
Bónus: Execute o fluxo de trabalho de reexecução a partir da branch que falhou
Se quiser reexecutar o fluxo de trabalho de reexecução a partir da branch que falhou, em vez da branch padrão, pode usar o seguinte comando:
O contexto github.head_ref
será utilizado se for um pull request, caso contrário, github.ref_name
será utilizado.
Créditos
A ideia desta abordagem é originalmente de este comentário na discussão do GitHub.