Action Cable 統合テストのリトライとソフトフェイル設定を拡張
Action Cable の統合テストに対し、exit status 3 をリトライ対象とし、リトライやソフトフェイルの条件を配列で指定できるように変更しました。また、テスト実行環境の Docker イメージに iproute2 を追加し、CI の安定性を向上させています。
背景
Action Cable の統合テストは JavaScript 実行のみを検証しているため、Ruby バージョンごとに別々に走らせる必要がなくなります。テストジョブが The environment you requested was unavailable というメッセージで終了し、CI が頻繁にフラッキーになる問題が報告されていました(#119)。この PR は、同様の失敗をリトライで補完し、再度失敗した場合は soft fail としてビルド全体の失敗を回避することを目的としています。
技術的な変更
Docker ビルド環境の拡張
# Dockerfile
@@
- git nodejs lsof \
+ git nodejs iproute2 lsof \
iproute2 を追加することで、Web Test Runner が内部で利用するネットワークコマンドが利用可能になり、テスト実行時の環境依存エラーを防止します。
RakeCommand のソフトフェイルロジック改良
@@
- if soft_fail || build_context.ruby.soft_fail?
+ if soft_fail == true || build_context.ruby.soft_fail?
soft_fail true
+ elsif soft_fail
+ soft_fail soft_fail
end
soft_fail が真偽値の場合は従来通り soft_fail true が設定され、配列が渡されたときはそのままステップ定義に流し込む形に変更しました。これにより 複数条件(例: [{ exit_status: 127 }])の指定が可能になります。
パイプライン定義の拡張
@@
- rake "actioncable", task: "test:integration", retry_on: { exit_status: -1, limit: 3 }
+ rake "actioncable", task: "test:integration",
+ retry_on: [{ exit_status: 3, limit: 1 }, { exit_status: -1, limit: 3 }],
+ soft_fail: [{ exit_status: 3 }]
retry_on に 配列 を受け取る形を導入し、exit status 3 を 1 回リトライ対象に設定しました。また、soft_fail も配列で受け取り、exit status 3 が残った場合はビルドをソフトフェイルとして扱います。既存の ruby == build_context.default_ruby 条件はそのまま保持し、デフォルト Ruby でのみこの設定が適用されます。
テストコードの追加
@@
- def test_automatic_retry_on_array
+ def test_automatic_retry_on_array
@@
- def test_soft_fail_array
+ def test_soft_fail_array
新たに 配列形式 の retry_on と soft_fail を検証するテストが追加され、PipelineFixture が期待通りに retry と soft_fail キーを生成することを確認しています。テストカバレッジが拡張されたことで、将来的な変更リスクが低減します。
設計判断
配列型パラメータの採用
retry_on と soft_fail を ハッシュの配列 で受け取る設計に変更したのは、単一条件だけでなく 複数条件 を同一ステップで表現できるようにするためです。PR の議論では新しい設定キーを導入する案も検討されましたが、既存キーの拡張で後方互換性を保ちつつ機能追加できると判断されました。
exit status 3 の扱い
exit status 3 が頻発するフラッキーケースを リトライ → ソフトフェイル の二段階で処理することで、ビルド全体の失敗を回避しつつ、根本的な失敗原因の可視化を維持しています。リトライ回数は 1 回に限定し、過剰な再実行による CI リソースの浪費を防止しています。
依存パッケージ追加の影響
Docker イメージに iproute2 を加えるだけで、テスト実行環境のネットワークユーティリティが整備されます。既存パッケージへの影響は最小限で、ビルドサイズの増加は限定的です。
まとめ
本 PR は Action Cable の統合テストに対し、リトライ条件とソフトフェイル条件を配列で柔軟に指定できるようにした点が最大の変更です。exit status 3 をリトライ対象にしつつ、残存時はソフトフェイルとして扱う二段階処理により、フラッキーな CI ビルドを減少させました。さらに Docker イメージに iproute2 を追加したことで、テスト実行環境の安定性も向上しています。