CI における並列性とは?
CI における並列性とは、複数の runner で独立した作業を同時に行うことで、pipeline が合計時間ではなく最も遅い分岐の時間で完了するようにすることです。
pipeline がすべてを 1 ステップずつ順番に実行すると、その所要時間はすべてのステップの合計になります。ステップが独立している場合、それらを同時に実行することで、その合計が最大値 - 最も遅い単一の分岐 - に変わります。これが、テストスイートが大きくなってもチームがフィードバックを速く保つ方法です。
並列で実行できるもの
- 独立した job - 順序関係のない lint、type-check、ユニットテスト。
- matrix の組み合わせ - すべての OS とバージョンのセルを一度に。
- テスト shard - runner ごとにスイートの 1 スライス。
小さな例
12 分の pipeline を 3 つの独立した job - lint(2 分)、ユニットテスト(12 分)、build(5 分)- に分割して一緒に実行すると、全体は 19 分(合計)ではなく、約 12 分(最も遅いもの)で済みます。
並列性 vs concurrency の制限
並列性は、一度にどれだけ実行「できる」かです。concurrency の制限は、どれだけ実行「してよい」かです - プランや自分の設定による、同時 runner 数の上限です。実際のスループットは、この 2 つのうち小さい方になります。
役に立たなくなるとき
並列性は独立した作業にしか役立ちません。上流の job を待たなければならない job は、それと重ねることができません。また、多数の短い並列 job はそれぞれ固定の起動 overhead を負担するため、分割しすぎると節約分より高くつくことがあります。
コストと runner の容量
並列性が高いほど、より多くの runner が同時に稼働します。分単位の課金では計算量の合計は同程度ですが、十分な同時 runner の容量が必要です - ここで、フリートをオンデマンドでスケールするマネージド runner プラットフォームが、並列 pipeline がキューに溜まるのを防ぎます。
重要なポイント
- 並列性は独立した作業を同時に実行して実時間を短縮します。
- スループットは利用可能な作業だけでなく、concurrency の上限によって制限されます。
- 並列化できるのは独立したステップだけ。分割しすぎると起動 overhead が増えます。