トランクベース開発

英語名 Trunk-Based Development
読み方 トランク ベースド デベロップメント
難易度
所要時間 導入に1〜2週間
提唱者 Google、Facebookなどの大規模開発チーム
目次

ひとことで言うと
#

全員が1つのメインブランチ(trunk/main)に頻繁にコミットし、長寿命のブランチを作らないブランチ戦略。フィーチャーフラグと自動テストを組み合わせて、常にデプロイ可能な状態を保つ。

押さえておきたい用語
#

押さえておきたい用語
トランク(Trunk)
すべての開発者がコミットする1つのメインブランチのこと。Git では mainmaster に相当する。常にデプロイ可能な状態を維持する。
フィーチャーフラグ(Feature Flag)
未完成の機能をmainにマージしてもユーザーには見せないようにするスイッチを指す。コード内のif文やLaunchDarkly等のツールで実装する。
短命ブランチ(Short-Lived Branch)
mainから分岐して1〜2日以内にマージされるブランチのこと。トランクベース開発ではブランチの寿命を極力短くする。
CI/CD
コードの変更を自動でビルド・テスト・デプロイする継続的インテグレーション / 継続的デリバリーである。トランクベース開発の成否を左右する前提条件。

トランクベース開発の全体像
#

トランクベース開発:全員がmainに頻繁にマージする
Before(Gitflow)maindevelopfeature(2週間)feature(3週間)💥コンフリクト頻発After(トランクベース)main(trunk)数時間1日コンフリクトほぼゼロ成功の3条件短命ブランチ寿命1〜2日以内フィーチャーフラグ未完成機能をユーザーに見せない強力なCI/CD自動テスト+自動デプロイ常にデプロイ可能Always Releasable
トランクベース開発の導入フロー
1
短命ブランチ
ブランチ寿命を1〜2日に制限する
2
フィーチャーフラグ
未完成機能をフラグで隠してmainにマージ
3
CI/CD整備
マージのたびに自動テスト・自動デプロイ
日次リリース
常にデプロイ可能な状態を維持

こんな悩みに効く
#

  • featureブランチが長期化して、マージのたびに大量のコンフリクトが発生する
  • リリースまでのリードタイムが長く、フィードバックループが遅い
  • Gitflowの運用が複雑すぎて、チームが混乱している

基本の使い方
#

ステップ1: 短命なブランチで作業する

ブランチの寿命を1〜2日に制限する

  • mainから分岐し、短いPRで頻繁にマージする
  • 1つのPRは数時間〜1日で完了するサイズにする
  • 大きな機能は小さなPRに分割して段階的にマージする

ポイント: 「PRが小さすぎる」ことはほぼない。大きすぎることが問題。

ステップ2: フィーチャーフラグを活用する

未完成の機能をmainにマージしても、ユーザーには見せない仕組みを作る

  • フィーチャーフラグで機能の有効/無効を切り替える
  • 完成したらフラグをONにして全ユーザーに公開
  • 段階的ロールアウト(カナリアリリース)にも使える

ポイント: フィーチャーフラグはコードのif文で実装するか、LaunchDarkly等のツールを使う。

ステップ3: 強力なCI/CDを整備する

mainにマージするたびに自動でテスト・デプロイが走る環境を作る

  • すべてのPRでCI(ビルド+テスト)が必須
  • mainへのマージをトリガーにステージング→本番へ自動デプロイ
  • テストカバレッジを高く保つ(mainが常にデプロイ可能であるために必須)

ポイント: CI/CDの品質がトランクベース開発の成否を分ける。

具体例
#

例1:BtoB SaaS企業がGitflowからトランクベース開発に移行する

状況: 従業員60名のBtoB SaaS企業、エンジニア18名。Gitflow運用でfeatureブランチの平均寿命が12日。マージコンフリクトの解消に週あたりチーム合計15時間を消費。リリースは月1回。

