Português (Portugal)
  • github
  • automacao

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.

Gao
Gao
Founder

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:

  1. Precisamos de detectar quando um fluxo de trabalho falhou.
  2. 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.