dbtはGitブランチを前提に環境とデプロイを結びつけるため、ブランチ戦略は品質・速度・リスクを左右します。
本稿ではtrunk-based(main中心)を基本に、release branchが必要となる条件と設計パターン、CI/テスト・スキーマ設計・選択子(state:modified)までを具体的に解説します。
dbtでは、Gitのブランチを「どのコードで実行するか」を決める一次の切り替え点にします。dbt Cloudではデプロイ用Environmentが1つのGitブランチにひも付き、ジョブはそのブランチのコードで実行されます。CLIでも同様に、チェックアウトしたブランチ上のdbtコマンドが実行対象です。
trunk-based(メインブランチ中心)は、変更を小さく・頻繁にmainへ統合し、PRで品質を担保する方式です。release branchは、ある時点の変更を束ねて“リリース単位”として固定化し、凍結・検証・段階的リリースやロールバックを容易にする方式です。
基本は「featureブランチ → PRでレビューとCI → mainへマージ → mainで本番デプロイ」。PRのCIではslim CI(state比較)を使い、差分とその依存だけを高速に検証します。デプロイはmainブランチを参照する本番Environment/ジョブに集約します。
本番実行とPRビルドの差を最小化するため、deferで本番アーティファクト(前回のmanifest/Run Results)を参照し、未変更モデルの再ビルドを避けながら依存整合性を検証します。
trunk-basedの標準フロー(PR CI → mainデプロイ)
slim CIの最小例(CLI想定、PR時)
dbt deps
# 本番の前回成果物を参照(場所はS3/GCS/DBFS/ローカルなど運用に合わせる)
dbt build \
--select state:modified+ \
--state path/to/prod_artifacts \
--defer日常運用はtrunk-basedで十分です。ただし次のような状況ではrelease branchが有効です。外部向けデータ共有やBIの公開に合わせた一括切替、規制や監査で“この版”の再現性が強く求められる、長時間のバックフィルやスキーマ移行を伴い段階的リリースを管理したい、繁忙期のコードフリーズが必要、など。
設計の要点は、release/* を切ったら必要最小限の変更だけを取り込み、PRレビュー・CIをreleaseブランチで行い、本番Environmentを一時的にreleaseブランチへ向けるか、カナリア用Environmentで先行適用→切替にします。hotfixはreleaseから切ってcherry-pickし、mainへback-mergeして乖離を抑えます。
| 観点 | Trunk-based | Release branch | 試験の観点 |
|---|---|---|---|
| リリース粒度 | 小さい差分を継続 | 変更を束ねて一括 | 小さな差分・頻繁デプロイが推奨ベース |
| リスク管理 | 短命ブランチで低リスク | 長命化でコンフリクト・ドriftの恐れ | 長命ブランチのデメリットを理解 |
| CIの焦点 | PRごとにslim CI | release上で凍結・集中検証 | state:modified と defer の使い分け |
| 移行戦略 | expand→migrate→contract | フェーズド切替/カナリア | スキーマ変更は互換段階を設ける |
| バックフィル | 別ジョブで段階実行 | releaseに含めるか別パイプライン | 大規模処理は本流と分離が基本 |
| ホットフィックス | main直修正→即デプロイ | release/hotfix→cherry-pick→back-merge | 乖離を小さく保つ設計 |
releaseブランチの基本オペレーション(例)
# 一時的なリリースブランチを作成
git switch -c release/2024w42
# 必要なPRのみマージ(スコープを最小化)
# ... code review / merge ...
# dbt Cloudの本番Environmentを一時的に release/2024w42 に向ける
# or カナリア用Environmentで先行適用
# ホットフィックス
git switch -c hotfix/bug-on-release release/2024w42
# 修正後、releaseへマージし、本番へ反映
# mainへback-mergeして差分を解消dbtでは同一データベースでスキーマを分ける運用が一般的です。ブランチは“どのコードを走らせるか”、環境は“どこにデプロイするか”を分担させます。devではユーザごとのスキーマ、stg/qaでは共有スキーマ、prodは固定スキーマという分離が扱いやすいです。
ブランチ戦略と合わせ、スキーマ命名をtarget.nameやカスタムスキーマで一貫させましょう。expand/contractの移行では、旧カラムの残置期間を設け互換を保ちながらreleaseの有無に関わらず安全に進めます。
generate_schema_nameの一例(環境に応じてスキーマを分離)
{% macro generate_schema_name(custom_schema_name, node) -%}
{% if target.name == 'prod' %}
{{ custom_schema_name or 'analytics' }}
{% else %}
{{ target.name }}__{{ custom_schema_name or 'analytics' }}
{% endif %}
{%- endmacro %}slim CIのコアはstate比較です。前回の本番アーティファクトと比較し、変更モデルとその下流のみをビルド・テストします。これにdeferを合わせることで未変更上流を“存在するものとして解決”し、PRビルドを高速化できます。
リリース運用時も、releaseブランチ上で同じ選択子・deferを使い、移行ジョブ(バックフィル)をタグで分離します。contractsとtests(unique/not_null/relationships)は必ずPRで通す設計にします。
selectors.yml と実行例
# selectors.yml
selectors:
- name: pr_modified
definition:
method: state
value: modified
children: true
# 実行例(PR CI)
dbt build --select @pr_modified --state path/to/prod_artifacts --defer
# 実行例(本番)
dbt build --select state:modified+ --state path/to/prod_artifactsAnalytics Engineer試験では、ブランチ戦略そのものよりも、PR中心の開発フロー、state/deferの使いどころ、contracts/testsでの品質担保、互換性のある移行(expand/contract)が問われやすいです。release branchは“例外的に必要な場面”を選べるかが肝です。
典型的な誤りは、長命なrelease運用でmainと差分が拡大する、バックフィルを本流に混在させてPRが通らない、スキーマ変更で下流を壊す、など。いずれも小さな差分・タグ分離・state活用・段階移行で回避できます。
contractsとテストの最小例
models:
- name: fct_orders
config:
contract: true
columns:
- name: order_id
data_type: int
tests:
- unique
- not_null
- name: customer_id
data_type: int
tests:
- relationships:
to: ref('dim_customers')
field: customer_idAnalytics Engineer
問題 1
社内向け分析基盤で、日々の小さな改善を素早く届けたい。PRで差分のみを高速に検証し、本番では影響のあるモデルだけを更新したい。一方、来月に1回だけ大規模バックフィルが予定されている。最適なブランチ戦略と運用はどれか?
正解: A
日常はtrunk-basedで小さく継続的に出すのが基本。PRでslim CI(state/defer)を使い、本番はstate:modified+で差分デプロイ。大規模バックフィルは専用ジョブに分離して本流のデリバリーを止めない。releaseブランチや長期凍結は必要条件がない限り避ける。
slim CIとは何ですか? dbtでどう設定しますか?
前回のアーティファクトと比較し、変更モデルとその下流のみをビルド・テストする手法です。selectors.ymlでstate: modifiedを定義し、dbt build --select state:modified+ --state <前回成果物> --defer のように実行します。PRビルドの高速化に有効です。
releaseブランチでseedやsnapshotはどう扱うべきですか?
影響範囲が広い場合はタグ(例: release_only, migrate)でジョブを分離し、idempotentに再実行できる状態を確保します。releaseブランチ上でもstate/deferを活用して検証し、本番切替はカナリアや段階適用でリスクを抑えます。
SnowflakeやDatabricksなどDWHによってブランチ戦略は変わりますか?
根本の考え方は変わりません。dbtはどのDWHでもGitブランチとEnvironmentで制御します。違いはスキーマ/カタログの分離方法や権限設計で、環境ごとのスキーマ命名、ランナーの権限、コストや同時実行ポリシーを調整すれば同じ戦略が適用できます.
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
dbt Model の基礎: SQL で定義する変換の最小単位
Analytics Engineer 向けに、dbt Model の定義、マテリアライゼーション、依存関係、インクリメン...
dbt Analytics Engineer 試験ガイド: 出題範囲・配点・申込の実務視点
dbt Analytics Engineer 認定の出題範囲、配点の考え方、申込から受験までの流れを、公式ドキュメントの...
dbt Cloud と dbt Core の違いと選び方:Analytics Engineer 試験に効く要点
dbt Cloud と dbt Core の機能差を、実務と資格対策の両面から整理。スケジューリング、IDE、RBAC、...
dbt プロジェクト構造ガイド: models / seeds / macros の実務レイアウト
Analytics Engineer 向けに、dbt プロジェクトのディレクトリ構造と命名規約、dbt_project....
dbt_project.yml の読み方:主要設定と命名を最短で掴む
dbt_project.yml の必須キー、命名解決(database.schema.identifier)、設定優先度...