9月22日、Linearが「AI coding has made CI a bottleneck, so we reworked ours to keep up」と題した記事を公開した。AIコーディングによってCIがボトルネック化した問題に対し、Linearがインフラ・テスト実行・セットアップ最適化など複数の施策を組み合わせて解決した方法を詳述している。施策の中で最大のインパクトをたった一設定で実現したのが、Vitestのテスト分離を無効化するisolate: falseだ。
背景:AIがコードを書くほど、CIが詰まる
AIエージェントによるコード生成が加速するにつれ、PRのマージ速度はかつてないペースで上がっている。しかし、どんなに速く書かれたコードも、CIを通過しなければマージできない。LinearのCTOであるTuomasが「CIのコストが高い、しかも遅い」という課題をチケットとしてアサインしてきたのが、今回の取り組みの発端だ。
Linearのテストスイートは今年に入って約4倍に膨れ上がった。その状況でも、PRのCI待ち時間を6分超から5分強に短縮し、テストあたりのランナー実行時間を約半分に削減することに成功した。
最大の成果:テスト分離の撤廃で17%削減
数ある施策の中で、単一の改善として最大のインパクトを出したのが「モジュール状態の共有(isolate: false)」だ。
Vitestはデフォルトでテストファイルごとに環境を完全に分離する。LinearのコードベースではこれがEntityグラフやGraphQL・デコレーターグラフの毎回再構築を意味していた。テストが増えるほど、この再構築コストが積み上がっていく構造的な問題だ。
対策として、安全なファイルに限定してオプトイン形式のisolate: falseプロジェクトを導入。各ワーカー内でモジュールレジストリを共有できるようにした。これにより、重いグラフの初期化をワーカー起動時の1回に抑えられる。
結果:
- 最も遅いシャードの実行時間:300〜379秒 → 約195秒
- APIシャード全体のランナー実行時間:32.8分 → 22分
- 月次コストベースで約17%の削減
ただし、この最適化は「正確性リスクが最も高い」施策でもある。フェイクタイマーや共有状態を安全に切り離せなかったファイルは従来の分離プロジェクトに残し、対象ファイルにはオプトインコメントを明示する運用とした。さらに、AIエージェントが書くテストがこのデフォルト制約に従うよう、エージェントのスキル定義も更新したという点は見逃せない。AIが書くコードとCI設定の整合性まで意識した対応だ。
シャーディングを活かすには、セットアップ削減が前提
もう一つの柱がシャード数の倍増(4→8)だ。しかしここで見落とされがちなのが、シャードを増やせば固定のセットアップコストも倍になるという問題だ。
Linearはシャード増加と並行してセットアップ時間を大幅に削減することで、この問題を回避した。
| 状態 | シャード数 | セットアップ合計 |
|---|---|---|
| 最適化前 | 4シャード | 8.3分 |
| 最適化後 | 8シャード | 7.5分 |
シャードを倍にしながらセットアップ合計をむしろ減らせた背景には、以下の細かな積み上げがある。
- PostgreSQLクライアントをCIベースイメージに組み込み(毎回の
apt installを排除):頻繁に変わらない依存はイメージに焼き込むことで、全シャードの起動コストを一括削減できる - pnpm installをAPIパッケージのみに限定:44〜73秒 → 16〜18秒。モノレポ全体をインストールする必要がない場合は対象を絞ることで劇的に短縮できる
node_modulesのキャッシュは使わない:キャッシュ復元に28秒かかる一方、フィルタードインストールは7.5秒で完了するため、キャッシュが逆に遅かった。「キャッシュは常に有効」という思い込みを数値で覆した事例だ- DBマイグレーション履歴の再実行を廃止し、スキーマスナップショットをロード:12秒 → 1〜2秒。マイグレーション件数が増えるほど効いてくる改善だ
他にも効いた施策
インフラの切り替えはほぼノーコストで大きなリターンをもたらした。GitHub ActionsからサードパーティランナーへCI実行基盤を移行したところ、ジョブ実行時間が平均34%短縮、tscは52%減。実行環境そのものの性能差が、他の最適化に先立って利いてくる事例だ。
TypeScriptコンパイラの刷新も大きい。tsgo(MicrosoftがTypeScriptコンパイラをGoで書き直したネイティブ実装。microsoft/TypeScriptのGo移植プロジェクトとして開発が進んでいる)への移行でtscチェックの週次中央値が73%削減され、型チェックがボトルネックから外れた。2026年時点でもまだプレビュー段階だが、Linearの実績では本番CIに十分適用できるレベルと判断された。
lintの型チェック依存を排除することで、型グラフのビルドなしにESLintを実行できるようにした。API lint時間が68%減、リポジトリ全体のlintが55%減。型情報を必要としないルールだけを切り出して先に走らせるこのアプローチは、後のOxlintへの移行も容易にした。
7つの独立ジョブを2つに統合(内部で並列実行)することで、Juneの実績値ベースで月間約87,000ランナー分(全CI使用量の11.8%)を削減した。ジョブのオーバーヘッド(キューイング・セットアップ)が7回から2回に減るため、個々のタスクを速くしなくても合計時間が縮まる。
チェンジ検出ジョブの最適化では、必要なファイルだけをチェックアウトする形に変更し、中央値26秒 → 8秒、p90で31秒 → 12秒まで短縮した。
今後の見通し
LinearはCI改善を行わなかった場合、現在のテストスイートは約11分かかっていたと試算している。現状は5分強なので、施策がなければほぼ倍の待ち時間が発生していた計算だ。
現在は週に約2,000件のテストが追加され続けており(その大半がAIエージェントによる生成)、CI高速化の取り組みは継続的な課題として位置づけられている。
詳細はAI coding has made CI a bottleneck, so we reworked ours to keep upを参照していただきたい。