リリースに適した分岐戦略の選択


11

新しいプロジェクトの新しい開発チームから始め、ソースリポジトリ(Microsoft Team Foundation Server 2010など)の分岐戦略を定義する必要があります。私たちは...するべきかどうかという難しい議論にぶつかりました...

A。実稼働ビルドを行うリリースブランチが1つあり、実際に何かがリリースされたときにラベルを付ける

または

B。本番環境への新しいリリースごとに新しいリリースブランチを作成します(例:バージョン1、2、3など...

オプションAは非常に簡単に思えますが、これが長期的に問題を引き起こすかどうかはわかりません。オプションBは、時間の経過とともに積み重なる1回限りの長寿命ブランチを作成するだけのようです。

私たちが決めるのを助けることができる経験はありますか?具体的には、いずれか1つの選択肢のどこに問題があるのか​​を聞きたいと思っています。TFSおよび/またはリリース管理の意味に関連する特定の経験を提供してください。

回答:


15

オプションA.メインラインを使用してリリース用にタグ付けするだけ

長所:

  • マージ地獄を避けます。
  • メインラインを維持することは、適切なリリース計画、WIPの多くを導入しない、抽象化による分岐を使用して帯域外の長期作業を処理する、オープンクローズシステムと作業管理を処理するための構成可能な機能を使用するなど、いくつかのベストプラクティスを促進します進行中 またはそうでない場合があります。リリースするか、完全なロールバックを回避するには、現在または将来無効にする必要があります。

短所:

  • 進行中の作業に対処することは問題になり、リリースの時期になると潜在的な表面攻撃領域に追加されます。ただし、開発者が規律を守っている場合、新機能は構成可能かつモジュール式であるため、簡単に無効化/有効化する必要があります。または、WIPがなく、各リリースポイントですべての作業が完了するか、まだ開始されていません(つまり、スクラム)。
  • 大規模な/帯域外の変更を実装するには、事前により多くの思考が必要です(たとえば、抽象化による分岐)。

個人的に私はこのアプローチを好みます。コードカバレッジと単体テストでは、出て行く準備ができていないコードを特定し、現在の反復中にリリースされないコードで作業するべきではありません。抽象化または他のメカニズムによる分岐は、長期的な変更や進行中の作業に対処するために使用できます。

これを行わないと、マージの問題、古いコード、リリースされない機能などに対処することに気づき始めます。

オプションB.リリースごとの分岐

長所:

  • 現在の反復が受け入れテストのラウンドを終了している間に、次の反復で作業を開始できます。
  • 確かに他のもの。

短所:

  • たくさんの枝。
  • まだリリースポイントでブランチにタグを付ける必要があります。
  • それでもWIPを処理し、前のリリースブランチのWIPを次のリリースブランチにマージする必要がありますが、リリースブランチを無効にするかヤンクして受け入れテストを再実行する必要がある場合
  • ホットフィックスは、より多くのブランチに適用する必要があります(リリースブランチ+ホットフィックス+新しいタグ+ホットフィックスをvnextブランチにマージし、場合によってはホットフィックスの場所に応じてvnextnextをマージします)。

私はこのソリューションの大ファンではありません^ _ ^。

一般に、メインラインに固執することをお勧めします。開発者がWIPを作成できない問題を抱えている場合、カットに失敗した場合に簡単にヤンクできるか、次のリリースで早期にチェックインできる場合は、コードが完成して分岐する必要がある時点でコードのタグ付けについて話し始めることができますそこから必要に応じて、開発者の単体テストがキャッチできなかった見落とされた欠陥やバグに対処します。

理想的には、ルールではなく例外プロセスにしたいのですが。

オプションC.クレイジーボーナスオプション

おしゃれにしたい場合は、ユーザーストーリーごと/機能ごとの分岐モデルを検討することもできます。(gitやmercurialなどのDVCSを使用している場合、TFSまたはDVCS以外のひどいアイデアを実装するのは非常に簡単ですが、同時に実装するのは非常に簡単です)。

過去に、以前の雇用者メンテナンスチームに以下を実装しました。このチームは、svnからmercurialに簡単に移植できないレガシーコードベースで作業していました。リリースをよりよく調整するのではなく、常にリリース可能なメインラインのビジネス要件を満たすために多くの不要な作業が関係しましたが。。。

  1. 機能は、チームの開発部門の開発者によって開発されました。
  2. 機能をピアレビューする準備ができたら、開発者はそれをまとめてDevブランチからCRブランチへの単一のマージにまとめ、タイトルに機能ID /ユーザーストーリーを含めます。*事前コミットフックによって適用されます*
  3. CRに合格すると、管理ツールを使用して機能をQAブランチに昇格させます。(さまざまな受け入れ段階に存在するユーザーストーリーをリストし、オペレーターがそれらの受け入れ段階の間にそれを促進または降格できるようにする小さなターミナルアプリケーションを作成しました)
  4. QAは自動化および手動のユーザビリティテストを実行します。機能が良好であれば、リリースブランチ(メインライン)にプッシュされます。機能が拒否された場合、テスト中に持ち出された問題に開発者が対処し、CRブランチにパッチを追加できるようになるまで、QAブランチから降格/復帰します。
  5. コードがQAブランチから元に戻され、修正が適用された場合、ターミナルツールは、CRブランチからQAブランチに機能を戻すために必要な変更を再適用し、QAがコードを再レビューしてプロモートするか、もう一度降格します。
  6. どの時点でも、リリースブランチは安定したリリース可能な状態になっている必要があります。
  7. リリース後、新しいDev、QA、およびCRがメインラインからスピンされます。

@Keith_Bringsこれは本当に素晴らしい要約です、ありがとう。すでに示したように、オプションCはTFSを使用しているため実際にはオプションではありませんが、それでもなお興味深いものです。
-JoeGeeky

オプションAの動作方法がわかりません。私の会社では、顧客ごとに異なるリリースがあります。バージョン1.0でまだ機能/修正プログラムの開発を行っており、バージョン2.0、さらには3.0でも積極的に作業している場合、1つのブランチですべてを行うことはできません。おそらく、リリースモデルのために、オプションAを楽しむ贅沢があります。しかし、それはみんなのリリースモデルではありません、と機能のクリープまたは複数の並列のリリースで立ち往生たちのもののために、我々は、使用オプションBに持っている
void.pointer

6

発表したリリースごとに別々のブランチがあります(年間約4回)。特定のリリースをプルする必要がある場合に非常に便利です。

いくつかの古いリリースを維持する必要がある場合、ラベル付けで十分だとは思いません。特定のリリースブランチでは、他のリリースを気にすることなく、各ブランチに個別に(または選択したものに)ホットフィックスを適用できます。

また、バグや機能が導入された時期を探しているときに、リリースの比較がはるかに簡単になります。

ブランチの数やブランチが変更なしで進む時間について心配する必要はありません。バージョン管理システムは、プロジェクトの開発の制御と履歴の提供を目的としています。歴史は変わらない傾向があります...そしてあなたのcvsが対処できないことを心配しないでください。開発ブランチではPerforce、9000以上のファイル、作業中のリリースでは最大50の開発ブランチを使用し、既に述べたように、リリースごとに1つのブランチを公開しています。パーフォースは一生懸命呼吸していません。

要するに、開発者/メンテナー/バグ修正者/問題ハンターとしての生活を楽にし、ブランチの数やファイルの数を心配しないでください。自尊心のあるcvsは対処します。

編集:

ブランチの数に関して混乱はまったくありません。リリースブランチの命名スキームと開発(または作業)ブランチの1 issue 1ブランチポリシーは、それと関係がある可能性があります。

リリースブランチは、保持するリリースに基づいて名前が付けられます。つまり、リリース2011 Service Pack 1のR2011SP1です。作業ブランチの名前はインテリジェントではありません。sub01、sub02、sub03などです。受け入れブランチの。承認ブランチは、リリースする準備ができているすべての問題が収集されるブランチです。

課題追跡システムが「ブランチ」フィールドでカスタマイズされているという事実と相まって、1課題1作業ブランチポリシーは、どの課題がどのブランチで開発されているかを常に確認できるようにします。問題が受け入れブランチに統合されると、このフィールドが更新されます。これは、リリースの準備ができている問題を常に把握していることを意味します(受け入れテストが完了したら)。同様に、リリースブランチが作成されたときにこのフィールドを更新します。これにより、どのリリースで問題がリリースされたかを常に追跡できます。


1
TFSのラベルから分岐できると思います。したがって、ラベルを忘れていない限り、現在の製品バージョンのホットフィックスに問題はないはずです。
キースは

@KeithBringsそれは正しい、私はちょうどそれをテストし、あなたは確かにラベルから分岐することができます。
-JoeGeeky

@MarjanVenemaシステムの負荷についてはあまり心配していませんが、多くのブランチが混乱を引き起こす可能性があります。また、リリースブランチのスタックで行われた変更が、それらを取得する他のリリースブランチにマージされないことを少し心配しています。メインラインを気にしないでください。この種の問題に遭遇しましたか?
-JoeGeeky

@JoeGeeky:いいえ、混乱はまったくありません。私の答えの更新をご覧ください。
マルジャンヴェネマ

2

コンテキストがすべてです:リリースの頻度とリリースの内容。

Bメソッドを使用して、以前の作業で行った少しのケーススタディを以下に示します(目的によってブランチと呼びます)。

ストーリーを文脈に合わせるために、

  • リリースは、ソフトウェアの新しい機能で構成されていました:新しいゲームモード、新しい機能、新しい構成オプション。
  • リリースサイクルはかなり長く、クライアントは大学であり、通常1年間は1つの機能セットを使用していました。

特定のリリースで機能が完全な状態になるまで、主な開発はトランクに組み込まれました。その時点で、たとえばprojectname-january2012というブランチを作成し、そのブランチで品質テストとバグ修正を行います。パブリックリリースの準備ができたら、そのブランチのコードにタグを付けてリリースします。

ただし、リリースでの開発はそのタグで終わりませんでした。必然的に、リリースにバグや小さな問題を発見したクライアントがいました。その場合、そのブランチに戻り、コードにパッチを適用し、リリースされるjanuary2012ブランチの新しいタグ付きバージョンを作成し、修正をトランクにマージするだけです。

私たちの場合、一部のユーザーは機能の限定された古いリリースにとどまることを好むため、または単にホットフィックスではなくインフラストラクチャにまったく新しいバージョンを展開するコストが問題を引き起こすため、このアプローチは好ましいものでした。

したがって、あなたが自問しなければならない質問は次のとおりです。

  • どのくらいの頻度でリリースしますか?
  • 私のリリースは100%後方互換性がありますか?
  • クライアントはバグを修正するために完全にアップグレードしても大丈夫ですか?

頻繁にリリースする場合は、それぞれにブランチを用意する価値はありません。ただし、私の古いユースケースのようにリリースサイクルがかなり長く、そのリリース、下位互換性、古いリリースに固執するクライアントがリスクになる可能性がある場合、オプションBは確かに多くの苦痛を軽減し、物事をサポートしやすくしますブランチクラッターに対処する最小限のコストでクライアントをサポートします。


私はあなたがそのオプションをどのように呼ぶかが好きです。この場合、私たちは(いわば)私たち自身の顧客であるため、展開は主に私たちの管理下にあります。私たちはスクラムショップでもあり、かなり頻繁なリリースサイクル(2〜4週間ごとなど)を予定しています。ローリングアップグレードをサポートしたいと考えていますが、下位互換性は、アップグレードをロールアウトするのにかかる限り問題になります。その音から。あなたの経験では; オプションB 私にとって最良の選択ではないかもしれません。情報をありがとう、非常に興味深い。
-JoeGeeky

ああ、そうだとすれば、オプションBはほとんど戻りのない混乱のように聞こえます。両方のオプションが実行可能であり、それぞれに利点があることを強調したかっただけです。私は明示的に言及するのを忘れました:バグ修正にどのように対処しますか?それらは、新しいリリースのみに適用されますか、それともパッチ/パッチを適用した古いリリースに適用されますか?
ブシバイト

1

私はオプションAを好みます。安定しているときにトランクおよびブランチリリースで開発します。これにより、実稼働リリースに適用されるホットフィックスを統合する作業が大幅に制限されます。

私は、オプションBを試みたチームが軌道に乗るのを助けるために契約しました。

考慮すべきことがいくつかあります。

  • すべてのアクティブなコードブランチを通じて修正プログラムを前方に移行します。これは、マージ、パッチ適用、および/または再開発によって実行できます。これらはすべての適切なリリースに適用され、その後トランクに適用されるように完全に管理する必要があります。
  • メインコードストリームから分離して機能を開発できるように、機能ブランチを検討します。これらは実験的な変更のために推奨されます。機能が機能しない場合は、機能の分岐を放棄してください。
  • マージポイントにタグを付けて追跡します。
  • 必要に応じてリリースを分岐します。これは、通常、リリースのリリース候補ビルドのリリースの準備が整ったときです。場合によっては、トランクに互換性のない変更を導入すると、強制的に早期ブランチが発生する場合があります。機能ブランチを検討してください。

0

私は、あなたが説明している2つのスキームの間に何かを使用するシステムに何年も取り組んできました。重要なのは、マルチレベルの番号付けスキームが使用されていることです。外側のレベルは基本的にAPIバージョンであり、それはブランチで管理され(複数のブランチで何かを修正する必要がある場合に適切なクロスマージを使用)、内側のレベルはタグで管理される正確なリリースです。

特に、顧客の正確なバージョンがわかっている場合、コードの作成元を正確に把握し、正確な複製を作成して、何が起こっているのかを正確に確認できます。これはサポートのために非常に重要です!しかし、現在リリースされているAPIバージョンであるブランチの外部レベルは、時間とともに進化します(開発のメイントランクが新しい機能の大部分を取得します)。また、APIの新しいメジャーリリースを行うとき、それをサポートするための新しいブランチを作成します(したがって、トランクは常にハードコア開発指向にすることができます)。ブランチ。

したがって、実際にはABの両方が混在するものをお勧めします。両方とも良い面を持っていますが、どちらもそれ自体では完全ではありません。両方の長所を活用してください。


0

過去にオプション(B)を効果的に実装するためにTFSを使用しました。

分岐/マージは、小さな部分で行うと優れたツールです。困難なのは、ブランチを作成すること(愚かな簡単なこと)や、1週間分の作業をツリーに戻すこと(通常は簡単なこと)です...ソース管理の背後にあるCIシステムを自動的に機能させることです。君は。

システムがブランチのテストを自動的に構築および実行していない場合、ブランチは意味がありません。

TFSのデフォルトのビルドワークフローをカスタマイズして、変更セットの相対パスを認識し、(一部の開発ルートの下の新しいサブフォルダーとは対照的に)カスタマイズが新しいブランチを認識できる規則を確立しました。スムーズで、ブランチが簡単で、ブランチを簡単に削除でき、コンパイルとテストのためにシステムから継続的なフィードバックを得ました。

これらの戦略がTFSのもとでどれほど不可能であるかを宣言する人がたくさんいますが、それはXAMLベースのビルドエンジンの可能性に精通していないためだと思います。TFSは単なるソース管理ではなく、ソリューション全体であるため、そのまま使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.