ブランチ作戦†
主だった作戦は次の3つ。
- すべての集約先 trunk
- リリースに向けたリリースブランチ
- 開発初動に向けたタスクブランチ
1. すべての集約先 trunk†
すべてのコードは最終的に trunk に集約させます。すべてのブランチは trunk からコピーし trunk に還ります。基本的にはブランチからブランチをコピーすることはしません。このこと、つまりすべての変更を必ず trunk にマージすることをルール化することで、バグフィックスやテーマ開発の適用漏れを防ぎます。
- すべてのブランチのコピー元
- すべてのブランチのマージ先
- trunk は永続する
+--[branche]--+ | | --[trunk]--+-----+-------+-----+--> | | +--[branche]--+
2. リリースに向けたリリースブランチ†
リリースに向けたコードは リリースブランチ で安定化させます。およそ ST または UAT のフェーズ開始時点でそのリリースに対応するリリースブランチを trunk からコピーします。このリリースブランチからビルドするパッケージで ST や UAT を経て、このリリースブランチが安定したと言います。リリースはこのままこのリリースブランチからビルドします。リリース後、軽微なバグフィックスを入れたい場合はリリースブランチに変更を入れてこのリリースブランチからビルドして再リリースします。
ST や UAT で生じた変更とリリース後のバグフィックスはすべて trunk にマージしなければなりません。従って、次のテーマが待っているのでなければリリースブランチをコピ-するタイミングは遅いほどよいです。コピー後の変更を trunk にマージする手間が省けます。
- (ST, UAT, )リリースのためのブランチ
- リリース後すべての変更を trunk にマージ(少ない想定)
- 次のリリース後破棄
!: bug fix x: end point release release release ^ ^ ^ | | | +--[release]--!--++---!---++-------------------->x| | | | +--[release]--++--> | | | | | --[trunk]--+-----------------+--------+--------+--------------+-->
3. 開発初動に向けたタスクブランチ†
UT までの各テーマ開発は タスクブランチ で安定化させます。開発開始時点でそのテーマに対応するタスクブランチを turnk からコピーします。このタスクブランチからビルドするパッケージで UT を経て、このタスクブランチが安定したと言います。IT はこのタスクブランチの変更分を trunk にマージした後 trunk からビルドするパッケージで実施します。これは、複数テーマを並行して開発する際に、各テーマごとのコードラインではなく、合わさったコードライン(つまりマージ先の turnk)が安定していると言うためです。IT 以降リリースブランチがコピーされるまでの変更は trunk に入れます。
- 各テーマ開発のためのブランチ
- 開発・UT後すべての変更を trunk にマージ
- trunk にマージ後破棄
+--[release]--> | --[trunk]--+--+----------++-------+-------------> | | || ^ | +--[task]--+| end of IT | | +--[task]------+ ^ end of UT
この作戦における各テストフェーズの意義†
この作戦を採り各テストフェーズ(UT, IT, ST+UAT)に次の意義をもたせます。
- UT
- 各開発テーマで満たすべき機能の実装が完了したことを検証する
- IT
- (次のリリースに向けて)各開発テーマで満たすべき機能が他の開発テーマの機能やバグフィックスと同時に正しく*1動作することを検証する
- ST+UAT
- 次のリリースに至るコードライン(からビルドするパッケージ)が満たすべき機能を備えていることを検証する
+===(ST+UAT)===> | --[trunk]--+----------+===(IT)===+--------------> | | +===(UT)===+