CIタイムアウトとは?解説
CIタイムアウトは、jobやstepが許可された時間より長く実行されると、それをキャンセルする設定された制限で、ハングしたプロセスがrunnerを永遠に占有できないようにします。
タイムアウトがなければ、1つのスタックしたjobがrunnerを無期限に占有し、キューをブロックして分を浪費しかねません。タイムアウトは安全弁ですが、実際の問題も表面化させます。タイムアウトするstepは、本当に遅いか、デッドロックしているか、決して来なかった一時的な何かを待っているかのいずれかです。
なぜタイムアウトが存在するのか
タイムアウトは、作業がどれだけ長く実行できるかを制限します。1つの暴走したjobから共有キャパシティを保護し、ハングしたプロセスへの無駄な支出を抑え、pipelineに永遠にハングする代わりに明確な結果を与えます。ほとんどのCIシステムでは、jobレベルとstepレベルでタイムアウトを設定できます。
よくある原因
- 決して完了しないデッドロックや無限ループ(決定論的)。
- 決して発火しないイベントを待つテスト(多くの場合race condition)。
- 上流が遅いか到達不能なためにハングするネットワーク呼び出し(多くの場合一時的)。
- 制限が単に低すぎるだけの、本当に遅いstep。
タイムアウトのexit code
GNU timeoutは、コマンドが制限を超えると124を返します。CIプロバイダーは代わりに、jobをキャンセル済みまたはタイムアウトとして報告することがあります。いずれにせよシグナルは同じです。作業が割り当てられた時間内に終わらなかったということです。
一時的なタイムアウト vs 決定論的なタイムアウト
タイムアウトは、stepが常に制限を超える(きつすぎる制限、本当のデッドロック)なら決定論的、時々しか超えない、通常は遅いネットワークや一瞬過負荷になった依存を待っていたためなら一時的です。リトライは一時的なケースに役立ち、決定論的なケースでは時間を浪費します。
Latchkeyの視点
タイムアウトが、Latchkeyが認識できる一時的な原因、たとえば一瞬到達不能なregistryに対するハングしたネットワーク呼び出しに遡れる場合、自己修復managed runnerはリトライでき、一度きりの瞬断でbuildが失敗することはありません。本物のデッドロックによるタイムアウトは、あなたが修正すべきものとして残ります。
重要なポイント
- CIタイムアウトは、設定された制限を超えた作業をキャンセルします。
- タイムアウトは共有キャパシティを保護し、無駄な支出を抑えます。
- GNU timeoutは124で終了し、プロバイダーはキャンセルを報告することがあります。
- タイムアウトは一時的(遅いネットワーク)にも決定論的(デッドロック)にもなり得ます。