継続的な統合を行う場合に使用する最適な分岐戦略は何ですか?
これらの戦略の両方を一緒に使用することは理にかなっていますか?たとえば、リリースごとに分岐しますが、大規模な機能にも分岐しますか?これらの戦略の1つは、継続的インテグレーションとよりよく合致しますか?不安定なトランクを使用している場合でも、継続的な統合を使用することは理にかなっていますか?
私は毎日の仕事でブランチに大きく依存しているため、このトピックは非常に興味深いものです。
リンクがおもしろいと思います。
答えは、チームの規模とソース管理の品質、および正しく複雑な変更セットをマージする能力に依存します。たとえば、CVSやSVNのような完全なブランチソース管理では、マージが難しくなる可能性があり、最初のモデルの方が良いかもしれませんが、IBM ClearCaseのようなより複雑なシステムを使用し、チームの規模が大きい場合は、2番目のモデルの方が良いかもしれませんモデルまたは2つの組み合わせ。
私は個人的に、各主要機能が個別のブランチで開発される機能ブランチモデルを分離し、個々の開発者が行う変更ごとにタスクサブブランチを作成します。機能が安定すると、トランクにマージされます。トランクは適度に安定し、すべての回帰テストに常に合格します。リリースサイクルの終わりに近づき、すべての機能ブランチがマージされると、安定性のバグ修正と必要なバックポートのみを行うリリースシステムブランチの安定化とブランチが行われますが、トランクは次のリリースの開発に使用されます新機能のブランチのために分岐します。等々。
このように、トランクには常に最新のコードが含まれていますが、大きな変更と機能のマージで安定したラベル(タグ)を作成して、合理的に安定した状態に保つことができます。機能ブランチは、継続的な統合と個々のタスクのサブブランチでのペースの速い開発です機能ブランチから更新されて、同じ機能で作業している全員を同期させながら、同時に異なる機能で作業している他のチームに影響を与えません。
同時に、履歴を通じて一連のリリースブランチがあり、何らかの理由で製品の以前のバージョンまたは最新のリリースバージョンにとどまる顧客にバックポート、サポート、バグ修正を提供できます。トランクと同様に、リリースブランチに継続的な統合を設定するのではなく、すべてのリグレッションテストおよびその他のリリース品質管理に合格すると、慎重に統合されます。
何らかの理由で2つの機能が相互に依存しており、相互に変更が必要な場合は、両方を同じ機能ブランチで開発するか、コードの安定した部分をトランクに定期的にマージしてからの変更を更新する機能を要求することを検討できますトランクブランチ間でコードを交換するトランク。または、これら2つの機能を他の機能から分離する必要がある場合、それらの機能ブランチを分岐し、機能間でコードを交換するために使用できる共通のブランチを作成できます。
上記のモデルは、50人未満の開発者と、スパースブランチとCVSやSVNのような適切なマージ機能のないソース管理システムではあまり意味がありません。このモデル全体をセットアップ、管理、統合するには悪夢です。
個人的には、安定したトランクを持ち、機能の分岐を行う方がずっときれいだと感じています。そのようにして、テスターなどは単一の「バージョン」にとどまり、トランクから更新して、コードが完全な機能をテストします。
また、複数の開発者が異なる機能で作業している場合、それらはすべて独自の別個のブランチを持ち、完了したらトランクにマージし、テスターが複数のブランチに切り替えて異なる機能をテストすることなく、テストする機能を送信できます。
追加のボーナスとして、自動的に行われる統合テストのレベルがあります。
アプリの複数のバージョンを維持する必要がある場合、リリースブランチは非常に便利であり、絶対に必要です。
機能ブランチも非常に便利です。特に、ある開発者が大きな変更に取り組む必要がある一方で、他の開発者がまだ新しいバージョンをリリースする場合です。
私にとって、両方のメカニズムを使用することは非常に良い戦略です。
SVNの本 からの興味深いリンク。
各開発者が毎日トランク/メインラインにコミットする重要な原則の1つを覚えていれば、どちらの戦略も継続的な開発に使用できると思います。
http://martinfowler.com/articles/continuousIntegration.html#EveryoneCommitsToTheMainlineEveryDay
編集
私はCIで この本 を読んでいますが、著者は、リリースによる分岐が好ましい分岐戦略であることを示唆しています。同意しなければなりません。 CIを使用する場合、機能による分岐は意味がありません。
このように考えている理由を説明します。 3人の開発者がそれぞれブランチに参加して機能を開発するとします。各機能が完了するまでに数日または数週間かかります。チームが継続的に統合されるようにするには、少なくとも1日に1回はメインブランチにコミットする必要があります。これを開始するとすぐに、機能ブランチを作成する利点が失われます。それらの変更は、他のすべての開発者の変更から分離されなくなりました。その場合、なぜ機能ブランチを最初に作成する必要があるのでしょうか?
リリースによる分岐を使用すると、ブランチ間のマージがはるかに少なくなり(常に良いことです)、すべての変更ができるだけ早く統合され、(正しく実行された場合)コードベースが常にリリースの準備ができます。リリースごとに分岐することのマイナス面は、変更にかなり注意する必要があることです。例えば。大規模なリファクタリングは段階的に行う必要があり、次のリリースで不要な新機能を既に統合している場合は、何らかの種類の 機能の切り替え メカニズムを使用して非表示にする必要があります。
別の編集
このテーマについては複数の意見があります。以下は、CIで分岐したプロ機能であるブログ投稿です。
http://jamesmckay.net/2011/07/why-does-martin-fowler-not-understand-feature-branches/
最近、gitを使用するときに このモデル が好きになりました。あなたの質問には「svn」というタグが付けられていますが、それでもそれを利用できる可能性があります。
継続的インテグレーションは、このモデルの「開発」ブランチ(またはそれを呼ぶもの)である程度発生する可能性がありますが、将来のリリースで機能ブランチを長時間実行しても、どこかでコードに発生するすべての変更を考慮するほど厳格ではありません。あなたが本当にそれを望んでいるかどうか、問題は残っています。 マーティン・ファウラーがします。
原則を理解している限り、いつでもベストプラクティスを再発明できます。原則を理解していない場合、ベストプラクティスは、競合する外部要件のためにバラバラになる前にあなたを連れて行きます。
メインラインモデルのベストイントロについては、こちらをお読みください: https://web.archive.org/web/20120304070315/http://oreilly.com/catalog/practicalperforce/chapter/ch07.pdf
リンクを読んでください。基本を習得したら、由緒あるHenrik Knibergによる次の記事を読んでください。 Mainline Modelを継続的インテグレーションに関連付けるのに役立ちます。
継続的インテグレーションは、分岐戦略を決定する上でいかなる要因でもありません。チーム、開発中のシステム、利用可能なツールに基づいて、分岐アプローチを選択する必要があります。
そうは言っても ...
これらはすべて、ダイアグラムを取得したページの4番目の質問で回答されました。 http://blogs.collab.net/Subversion/2007/11/branching-strat/
チームを立ち上げたとき、担当するシステムを最初に開発したベンダーからリリースベースの戦略を引き継ぎました。顧客がいくつかの開発された機能をリリースに含めないように要求するまで機能していました(f.y.i.〜250k行のコード、〜2500ファイル、XP SDLC)のスクラム)。
次に、機能ベースのブランチを検討し始めました。これもしばらくは機能しました-回帰テストのプロセスに2週間以上かかることに気付くまで2か月ほどでしたが、リリースされるものの不確実性と相まって、大きな不便が生じました。
純粋なSC戦略の最終的な「coの中の爪」は、1。安定したトランクと2.生産にST、UAT、および回帰テストされたBINARIESを含める必要があることを決定したときに来ました。ソース-CCと思います。)
これにより、機能とリリースベースのSC=戦略のハイブリッドな戦略を考案することになりました。
トランクがあります。すべてのスプリントは、スプリントブランチから分岐します(アジャイルではない人のために-スプリントは、複雑さに基づいた可変出力を備えたタイムボックス化された開発作業です)。スプリントブランチから機能ブランチを作成し、それらで並行開発を開始します。機能が完成し、システムがテストされ、それらを展開する意図を受け取ると、それらはスプリントブランチにマージされます-いくつかは、通常はより複雑なスプリントに浮かぶことがあります。スプリントが終わりに近づき、機能が完成したら...スプリントブランチを「リグレッション」に「名前変更」し(これにより、CruiseControlは再構成せずにそれを選択できます)、cc-builtで回帰/統合テストが開始されます耳。それがすべて完了すると、実稼働に入ります。
要するに、機能ベースのブランチは、開発、システムテスト、およびUAT機能に使用されます。スプリントブランチ(実際にはリリースブランチ)は、オンデマンド機能と統合テスト機能を選択的にマージするために使用されます。
コミュニティへの質問です。多くのブランチで開発が行われているという事実と、CruiseControlの再構成のオーバーヘッドのために、継続的な統合の実行に明らかに問題があります。誰かが提案やアドバイスをしてもらえますか?
Dave Farley 、 Continuous Delivery の著者、 Trunk Based Development(TBD) 継続的インテグレーション(CI)および継続的デリバリーの基礎として(CD)。彼は言います:
あらゆる形態の分岐は、継続的インテグレーションに相反するものです。
彼はまた言います、
機能分岐は、個々の開発者の観点からは非常に優れていますが、チームの観点からは最適ではありません。私たちは皆、他の誰もがしていることを無視して、私たちの仕事に取り掛かりたいと思っています。残念ながら、コードはそうではありません。美しい関心の分離と素晴らしく疎結合のコンポーネントを備えた非常によくファクタリングされたコードベースであっても、一部の変更はシステムの他の部分に影響します。
Trunk Based Development(TBD) は、少なくとも1日に1回、できれば1日に複数回、コードの変更をトランク(別名、マスター、メインライン)に統合する方法です。継続的インテグレーション(CI)は、自動化されたテストを使用してコードの変更を検証することを含むことを除いて、同様のプラクティスです。これに最適な分岐戦略は、トランクから直接作業し、 Pair-Programming を使用してコードレビューを実行することです。何らかの理由でペアリングできない場合、または単にブランチしたい場合は、ブランチが短命であることを確認してください(1日未満)。
私はGITリポジトリの「マスター」であるトランクに取り組んでいます。ローカルでマスターし、ネットワークに接続したらすぐにCIを実行する中央マスターリポジトリにプッシュします。それでおしまい!
大きな機能(1日以上かかる機能)の場合、それらをロジックの小さなチャンクに分割して、ソフトウェアを中断せずにトランクに統合できるようにしてください。 機能フラグ や 抽象化による分岐 などの手法を使用して、エンドユーザーに影響を与えずに不完全な作業を展開することもできます。
私は抽象化、ダークリリース、時には機能フラグによるブランチを使用しています。その見返りとして得られるのは、高速で確実な(少なくともテストの品質に関して)フィードバックです。
私が見ているように、あなたは集中できる限られたブランチのセットを持ちたいと思っています。テスト、コード品質メトリック、およびビルドで実行する多くの興味深いものが必要なため、レポートが多すぎると情報が失われる可能性があります。
いつ、何を分岐するかは、通常、チームの規模と開発中の機能の規模に依存します。黄金律はないと思います。フィードバックを早期/頻繁に取得できる戦略を使用していることを確認します。これには、機能の最初から品質に関わることも含まれます。品質のビットとは、チームの開発時に自動化するときに、チームが構築している大規模な機能セットに分岐する場合、チームにも品質を含める必要があることを意味します。
psこれらのアプローチの参照はどこで入手しましたか? -これらのグラフがすべてのオプションを表しているとは感じない
更新1:私がそれが黄金律ではないと言った理由を拡大する。基本的に、比較的小規模なチームでは、ミックスのアプローチを使用するのが最適であることがわかりました。機能ブランチが長くなり、チームの一部がより小さな機能を追加し続ける場合に作成されます。