日本語
  • github
  • automation

失敗後に GitHub ワークフローを自動的に再実行する

時々、GitHub Actions ワークフローは気まぐれで、ランダムな理由で失敗することがあります。時間を節約するために、それを自動的に再実行する方法を見てみましょう。

Gao
Gao
Founder

はじめに

私たちは GitHub Actions が大好きです。それは強力で、寛大な無料プランを提供しています。

プロジェクトが成長するにつれて、GitHub Actions ワークフローで実行する統合テストがますます増えてきました。他の多くのクールなプロジェクトと同様に、プルリクエスト、プッシュ、およびリリースごとにテストを実行します。

しかし、統合テストの性質上、時々ワークフローがランダムな理由で失敗することがあります。それはネットワークの問題やブラウザーの不具合、または他の再現が難しい理由かもしれません。

ワークフローが失敗した場合、手動で再実行する必要があります。最初は大したことではありませんが、高効率な開発者にとってはやはり面倒です。

仕組み

執筆時点では、GitHub Actions は失敗したワークフローを自動的に再実行するための組み込み機能を提供していません。それでは、どのようにこれを実現できるかを見てみましょう。

ワークフローが 実行中でなく 失敗した場合は、「再実行ジョブ」ボタンをクリックして手動で再実行できます。これによりドロップダウンメニューが開き、成功したジョブをスキップする「失敗したジョブを再実行」オプションが表示されます。

アイデアは簡単です:

  1. ワークフローが失敗したときに検出する必要があります。
  2. ワークフローが終了した に再実行アクションをトリガーする必要があります。

明らかに、同じワークフロー内でこれを行うことはできません。なぜなら、ワークフローは実行されていないときには何もできないからです。そのため、前のワークフローの状態を監視し、再実行アクションをトリガーするために別のワークフローが必要です。これを以下のように図示できます:

ワークフローの更新

リポジトリに新しいワークフローファイルを作成します。例として .github/workflows/rerun.yml というファイルを作成します:

GitHub CLI のおかげで、2つの簡単なコマンドでワークフローのステータスを簡単に監視し、再実行することができます:

  • gh run watch でワークフローのステータスを監視します (ドキュメント こちら)。
  • gh run rerun でワークフローを再実行します。--failed フラグを使用すると、失敗したジョブのみが再実行されます (ドキュメント こちら)。

必要なのは、失敗したワークフローの run_id を提供することだけです。これは github.run_id コンテキストを使用して行うことができます。たとえば、次のステップを元のワークフローに追加して再実行ワークフローをトリガーできます:

if: failure() 条件は、ジョブが失敗した場合にのみステップをトリガーします。fromJSON(github.run_attempt) < 3 条件は、最初の 2 つの試行だけを再実行します。必要に応じてこの数値を調整してください。

このステップでは gh workflow run コマンドを使用して再実行ワークフローをトリガーします。詳細については ドキュメント を参照してください。

ボーナス: 失敗したブランチから再実行ワークフローを実行する

デフォルトのブランチではなく、失敗したブランチから再実行ワークフローを実行したい場合は、次のコマンドを使用できます:

github.head_ref コンテキストは、プルリクエストの場合に使用され、それ以外の場合は github.ref_name が使用されます。

クレジット

このアプローチのアイデアは この GitHub ディスカッションのコメント から来ています。