CIパイプラインにおけるfan-out / fan-inとは?
fan-outは1つのステージを多数の並列jobに分割し、fan-inはそのすべてを待って結果を結合します。両者を組み合わせることで、CIは速度のために横に広がり、その後1つの判定へと収束できます。
fan-out/fan-inは並列パイプラインの基本的な形です。作業を複数のjobに分散させてwall-clock時間を削減しつつ、最終的には集約された1つのgate結果で終える方法です。
Fan-out
パイプライン上の1つのポイントが、並行して実行される多数の独立したjobへと分岐します - テストスイートをshardに分割する、複数のtargetをbuildする、matrixを実行するなどです。各ブランチは分離されており、それぞれ自身のrunner上で進行します。
Fan-in
並列作業のあとに、1つのjobがfan-outされた*すべての*jobに依存し、それらが完了して初めて実行されます。それらの出力を集約します - テストレポートをマージする、coverageを結合する、あるいは単にすべてのブランチが成功した場合のみgreenになるgateとして機能します。
needs: collects the fan-out
jobs:
test:
strategy: { matrix: { shard: [1, 2, 3, 4] } }
report:
needs: test # fan-in: waits for all shards使う理由
- 速度: N個の並列shardは、直列時間のおよそ1/Nで完了します。
- 1つのfan-in gateが、ステージ全体に対して明確なpass/failを1つ与えます。
- 集約(coverage、レポート)が1か所で行われます。
落とし穴
fan-outは課金対象分数を倍増させ、runnerプールを溢れさせてキューイングを引き起こすことがあります。fan-in jobは同期ポイントです - 最も遅いブランチと同じ速さにしかならないため、アンバランスな分割(1つのshardが他より極端に重い)は並列性を無駄にします。shardをバランスさせましょう。
重要なポイント
- fan-outは多数の独立したjobを並列に実行し、fan-inはそれらの結果を結合します。
- より多くの課金対象分数と引き換えに、より短いwall-clock時間を得るトレードオフです。
- fan-in jobはgateであり同期ポイントです - 最も遅いブランチと同じ速さにしかなりません。
- 1つの重いブランチが並列性を打ち消さないよう、shardをバランスさせましょう。
関連ガイド
What Is a Build Matrix? Testing Across Versions and PlatformsA build matrix runs the same job across many combinations - OS, language version, dependency set. Learn how m…
Fail-Fast vs Continue-on-Error: Controlling How CI StopsFail-fast stops the pipeline at the first failure; continue-on-error lets it press on. Learn what each does,…
Pipeline Observability Basics: Seeing Why CI FailsPipeline observability is the ability to answer why a build failed, slowed, or flaked from data you already c…