トランクベース開発|ブランチはなぜ短命がよいのか

トランクベース開発|ブランチはなぜ短命がよいのか

二週間ぶりにメインへ戻そうとしたブランチが、衝突の山で半日溶ける。

ブランチ戦略の話になると分岐の図が主役になりがちですが、痛みが出るのは分けた瞬間ではなく、戻すときです。

この痛みを設計で消しにいくのが、トランクベース開発(Trunk-Based Development)という考え方です。

CI や CD の前提条件として名前が挙がることも多いので、輪郭を押さえておくと話の通りがよくなるでしょう。

トランクベース開発とは何か

公式サイトの定義はきわめて短く、「trunk と呼ばれる単一のブランチで協業し、他の長命な開発ブランチを作る圧力に抗う」ソース管理のモデルとされています。

出典: Trunk Based Development

Trunk Based Development

狙いははっきりしていて、マージ衝突とビルド破壊を避けることです。

裏を返せば、長命ブランチは「衝突を未来へ先送りしているだけ」という見方になります。

先送りされた差分は時間とともに増え、戻すときのリスクだけが複利で膨らんでいきます。

継続的インテグレーションの定義そのものが「毎日メインラインへ統合する」である以上、トランクベース開発は CI を成立させるための土台なのですね。

継続的インテグレーション(CI)入門|壊れたらすぐ気づく

「短命」はどれくらい短いのか

では短命フィーチャーブランチの「短命」とは、具体的にどの程度を指すのでしょうか。

公式サイトの記述は明確で、ブランチが生きてよいのは数日、二日を超えると長命ブランチ化のリスクがあると書かれています。

出典: Short-Lived Feature Branches

Trunk Based Development

人数の条件も付いていて、ブランチに乗るのは一人まで、ペアプログラミングでも二人までです。

そこへ他の開発者が合流したり、ブランチ同士をマージしたりする使い方は想定されていません。

trunk へ戻すのはブランチを閉じるときだけで、単独で本番に出せない中途半端な commit を trunk へ混ぜることは明確に禁じられています。

つまりブランチはレビューとビルド検証の待合室であって、作業場そのものではないという割り切りです。

未完成の機能をどう隠すか

ここで必ず出てくるのが、「完成していない機能を毎日 trunk へ入れたら壊れるのでは」という疑問です。

答えはデプロイとリリースを切り離すことです。

コードは trunk に入っていても、フラグで経路を閉じておけば利用者には届きません。

大きな置き換えなら、抽象化の層をはさんで新旧を並走させるやり方も定石です。

リリース側も同様に、必要になった時点で trunk からリリースブランチを切り、出し終えたら捨てる運用が推奨されています。

trunk から直接出して、問題が起きたら前に進んで直す進め方も選択肢のひとつです。

いずれにしても、長生きするブランチを作らずに済ませるところが共通点なのです。

継続的デリバリー(CD)入門|いつでも出せる状態を保つ

導入でつまずくところ

理屈は素直でも、現場に入れると引っかかる箇所がいくつかあります。

第一の壁はレビュー待ちです。

レビューが二日以上滞留する組織では、短命ブランチという前提が物理的に成立しません。

第二の壁は変更の切り方で、機能を横に(層ごとに)割らず、縦に薄く割る練習が要ります。

画面からデータ保存まで通る細い一本を先に通し、そこへ肉付けしていく順番に慣れるまでは、どうしても時間がかかります。

第三の壁は検証で、コミットのたびに走る自動テストが無いと trunk が壊れたまま放置されるので、そこだけは先に整えておきたいものです。

なお「うちは人数が多いから無理」という反論には、公式サイトが単一の trunk で 35,000 人規模が回っている例を挙げて答えています。

規模はトランクベース開発を諦める理由にならない、というのが公式の立場ですね。

最後に

トランクベース開発は、ブランチ図を洗練させる話ではなく、戻すコストを毎日少しずつ払うという選び方です。

私もまだ学んでいる途中ですが、まずは「自分のブランチが今日で何日目か」を数えるところからでも、十分に効き目はありそうに見えます。

二日を超えたら分割を疑う、という小さな習慣から始めてみてはいかがでしょうか。

以上です。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA