株式会社ブレインパッド プロダクトユニットの岡です。
弊社は「データ活用の促進を通じて持続可能な未来をつくる」をミッションに、
データ分析支援やSaaSプロダクトの提供を通じて、企業の「データ活用の日常化」を推進しております。
私は、SaaSプロダクトを開発・提供する「プロダクト・サービス」部門に所属し、
企業のマーケティング活動をデータで支援する「Rtoaster GenAI」の開発を担当しております。
はじめに
CircleCI を利用していて、「サービスごとにビルド・デプロイ手順や実行条件が異なり、
共通設定では管理しづらい」「パラメータに応じてワークフローを動的に生成したい」といった場面に遭遇したことはないでしょうか。標準の config.yml だけでは、冗長な記述が増えたり、複雑な条件分岐の管理が困難になることがあります。
本記事では、CircleCI の ダイナミックコンフィグ と YAML テンプレートエンジンである ytt を組み合わせ、柔軟でメンテナンス性の高い CI ワークフローを構築する方法を解説します。
対象読者
- CircleCI の設定ファイルをより柔軟に管理したい
- モノレポ構成での CI 最適化を検討している
- YAML の重複記述を減らし、テンプレート化したい
ダイナミックコンフィグとは
CircleCI のダイナミックコンフィグ(Dynamic Configuration)は、CI の実行中に動的に設定ファイル(config.yml)を生成し、その設定に基づいて後続のジョブを継続実行する機能です。
これにより、Git の差分に応じたジョブの出し分けや、外部ファイルからのパラメータ注入によるワークフローの動的生成が可能になります。
https://circleci.com/docs/guides/orchestrate/dynamic-config/
ytt とは
ytt (YAML Templating Tool) は、Carvel プロジェクトが提供する YAML 専用のテンプレートエンジンです。
YAML 内でループ、条件分岐、関数の定義などが記述できます。
https://carvel.dev/ytt/
実装
今回の実装では、以下の 3 つのファイルを使用します。
-
config.yml: セットアップ用の設定(ダイナミックコンフィグの起点) -
template.yml:yttを用いたワークフローのテンプレート -
values.yml: 各ジョブに注入するパラメータ定義
1. セットアップ設定 (config.yml)
まず、setup: true を指定してダイナミックコンフィグを有効化します。このジョブの中で ytt を実行し、生成された設定ファイルでワークフローを継続(continuation)させます。
version: 2.1
setup: true
orbs:
continuation: circleci/continuation@2.0.1
jobs:
setup:
docker:
- image: alpine:3.18
steps:
- checkout
- run:
name: Install ytt
command: |
wget -qO- https://github.com/carvel-dev/ytt/releases/latest/download/ytt-linux-amd64 > /usr/local/bin/ytt
chmod +x /usr/local/bin/ytt
- run:
name: Generate and continue config
command: |
ytt -f .circleci/template.yml -f .circleci/values.yml > .circleci/generated_config.yml
- continuation/continue:
configuration_path: .circleci/generated_config.yml
2. パラメータ定義 (values.yml)
#@data/values
---
jobs:
- app_name: "app"
file_name: "app_1.yml"
- app_name: "app1"
file_name: "app_2.yml"
3. テンプレートの設定 (template.yml)
#@ load("@ytt:data", "data")
version: 2.1
# ... エグゼキューターやジョブの定義 ...
workflows:
build-and-deploy-dev:
jobs:
#@ for i, job in enumerate(data.values.jobs):
- #@ {"build-" + job.app_name: {"environment": "dev", "deploy_name": job.app_name, "file_name": job.file_name}}
#@ end# ワークフローの動作
この構成で CI を実行すると、以下のプロセスが走ります。
-
Setup Job:
config.ymlが読み込まれ、yttがインストールされる -
Generation:
yttがtemplate.ymlとvalues.ymlをマージし、appとapp1の両方のビルドジョブを含む.circleci/generated_config.ymlを出力する -
Continuation:
circleci/continuationOrb によって、生成された設定ファイルに基づいた新しいワークフローが開始される
まとめ
CircleCI のダイナミックコンフィグと ytt を組み合わせることで、静的な YAML では難しかった柔軟な設定管理が可能になります。
ポイントは以下の通りです。
- ダイナミックコンフィグ: 実行時に設定を生成し、後続に引き継ぐ
- ytt: YAML 構造を保ったままループや条件分岐でテンプレート化する
- 設定の分離: ロジック(template)とデータ(values)を分けることで、メンテナンス性が向上する