レジストリタイムアウトとは? - 解説
レジストリタイムアウトとは、CI の処理中にパッケージやコンテナのレジストリが時間内に応答できず、インストール、リストア、イメージのプルが中断される状態です。
ほぼすべての CI job はレジストリに依存しています。npm、PyPI、Maven Central、Docker レジストリ、Terraform プロバイダーレジストリなどです。これらは共有され、高い負荷がかかるサービスであり、いずれかが遅かったり一時的に劣化したりすると、job はそれを待つ間にタイムアウトします。build は、あなたのコードとはまったく無関係の理由で失敗するのです。
レジストリタイムアウトとは何か
タイムアウトは、クライアントの制限時間内にレジストリが応答しないときに発生します。データの代わりに、中断されたリクエストが返ります。読み取りタイムアウト、接続タイムアウト、あるいは遅いハンドシェイクです。必要だった依存関係が届かなかったため、そのステップは失敗します。
レジストリがタイムアウトする理由
- 共有レジストリはピーク時に過負荷になる。
- レジストリ側での一時的な劣化や部分的なインシデント。
- あなたの runner とレジストリの間のネットワークレイテンシや一時的な障害。
- 負荷下で、厳しすぎるクライアントタイムアウトを超える大きな artifact。
どのように表面化するか
パッケージマネージャーやイメージのプルから、ETIMEDOUT、読み取りタイムアウト、5xx レスポンス、または "request canceled" エラーが見られます。共通しているのは、失敗の原因がレジストリへの到達や待機にあることであり、あなたのコードや依存関係が間違っていることではありません。
リトライで復旧する理由
レジストリタイムアウトは通常一時的です。レジストリが復旧し、ネットワークが安定し、ピーク負荷が過ぎ去ります。同じインストールやプルを、できればバックオフを伴って再度実行すれば、通常は成功します。キャッシュやミラーは、実行のたびにライブのレジストリへ依存する度合いをさらに減らします。
Latchkey の視点
レジストリタイムアウトは、Latchkey の自己修復マネージド runner が検知して自動的にリトライする中核的な一時的失敗です。そのため、依存関係のインストールやイメージのプル中の一度きりの遅いレジストリや劣化したレジストリで build が失敗することはありません。
重要なポイント
- レジストリタイムアウトとは、CI 中にレジストリの応答が遅すぎることである。
- 過負荷、一時的な劣化、ネットワークレイテンシがよくある原因である。
- インストールやプルで ETIMEDOUT、読み取りタイムアウト、5xx として表面化する。
- 一時的であり、バックオフ(およびキャッシュ)を伴うリトライで復旧する。