第1章
構成管理入門  

第2章
Subversionによるバージョン管理入門

第3章
Subversionベストプラクティス

第4章
Maven2によるビルド入門

第5章
Maven2ベストプラクティスリリースの自動化

第6章
リリースの自動化

Appendix
Maven 2はまり道


※WEB+DB PRESS Vol.39掲載の記事を載せています。

第3章 Subversionベストプラクティス

Authors:YOSHIHARA Hidehiko

コードライン編その1 メインライン

コードラインは、ソフトウェアを開発するためのソースコードやリソースの集まりが変更していく過程を表したものです。コードラインを使いこなせば並行して作業が行え、ソフトウェア開発を効率よく行うことができます。半面、コードラインそのものにチーム全体が振り回される恐れがあります。

さて、M子ちゃんの開発現場ではそのような状況になっているのか、その模様を覗いてみましょう。

O先輩●M子ちゃん。ちょっと、これ見てもらえるかな?

M子が、先輩のディスプレイを覗いた瞬間、思わず絶句してしまいます。そこには、すでに修正済のバグ が発生していたのです。

M子●このブランチへのマージが漏れていたみたいです。すぐ対応します。
O先輩●うーん。このブランチ以外にもマージ漏れがないのかな。この修正がどこまで反映されているのか把握できてるのかな。
K太●G社にはパッチをちゃんと出しているから大丈夫ですよ。それに、これだけブランチがあるとマージが大変なんです。もしかしたらマージしておかしくなるかもしれないし。
O先輩●じゃあ、新たにG社に障害が出たときはどのコードラインに対して修正すればいいのかな?バグ対応が漏れたままのブランチを使用し続けていたらそれこそ大変なことになってしまうところだったよね。

M子とK太君は黙ってしまいました。実は、つい最近もリリース先に対して障害とデグレードが発生し、 その対応をどのブランチに対して行えばよいのかわからずに、無駄に時間を浪費していたからです。

O先輩●まずは、自分たちが開発を行っていく中心になるコードラインを決めてみよう。これを「メインライン」と呼ぼうか。ブランチの作成はメインラインから行うようにして、ブランチに修正した場合は、すぐにメインラインにマージするようにしてみよう。
M子●先輩が言っていることは、当たり前のことのように思いますけど…。それにマージは大変で…。
O先輩●そうだよね。でも、その当たり前のことができていないからこんなことになっているんだよ。マージは、間隔を開けないように心がければそんなに大変なものじゃないんだ。極力ブランチの作成をしないように、ブランチを広げないように注意することが大切なんだよ。

すべては、1つになる

複雑にブランチが階層化したコードラインは、バグに対する修正がどこまで反映されているのか、またどこまで反映すればよいのかが不明確になります。また、ブランチの複雑さに比例して、マージにかかる手間が増えていきます。
コードラインが複雑化する要因には、不用意なブランチの作成とオリジナルのコードラインに対してマージを怠ることが挙げられます(図1)。
図1 階層が深くなり複雑化したブランチ


そこで、次のような取り決めに沿ったメインラインを定めることで、不用意なブランチの作成を抑え、コードラインが複雑に広がることを抑えます(図2)。
図2 メインライン導入後のブランチ


■メインラインを1つに保ちましょう
Subversionでは、trunkをメインラインとして使用することを推奨しています。 開発はメインラインに対して行うことを心がけてください。ほかのブランチへメインラインの置き換えを行った場合も、そのブランチにメインラインの原則を適応して、メインラインが複雑化しないようにしましょう。

■メインラインは正しくビルドできる状態に保ちましょう
すべての開発者は、通常メインラインに対して作業を進めていきます。コミット時に事前テストを行ったり、インテグレーションビルドを行うなど、メインラインから取得する作業環境は常に正しくビルドが行えるように保ち続けましょう。

■メインラインからブランチを作成しよう
ブランチは極力作成を行わないほうが好ましいですが、作成を行いたい場合、ブランチからブランチを作成するようなことは避け、メインラインからブランチを作成するように心がけることで、複雑化を抑えることができます。

■ブランチの変更は素早く元のメインラインに反映させましょう
ブランチに対する変更作業にかかる期間が長ければ長いほど、マージを行うことが困難になります。ブ ランチを作成して分岐を行った場合、その変更内容を素早くメインラインに戻すことを心がけましょう。

[Backlog] - Subversion -