CircleCI:マルチレポジトリモデル コードとパイプライン定義の分離の実現
従来CirclCIのパイプラインを設定するconfig.ymlはデプロイ対象のソースコードが格納されているレポジトリと原則として同じ場所である必要がありました。

この場合本来ソースコードが管理されているレポジトリに異分子が混ざることとなり管理上の煩雑さが生まれるケースがあります。
また、設定によってはソースコードを修正せず、パイプラインの設定ファイルを修正しただけで、パイプラインが起動してしまい再デプロイが発生する、というケースも考えられます。さらに、単一のパイプライン設定を複数プロジェクトで共有して利用する場合、設定ファイルが複数に分散し一元管理が難しいという課題がありました。
マルチレポジトリモデル
この課題を解決するため、新しくマルチレポジトリモデルという機能が2025年の1月にリリースされました。
シンプルに言えば、ソースコードの管理レポジトリとパイプラインの設定ファイルを分離させることが可能になりました。これにより複数プロジェクトから単一のパイプラインを呼び出したり、コードの管理とパイプライン管理を分離させることが容易になりました。
さっそくやってみる
1. パイプライン管理専用Gitレポジトリの作成
circleciというプライベートレポジトリを作成します。

templates/config.ymlというファイルを配置します。これがCircleCIのパイプラインを定義するものです。
version: 2.1
jobs:
build:
docker:
- image: cimg/node:18.20
steps:
- checkout
- run:
name: 依存関係をインストール
command: npm install
- run:
name: 完了メッセージ
command: echo " Node環境のビルドが完了しました!"
workflows:
version: 2
build_and_test:
jobs:
- build
2. Project SettingsでPipeline設定の変更
Project Settings画面左ペインからProject Setupをクリックします。


既存プロジェクトはこのように、同じレポジトリのconfig.ymlを指定しており、すべてのイベントでパイプラインが起動するようになっているため、削除を行います。最初にTriggerを削除すれば全体設定が削除できます。

次にAdd pipelineをクリックして新たに1個作成します。

このようにConfig sourceにcircleciというコンフィグ専用レポジトリを指定して、Config filepathにtemplates/config.ymlと先ほど作成したパイプライン設定ファイルを指定します。
Checkout sourceには従来通りソースコードレポジトリを指定します。
作成でいたらGitHub triggerをクリックしてトリガーを設定します。

Event Sourceが今回のポイントです。ソースコードレポジトリのイベントをキャッチしたいのでCheckout sourceと同じレポジトリを指定します。

あとはSaveすれば完了です。
3. テスト
従来通りCheckout source(Event Sourceと同じ)レポジトリに何かをマージすればパイプランが起動します。同じレポジトリの./circleci/config.ymlではなくConfig sourceのtemplates/config.ymlの内容が実行されていることがわかります。

Discussion