
2026/09/22 4:23
AI コーディングによる開発速度の向上がCI をボトルネックにしていたため、当社のCIプロセスを見直し、追いつけるように改良しました
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Linear は、今年にテストスイートがほぼ 4 倍規模になったにもかかわらず、継続的インテグレーション(CI)のコストを大幅に削減し、ビルド時間を劇的に短縮することに成功しました。主要な成否は、コード変更の検証を本番環境へのデプロイよりも迅速に行えることを保証することであり、これはワークロードをサードパーティ製ランナーへ移行させ(平均的なジョブ実行時間が 34% 短縮)、ネイティブ TypeScript コンパイラを採用してタイプチェック時間を 73% 削減し、Lint ルールを効率的な静的解析を使用するように書き換えることで API の Lint 時間を 68% 削減したことを通じて実現されました。主な最適化策としては、最終確認から不要なファイルの書き込みを取り除き(PR あたり 42 秒節約)、共有依存関係の事前インストールを導入してセットアップ時間を 44% 削減し、7 つの独立したチェックを 2 つのジョブに統合して月に約 87,000 ランナー分を節約するとともに、Vitest でのテスト実行を最適化しました。これらの戦略は、インフラストラクチャのアップグレード、ジョブゲートイング、セットアップ削減、および実行効率向上をターゲットにしています。これらの変更を適用することで、Linear はテスト環境の複雑性をスケールさせたとしても、フィードバックループが遅くなったりランナー費用が高騰したりするとは限らないことを実証しました。類似した企業にとって、このモデルはコスト削減を図りながら機能リリースを遅らせるボトルネックを防ぐための青写真を提供します。今後の取り組みでは、テスト環境が引き続き拡大する中でこれらの成果を持続させ、迅速な検証が開発ワークフローの中心に保たれることを確実にすることを目指します。
本文
Linear で CI パフォーマンスを大幅に向上させた 14 つの対策
Linear の CTO トーマスは今年初め、「CI コストが高い」という課題と、CI の高速化という二つのタスクを私に割り当てました。コードのデプロイはエージェントによって劇的に加速されましたが、PR の検証速度はそれに追いついておらず、CI は開発活動のボトルネックとなっていました。
成果の概要
テストスイートがほぼ 4 倍 に増えたにもかかわらず、以下の指標を大きく改善しました。
- PR 待機時間: 6 分以上 → 5 分未満(削減)
- テストあたりのランナー時間: 約半分に削減
改善の 4 つの観点
Linear のコードベースは TypeScript ですが、これらの手法は言語やツールチェーンを超えて広く応用可能です。
- インフラストラクチャとツールのアップグレード
- 他の作業を制御するジョブの最適化
- 繰り返しのセットアップの削減
- テスト実行効率の向上
1. インフラストラクチャとツールのアップグレード
CI パイプライン自体を変えず、基盤を強化することで大きな改善を行いました。
- ランナーの移行: GitHub Actions から、高性能 CPU・高速ストレージ・優れたキャッシュインフラを備えたサードパーティ製ランナーへ移行。
- ジョブ実行速度平均:34% 向上
(TypeScript コンパイル)のような特定負荷:52% 削減tsc
- コンパイラーの近代化:
からネイティブコンパイラtsc
に切り替え。tsgo
の中央値:73% 削減tsc チェック- ボトルネック(型チェック)が完全に解消されました。
2. タイプチェッカーを使わないリンティング
型情報を必要とするルールを再実装し、メモリ消費量の多いリンティングジョブを軽量化しました。
- 手法の転換: 型情報への依存を断ち、AST(抽象構文木)のみを静的解析する方式へ変更。
- API リンティング時間:68% 削減
- リポジトリ全体のリンティング時間:55% 削減
- メモリ使用量:大幅に減少。
- Oxlint への移行: 型依存を断つことで、
へのシームレスな移行が可能になり、CI ランナー時間をさらに削減しました。Oxlint
3. 他の作業を制御するジョブの最適化
インフラ速度が向上したことで、クリティカルパス上の「小さなジョブ」への注目が集まりました。
- 変更検出ジョブ: PR がどのファイル(パス)を変えたかを確認する前のゲート処理を高速化。
- 取得データの最適化:
- 完全な動作ツリーをチェックアウトせず、必要な小規模なサブセットのみを取得。
- チェックアウト深さを制限し、不要なジョブからはチェックアウトを完全に排除。
- ネットワーク安定性への対応:
- サードパーティランナーは GitHub 外にあり、IP 接続が不安定な場合があります。
を自前製コンパウンドアクションへ置き換え、後退戦略(backoff)付きリトライを実装。actions/checkout
/GIT_HTTP_LOW_SPEED_LIMIT
を設定し、停滞時に約 30 秒後に強制終了させることで固まりを防止。TIME- ステイクリーディスク上に永続的な git ミラー(チェックアウトキャッシュ)を維持。
4. 繰り返しのセットアップを削減
各ジョブで繰り返されるオーバーヘッド(起動、インストール、ビルドなど)を劇的に削減しました。
- 共有依存関係の事前インストール: CI イメージ内に Postgres クライアントなどを
でインストールし、再インストール時間を排除。apt - 必要な依存関係のみをインストール:
ワークスペース全体をインストールせず、必要なパッケージ(API パッケージ)のみを対象化。pnpm- 後続ジョブでほぼ使われないキャッシュアップロード処理も排除。
- 結果:
は 44〜73 秒 → 16〜18 秒に。pnpm install
- キャッシュの再考:
キャッシュは復元に時間がかかり、ばらつきを増やすのみであるため不要と判断し、キャッシュ使用を停止。node_modules
さらに、入力が変わらないセットアップを再実行しない工夫も施しました。
- スキーママイグレーションの最適化: フル履歴の再プレイではなく、スナップショットファイルを読み込むことで、セットアップ時間を 12 秒 → 1〜2 秒に削減。
- 短いチェックのバッチ化: 7 つの独立した小規模ジョブ(それぞれ起動・インストールなど)を統合し、2 つのジョブ内で並列実行。
- セットアップコスト支払い回数:7 回 → 2 回へ削減。
- 月間ランナー分節約:87,000 ランナー分(CI 使用量の 11.8% に相当)。
5. テスト実行をより効率的にする
固定コストを下げることで、API スイートの並列化をさらに促進しました。
- ワークロードのバランス:
はファイル単位で分散するため、巨大なテストファイルがシャードを支配していました。Vitest- 大規模ファイルを分割・焦点化し、シャード数を適切に増加(初期は 3→4、現在は 8 シャード)。
- 結果:最も遅いシャード時間は 5.25 分 → 4.33 分へ。
- 共有状態の活用:
オプションを有効化し、再構築コスト(エンティティ・グラフなど)を削減。isolate: false- 最も遅いシャード時間:約 379 秒 → 195 秒へ。
- API シャードランナー全体時間:約 32.8 分 → 22 分へ。
- 月額コスト:約 17% 削減。
- 注意: 共有状態によるリスクを回避するため、対象ファイルごとに明示的な
コメントと適切なクリーンアップ実装が必要です。opt-in
6. シャーディングの限界について
シャーディングは有効ですが、セットアップオーバーヘッドが低く限定的です。
- シャード数を 2 倍にしても、セットアップ時間は 2 倍になるため、メリットが減ってしまいます。
- セットアップ時間が約 40 秒まで低下したことで、8 シャードにおける総セットアップ時間が 4 シャード時より少なくなるようになり、並列化度を 2 倍に高めることができました。
システム全体での波及効果
今年初めの意図的な改善努力がなければ、現在のテストスイートは約 11 分かかったでしょう(開発者が待つ時間のほぼ 2 倍)。
- この改善は完了ではなく、コードベースの成長(週に約 2,000 のテスト追加)に合わせて継続的な取り組みが必要です。
- これまでの知見を応用し、新たなボトルネックへの対応を通じて CI を高速化し続けることが重要であるためです。