私はかなり大きなアジャイルチームのソフトウェア開発者です(8人の開発者が1つのコードリポジトリに積極的に変更を加えています)。 2週間ごとに、新しいバージョンのソフトウェアを製品版にプッシュします。現在のワークフローは次のとおりです。
テスト担当者がQAブランチにマージされたこれらの新機能の問題を見つけることは非常に一般的です。これは、常に、QA環境にいくつかの新機能が含まれている可能性があることを意味します。 QAビルドが本稼働可能な状態であることはまれであるため、リリースが困難になります。
これを緩和するために、私たちは「QAフリーズ」を開始しようとしました。これは、開発者がリリースの数日前に開発ブランチをQAブランチにマージしないことを意味します。 QA環境のバグ修正は、QAブランチで直接行われ、開発ブランチにマージされます。理論的には、これにより、QAで問題のある新しい問題を修正しながら、QAから新しい機能の破損を防ぐことができます。
この「QAフリーズ」の概念は部分的に成功していますが、調整が難しく、QAへのマージが許可されているかどうかについて混乱することがよくあります。 「QAフリーズ」の期限を設定することも困難です。誰もが、フリーズとリリースの間に少し余裕があるというアイデアを気に入っていますが、実際には、期限を尊重するよりも、次のリリースに機能を持たせたいと考えています。
隔週でリリースのクリーンビルドを確保するためのより良い方法はありますか?
これには、発生している問題の原因となっているいくつかの問題があります。
1つ目は、長期にわたるQAブランチです。 QAブランチとメインラインの両方でレプリケートする必要のあるさまざまな作業があるため、開発メインラインと並行している長期実行ブランチがあると混乱の原因となる可能性があります。これは、メインラインにマージする必要があるQAブランチの修正をチェックインしている(悪いことではない)、またはQAブランチにマージされているメインラインにチェックインしている(バグの可能性のあるソース) 。
長時間実行される並列ブランチのもう1つの問題は、ファイルが永続的に同期されなくなる可能性があることです。マージされないコード修正、またはテストされておらず開発メインラインの一部である本番ビルドに必要な構成。
次に、影響を受ける役割があります。これは、パッケージの役割(これについては後で詳しく説明します)が十分に分離されていないことを意味します。
git-flow モデルでは、リリースブランチは開発から分岐され(not開発はQAにマージされます)、すべての修正はリリースブランチにチェックインしてから、開発ブランチにマージして戻しました。
分岐の哲学の一部は Advanced SCM Branching Strategies にあります(私は優れた読み物と考えています)。これは、各ブランチが担う可能性のある役割に焦点を当てています。リリースブランチがパッキングの役割を果たします。
パッケージングの役割は、蓄積、またはより一般的にはメインラインの役割と混同されることがよくあります。意図された開発とメンテナンスが行われ、蓄積が完了したら、リリースのためにコードを準備します。このような作業は簡単ではなく、リリースエンジニアのチームと、すでに実行されたもの以外の追加の修正が必要です。パッケージングロールのポリシーは、メンテナンスブランチのポリシーとは大きく異なります。パッケージングの役割が示唆するように、製品をリリース可能にするために必要な変更のみに対処する必要があります。
Git-flow全体を適切に適用することを真剣に検討する必要があります。これは、現在行われていることからそれほど遠くはなく、各ブランチの意味と各ブランチが他のブランチとどのように相互作用するかにある程度の規律と一貫性をもたらします。
問題は、QAブランチが1つしかないことです。
リリースごとに、プライマリ開発トランク/マスターからseparate QAブランチを作成します。次にマージしますのみそのブランチの機能のバグの修正-新しい機能はありません。そのブランチをQAテストします。
このように、「フリーズ」はブランチ名に含まれているので非常に明白です。わからない、release/26/10/2015
などを使用できます。その後、誰もこの後の新機能にマージするべきではないことは明らかです。
フリーズするまでブランチをフォークしない場合に特に便利です。人々はいつでもマスターにマージすることができます。テストするために間に合わなければ、このリリースには含まれません。
単一の長期実行QAブランチを作成しないでください。問題が発生するだけです。各リリースのメイン開発ブランチからのフォークとそのブランチのQA。
以下に示すDevelopment-MAIN-Production分岐モデルに多少マッピングされます。 MAINの上のエリアは開発エリアと言われています。 MAINの下の領域は、生産領域です。
私があなたに関連すると私が考えるこのモデルのハイライト:
私はあなたが問題を抱えていると思います:
質問を理解すると、2つの問題があります。 (a)壊れた機能は、リリースしたい優れた機能と統合されています。 (b)壊れた機能を抑えながら、優れた機能をリリースできるようにしたい。考えられるソリューションの制約として、次のリリースで予定されているすべての機能を含む統合ブランチで最終的な/公式のQAテストを実行することを想定しています。
SCM分岐モデルに関係なく、次のいずれかまたは両方を試すことをお勧めします。
これらの問題が発生する理由は、QAにリリースされたコードの品質が十分ではないため(そして誰かがそうですか?!)、QAのリリースを改善する必要があるため、頻繁にビッグフィックスを受け取る必要がありません。これを行う最も簡単な方法は、リリースする中間ブランチを導入することです(テストを呼び出します)。これはまだ開発権限の下にありますが、開発者はそれをプッシュして作業を続けることができ、QAに送信するのに十分な品質の統合ブランチも持つことができます。
QAが現在検出しているバグを見つけるために、統合テストをこのブランチで行うことができます。バグは元のブランチで修正してから再度マージできます。また、このブランチで直接修正するか、バグを直接修正できるようになるまで繰り返します(私は、前者)。一連の基本的なテストに合格したら、「ユーザーの指を動かして、彼らは何をしましたか?」についてQAに送信できます。テスト。
したがって、このアプローチは、QAブランチを開発機能の破損から保護するように設計されています。これは、機能が十分にコーディングされていなかったためか、予期しない統合問題があったかどうかは問題ではありません。統合テストに合格した開発ブランチのみがQAに昇格されます。
私があなたのチームより少し大きいチームで作業するのを見た非常に単純な解決策の1つは、すべての人が単一のブランチから作業して展開することです。
チームは俊敏であると言いますが、スプリント(つまり、スクラム)で作業しているか、より継続的なフロー(つまり、かんばん)で作業しているかは明確ではありません。あなたがスプリントをしていると仮定すると、チームの目的は、隔週のリリースのために、各スプリントの終わりにコードをリリース可能にすることです。それらがすべて一緒に開発されたため、ある機能が別の機能を壊すかどうかについて混乱はありません。テスターは、開発者がそれらに提供するオーバーヘッドが少ないため、小さなチャンクで機能にアクセスできる場合があります。また、QAフリーズは実際には必要ありません。代わりに、スプリントの終わりがいつ終わり、展開できない(つまり無効な)状態のままにできないか、誰も仕事を始めるべきではないことを誰もが知っています。
明らかに、どのアプローチにも賛否両論がありますが、これは必ずしも「最良の方法」ではないオプションとして提示します。