パイプラインテンプレートとは?pipeline定義を再利用する
パイプラインテンプレートとは、複数のプロジェクトやjobが同じ設定を複製する代わりに呼び出せる、再利用可能でパラメータ化されたpipeline定義です。
すべてのリポジトリが同じ100行のCI YAMLをコピーしていると、たった1つの変更が数十のファイルの編集を意味します。パイプラインテンプレートは、共有ロジックを一度定義し、各プロジェクトがパラメータ付きでそれを呼び出せるようにすることで、これを解決します。これはpipelineに適用されたDRY原則です。ステップは一度書き、入力を変えるのです。
なぜテンプレートが存在するか
テンプレートは共有pipelineロジックを一元化します。プラットフォームチームは「Nodeアプリをbuildしてtestする」テンプレートを1つ保守でき、すべてのNodeリポジトリがそれを呼び出します。修正やポリシー変更は1か所に反映され、そのテンプレートを使うすべての場所へ伝播します。
テンプレートが入力を受け取る仕組み
テンプレートはパラメータ(nodeのバージョン、testコマンド、deployのターゲット)を公開します。呼び出し側が値を渡し、テンプレートがそれらを埋めます。これこそが、1つのテンプレートをforkせずに多くのプロジェクトに適合させるものです。
簡単な例
GitHub Actionsはこれをreusable workflowと呼びます。呼び出し側がuses: my-org/.github/.github/workflows/ci.yml@mainを参照し、with:で入力を渡します。GitLabはテンプレートファイルを取り込むのにinclude:を使います。どちらも共有設定を単一のソースへと変えます。
テンプレートとコピー&ペーストの比較
- コピー&ペースト: 最初は速いが、時間とともに乖離する。
- テンプレート: 1つの定義で、どこでも一貫し、統制しやすい。
- テンプレートは監査も簡単にします。多数ではなく1つのファイルをレビューすればよいのです。
テンプレートのバージョン管理
呼び出し側をテンプレートのtagやcommitに固定し、アップストリームの変更がすべてのpipelineを一度に壊せないようにします。バージョンは意図的に進めましょう。これは共有テンプレートの利点と、突然の更新のリスクとのバランスを取ります。
重要なポイント
- パイプラインテンプレートは、プロジェクトが呼び出す再利用可能でパラメータ化された定義です。
- コピー&ペーストされたCI設定をなくし、1つの変更ですべてを更新します。
- テンプレートの呼び出し側のバージョンを固定し、アップストリームの変更が意図的に展開されるようにしましょう。