Action Cable 統合テストのリトライとソフトフェイル設定を拡張

rails/buildkite-config

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_onsoft_fail を検証するテストが追加され、PipelineFixture が期待通りに retrysoft_fail キーを生成することを確認しています。テストカバレッジが拡張されたことで、将来的な変更リスクが低減します。

設計判断

配列型パラメータの採用

retry_onsoft_failハッシュの配列 で受け取る設計に変更したのは、単一条件だけでなく 複数条件 を同一ステップで表現できるようにするためです。PR の議論では新しい設定キーを導入する案も検討されましたが、既存キーの拡張で後方互換性を保ちつつ機能追加できると判断されました。

exit status 3 の扱い

exit status 3 が頻発するフラッキーケースを リトライソフトフェイル の二段階で処理することで、ビルド全体の失敗を回避しつつ、根本的な失敗原因の可視化を維持しています。リトライ回数は 1 回に限定し、過剰な再実行による CI リソースの浪費を防止しています。

依存パッケージ追加の影響

Docker イメージに iproute2 を加えるだけで、テスト実行環境のネットワークユーティリティが整備されます。既存パッケージへの影響は最小限で、ビルドサイズの増加は限定的です。

まとめ

本 PR は Action Cable の統合テストに対し、リトライ条件とソフトフェイル条件を配列で柔軟に指定できるようにした点が最大の変更です。exit status 3 をリトライ対象にしつつ、残存時はソフトフェイルとして扱う二段階処理により、フラッキーな CI ビルドを減少させました。さらに Docker イメージに iproute2 を追加したことで、テスト実行環境の安定性も向上しています。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
43390fcc

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文、背景、技術的な変更、設計判断、まとめがすべて揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックのファイル名付きハイライトは正しい形式ですが、Issue #119 がリンク化されておらず、GitHubリンク記法に従っていません。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

対象はRails Buildkite 設定を扱うエンジニアであり、専門用語中心の記述になっているため適合しています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションは総論・各論・結論の段落構成で、トピックセンテンスが先頭にあり、1段落につき1トピック・長さも適切です。

Diff内容との照合 ⚠ WARNING

コードブロックとDiff内容の一致

Dockerfile、rake_command.rb、pipeline.rb のコードは Diff と完全に一致していますが、test_rake_command.rb の diff が途中までしか掲載されず、追加されたテスト本体が欠落しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

soft_fail、retry_on、exit status 3 などの用語は PR と一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

記事中の技術的主張は PR の説明と Diff に根拠があり、誤りは見られません。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

すべての事実は PR の記述、Diff、もしくはコードと合致しており、捏造や推測はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号 #183、Issue番号 #119、exit status の数値など、数値は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルは PR の内容(Action Cable の統合テスト調整)を適切に要約しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

LTS やリリース日程など、PR に記載されていない外部情報は含まれていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の歪曲はなく、PR の記述と一致しています。