失敗後に GitHub ワークフローを自動的に再実行する
時々、GitHub Actions ワークフローは気まぐれで、ランダムな理由で失敗することがあります。時間を節約するために、それを自動的に再実行する方法を見てみましょう。
はじめに
私たちは GitHub Actions が大好きです。それは強力で、寛大な無料プランを提供しています。
プロジェクトが成長するにつれて、GitHub Actions ワークフローで実行する統合テストがますます増えてきました。他の多くのクールなプロジェクトと同様に、プルリクエスト、プッシュ、およびリリースごとにテストを実行します。
しかし、統合テストの性質上、時々ワークフローがランダムな理由で失敗することがあります。それはネットワークの問題やブラウザーの不具合、または他の再現が難しい理由かもしれません。
ワークフローが失敗した場合、手動で再実行する必要があります。最初は大したことではありませんが、高効率な開発者にとってはやはり面倒です。
仕組み
執筆時点では、GitHub Actions は失敗したワークフローを自動的に再実行するための組み込み機能を提供していません。それでは、どのようにこれを実現できるかを見てみましょう。
ワークフローが 実行中でなく 失敗した場合は、「再実行ジョブ」ボタンをクリックして手動で再実行できます。これによりドロップダウンメニューが開き、成功したジョブをスキップする「失敗したジョブを再実行」オプションが表示されます。
アイデアは簡単です:
- ワークフローが失敗したときに検出する必要があります。
- ワークフローが終了した 後 に再実行アクションをトリガーする必要があります。
明らかに、同じワークフロー内でこれを行うことはできません。なぜなら、ワークフローは実行されていないときには何もできないからです。そのため、前のワークフローの状態を監視し、再実行アクションをトリガーするために別のワークフローが必要です。これを以下のように図示できます:
ワークフローの更新
リポジトリに新しいワークフローファイルを作成します。例として .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 ディスカッションのコメント から来ています。