« A successful git branching model とgithub flowの比較 | トップページ | 実践反復型ソフトウェア開発を読む part2~マージの戦略 »

2013/04/06

実践反復型ソフトウェア開発を読む part1~ブランチの戦略

実践 反復型ソフトウェア開発」は、僕にとってのソフトウェア開発のバイブルのような本だ。
構成管理、ビルド管理、障害管理、テスト管理の概念が綺麗に整理されていて、何度も読み直している。
理解できたことをラフなメモ書き。

【1】日本の書籍では、構成管理に関する良い本がとても少ない。
ブランチ管理やコミットポリシー、マージポリシーなどは、現場でよく使われているにも関わらず、あいまいな経験知として流布されているだけで、現場ごとにルールが大きく違う。
CVSからSVN、そしてGitへバージョン管理ツールが大きく進化しているのに、肝心の構成管理の考え方は整理されて共有化できていないように思える。
だから、CVSやSVNというツールに囚われすぎたやり方が主流となっていて、Gitのような最新ツールを生かしきれていない場合も多いと思う。

実践 反復型ソフトウェア開発」では、おそらくマイクロソフトが長年蓄積してきたソフトウェア開発の基盤に関するノウハウが凝縮されている。
丁寧な説明と、補足説明した脚注もあり、とても役立つ。

ここでは、ブランチ管理とポート(ブランチ間のマージ)の用語を抜き出してみる。

【2】ブランチの分類

・メインライン
全ての変更が最終的に集まり、ずっと進化し続けるブランチ。
開発ブランチ的な性質も持つが、ビルドが壊れるようなコミットはしない。
但し、メインラインは1本とは限らない。
(例:統合ブランチ、ベンダーブランチ、コンポーネントブランチ)

ここで、ベンダーブランチは外部製品のソースを管理するブランチ、コンポーネントブランチは自社製品の部品のソースを管理するブランチとして分けている。

・保守ブランチ
リリース済の製品を管理するブランチ。
メインラインよりも厳しく管理され、深刻なバグ修正以外はコミットしない。
メインラインから保守ブランチへのバルクポート(FI)はしない。
(例:リリースブランチ、リリース準備ブランチ、ユーザブランチ)

・開発ブランチ。
開発作業用のブランチ。
活発にコミットされるため不安定になりがちなので、安定した時にまとめてメインラインへバルクポート(RI)される。
(例:タスクブランチ、トピックブランチ、フィーチャブランチ、バグフィックスブランチ、リファクタブランチ)

例えば、製品に対して大掛かりなリファクタリングをしたい時、共通インターフェイス修正によって影響範囲が広い時、メインラインとは別のブランチ上で作業した方が、他の開発者に影響を与えることがない。
普通は、タスクブランチ(作業ブランチ)を作って開発し、テストして安定した段階になったら、メインラインにマージして、タスクブランチを廃止する運用になる。

タスクブランチには幾つかの種類がある。

トピックブランチ:より短期にマージすることを意図した小さなタスクブランチ。
フィーチャブランチ:ある機能を実装するためのブランチ。
バグフィックスブランチ:バグ修正するためのブランチ。
リファクタブランチ:リファクタリングを目的としたブランチ。

これはA successful git branching model と考え方が同じ。
チケット駆動開発とセットで運用している場合、タスクブランチの名前にチケット番号を入れておくと分かりやすくなる。
「チケット無しではフォークできず、マージできない」運用ルールもセットにすれば、メインラインをより安全に保証することもできるだろう。

【3】上記のブランチ管理がメインラインモデルと言われる。
メインラインという主流のブランチから他のブランチが派生されては廃止されるので、最新のソースがどこにあるのか、ブランチの目的は何なのか、が分かりやすい。

逆にプロモーションモデルのように、メインラインモデルからどんどん派生していく場合、どれが最新のソースなのかわかりづらく、保守しにくい。

但し、メインラインは1本とは限らない。
大規模開発では、統合ブランチを使って、メインラインへ各チームのソースをマージする前に、統合ブランチへマージして、テストして安定した段階で、統合ブランチからメインラインへマージするのが普通。

よくあるパターンは、段階的統合ブランチのように、開発ブランチ・受入テストブランチ・リリースブランチの3本がメインラインとして存在して使い分ける。
開発ブランチは、各開発チーム単位で持つ開発作業用ブランチで、活発にコミットされる。
受入テストブランチは、リリース前に受入テストを実施して動作確認するための統合ブランチ。
受入テストブランチへ各開発ブランチからマージされて、テストされて検証OKになったら、ようやくリリースできる。
その時、開発ブランチからリリースブランチへパッチをマージして、本番リリース用のソースをタグ付けしてリリースする。

このやり方はA successful git branching model におけるフィーチャブランチと統合ブランチの考え方と同じ。
A successful git branching model では数多くの種類のブランチがあるが、段階的統合ブランチでは、各チームの開発ブランチを統合するためのブランチとして受入テストブランチが用意されている。
普通は、受入テストブランチは、ユーザないしプロダクトオーナーの役割を担う人が受入テストするための環境に相当するだろう。

|

« A successful git branching model とgithub flowの比較 | トップページ | 実践反復型ソフトウェア開発を読む part2~マージの戦略 »

ソフトウェア工学」カテゴリの記事

構成管理・Git」カテゴリの記事

Agile」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« A successful git branching model とgithub flowの比較 | トップページ | 実践反復型ソフトウェア開発を読む part2~マージの戦略 »