概要
- LinearのCIコスト削減と高速化の取り組みの全体像
- インフラ・ツールの刷新やジョブの最適化、セットアップの削減
- テスト実行効率化による待ち時間とランナー時間の短縮
- 具体的な施策と効果の定量的な説明
- 今後も継続的な改善が必要であることの強調
LinearにおけるCIコスト削減とパフォーマンス最適化
- 2024年初頭、 CTOのTuomas より「CIコストが高い」との課題が割り当てられ、 CIの高速化 も同時に依頼
- 開発速度向上により、 CIがボトルネック となり、インフラコスト増加やフィードバック遅延が発生
- 施策により、 PRのCI待機時間 を6分超から5分強に短縮、 テストごとのランナー時間 も半減
- 年初からテストスイート数が4倍近く増加したが、効率化を実現
CI最適化の主な4つの施策
- インフラ・ツールのアップグレード
- 他ジョブのゲートとなるジョブの最適化
- 繰り返し発生するセットアップの削減
- テスト実行自体の効率化
インフラとツールの刷新
- GitHub Actionsから高速なサードパーティランナー へ移行し、同一パイプラインで 平均34%高速化、特定ワークロードでは 52%短縮
- TypeScriptコンパイラをtsgoへ切替、型チェック処理のボトルネックを解消し 73%短縮
- Lintルールの静的解析化 で型情報依存を排除し、 API lint時間68%削減、リポジトリ全体55%削減
- Oxlint導入 により、さらにランナー時間を節約
クリティカルパス上のジョブ最適化
- PRで変更されたパスの検出ジョブ を最適化し、不要なフルチェックアウトを排除
- fetch depth制限 で最遅ジョブを94秒→20秒に短縮
- 不要なcheckout削除 で27秒→7秒に短縮
- sparse checkout導入 でさらに11秒短縮
- checkoutの堅牢化 のため、独自アクションでリトライやキャッシュ利用、ネットワーク障害時の即時中断を実装
- キャッシュマーカー書き込みのタイミング変更 で、merge queueでの待機時間を42秒短縮
セットアップコストの削減
- 共通依存パッケージの事前インストール でAPIテストシャードごとのセットアップを短縮
- 必要なパッケージのみインストール でpnpm install時間を44-73秒→16-18秒へ短縮
- node_modulesキャッシュの廃止 でインストールの方が高速に
- データベースセットアップのスナップショット化 で12秒→1-2秒へ短縮
- 短時間ジョブのバッチ化 でランナー起動回数を削減し、月間87,000分(総CI使用量の11.8%)節約
テスト実行の効率化
- Vitestによるテストファイル単位分割 で大きなテストファイルを細分化し、8シャード化で19%高速・19%コスト削減
- isolate: falseプロジェクト導入 で安全なファイルはモジュールレジストリを共有し、最大17%の月間コスト削減
- シャード数増加の効果 はセットアップ最適化とセットで初めて実現
- セットアップ最適化前は4シャード8.3分、最適化後は8シャード7.5分
継続的改善の必要性
- 改善前であれば、 現在のテストスイート実行に11分 かかる計算
- 週2,000テスト増加 のペースで今後も拡大見込み
- 新たなボトルネック に対しても、今回の知見を活かし改善を継続
セットアップコストを払えるなら、Bazelを使えば、巨大なプロジェクトでもキャッシュが温まっていれば約10秒でビルドできるよ。