移行ステップ:

  1. フィーチャーフラグ基盤(LaunchDarkly)を導入
  2. 「ダッシュボード刷新」をフィーチャーフラグ付きで開発
  3. 日々のPR: 「新しいグラフコンポーネントの追加」(フラグOFFでmainにマージ)
  4. 翌日のPR: 「データ取得APIの追加」(フラグOFFでmainにマージ)
  5. 全パーツが揃ったら、フィーチャーフラグをONにして公開
指標Before(Gitflow)After(トランクベース)
ブランチ平均寿命12日0.8日
マージコンフリクト解消週15時間週0.5時間
リリース頻度月1回日次
リリースリードタイム6週間2日

コンフリクト解消に費やす時間、週15時間→0.5時間。ブランチ寿命を12日から0.8日に縮めただけでこの差がつく。リリース頻度も月1回から日次に変わった。

例2:大規模プロダクトで100人のエンジニアがトランクベース開発を実践する

状況: MAU 500万人のWebサービス。エンジニア100名、15チーム。各チームが独自のfeatureブランチを持ち、「インテグレーション地獄」(全チームのブランチをマージする週末作業)が常態化。リリースは隔週。

導入の3段階:

  • Phase 1: CIパイプラインを強化(テスト実行時間を45分→8分に短縮)
  • Phase 2: フィーチャーフラグ運用ルールを標準化
  • Phase 3: 全チームのブランチ寿命を段階的に短縮(2週間→3日→1日)
指標BeforeAfter(6ヶ月後)
ブランチ平均寿命14日1.2日
週末インテグレーション作業毎回8時間廃止
リリース頻度隔週1日平均4.2回
リリース起因障害月8件月2.1件
デプロイから問題検知まで平均3日平均35分

リリース起因障害、月8件→2.1件。問題検知まで3日→35分。100人規模でもトランクベース開発は機能する——ただしCI/CDの高速化とフィーチャーフラグの標準化が前提。

例3:地方のSIerがクライアント向け開発にトランクベース開発を導入する

状況: 従業員35名の地方SIer。受託開発でクライアント向けの業務システムを構築。エンジニア10名がGitflowで運用していたが、develop→main のマージで毎回半日〜1日のコンフリクト解消作業が発生。納品スケジュールが常にギリギリ。

段階的導入:

  • まずブランチ寿命を「1週間→3日」に短縮(フィーチャーフラグなし)
  • 3日以上かかるタスクは設計段階で分割する習慣を定着
  • CI(GitHub Actions)を導入し、PR時の自動テストを必須化
指標BeforeAfter
ブランチ寿命平均7日平均2.5日
コンフリクト解消デプロイ日に半日ほぼゼロ
納品遅延率40%のプロジェクト8%のプロジェクト
受入テストでのバグ平均12件/プロジェクト平均4件/プロジェクト

納品遅延率40%→8%。フィーチャーフラグなしでも、ブランチ寿命を短縮するだけでこの改善が得られた。副産物として「タスクを小さく分割する」習慣がチーム全体の設計力を底上げしている。

やりがちな失敗パターン
#

  1. フィーチャーフラグなしで始める — 未完成の機能がmainに入ってユーザーに見えてしまう。フィーチャーフラグの仕組みを先に整備してから移行する
  2. テストが不十分なままmainにマージする — mainが壊れて全員の作業がブロックされる。CI必須+テストカバレッジの基準を設ける
  3. フィーチャーフラグを消し忘れる — 公開済みの機能のフラグがコードに残り続ける。フラグの棚卸しを定期的に行い、不要なフラグは削除する
  4. PRを小さくするスキルを教えない — 「小さいPRにしろ」と言うだけで方法を教えないと、チームが混乱する。タスク分割のワークショップやペアプロでスキルを共有する

まとめ
#

トランクベース開発は 「常にmainをデプロイ可能に保つ」 というシンプルな原則に基づくブランチ戦略。Gitflowより運用がシンプルで、CI/CDとの相性が抜群。ただし、フィーチャーフラグと高品質な自動テストが前提条件。まずはブランチの寿命を 「1週間→3日→1日」 と段階的に短くするところから始めよう。