大きくなるにつれて問題が発生し始めています。機能はテスト用にステージングされますが、すべてがテストされ、承認された新しい機能がテスト用にステージングされています。
これにより、テスト済みの機能とテストされていない機能の組み合わせがあるため、本番環境にほとんどプッシュできない環境が作成されています。これはよくある問題だと思いますが、私たちに役立つリソースはまだ見つかっていません。
いくつかの詳細:
私が望んでいるのは、機能が環境を移動するときに機能を分離し、準備ができているものだけをプッシュする方法です。
ここにいくつかの問題があるようです:
これはプロジェクト管理の問題であり、調整の問題です。 this 機能は、この other 機能の前、同時、または後にリリースされますか?リリースが一度に1つの機能で発生したい場合は、それを特定します。機能がリリースにグループ化される場合は、グループが何であるかを理解し、開発者and意思決定者にそれを適用します。問題追跡システムまたは発券システムを使用して、リリースにタグを付けます。特定のリリースの1つの機能が不合格である場合、それらすべてが不合格であることを明確にしてください。
Git-flow は、このような問題に対する簡単な答えであり、多くの場合、それが何であるかを知らなくても、git-flowのバリアントを使用します。すべての問題を網羅するものだとは言いませんが、それは非常に役立ちます。
非確定的なリリース戦略で問題が発生しているようです。機能は承認済みのスキャッターショットであり、開発がかなり前に開始されたものは、最近開始されたもの-リープフロッグ機能の後にリリースされる可能性があります。
存続期間の長い機能ブランチまたは同時リリースブランチは、おそらくこの種の問題に対する最良の答えです。最新のfrom masterを長期実行ブランチにマージします(必要に応じてリベースします)。 only Merge in features are already lived、さもないと、今まで抱えていた問題にぶつかります(1つのブランチに多すぎる機能が混在しています)。
「ホットフィックス」または「バグフィックス」ブランチは、このプロセスの重要な部分です。 QAサイクルが短い小さな1回限りの修正に使用します。
あなたの説明から、公式の「開発」ブランチをnot維持するほうがよいかもしれません。むしろ、マスターからすべての機能を分岐し、リリースが識別されたらマージされたリリースブランチを作成します。
本番==マスターを除いて、gitブランチを環境に一致させないでください。 「開発」ブランチは壊れていると想定する必要があります。リリースブランチは、QA環境でもステージング環境でも、テスト環境にプッシュされます。必要に応じて、特定の機能ブランチを環境にプッシュします。
個別にリリースする必要があるが、同時にテストされている機能ブランチが複数ある場合.....¯\ _(ツ)_ /¯....別のサーバーを起動しますか?おそらく、それらをスローアウェイブランチにマージしてください...修正/変更を元のブランチにコミットし、スローアウェイブランチに再度マージします。個々のリリースブランチで最終承認とUATを行います。
これは上記の考えが避けようとしていることです。これは間違いなく試行錯誤するのに最も苦痛なことだからです。運が良ければ、マージコミットを使用して、機能が開発ブランチまたはテストブランチにアトミックにマージされています。運が悪い場合、開発者は開発/テストブランチに直接コミットしています。
どちらの方法でも、リリースの準備をしていて、承認されていない変更がある場合は、Gitを使用して back out リリースブランチからの承認されていないコミットを実行する必要があります。最良のアイデアは、リリースをテストする前にすることです。
幸運を祈ります。
リリースブランチの使用を停止します。代わりに、 feature toggles でビルドを開始し、構成を介して管理します。こうすることで、機能ブランチを常にマスターにマージすることができ、どのバージョンがテスト版または製品版であるかについての質問はありません。環境でアクティブになっている機能/実装について質問がある場合は、構成ファイルを確認してください。
これは、テストと本番の間の調整の単純な問題でなければなりません。 Gitで機能ブランチを使用している場合は、テストサイクル中に完了した機能ブランチのTestへのプッシュを停止し、テストが完了したら再開します。
これよりも優れた制御が必要な場合は、テストを開発サーバーと受け入れテストサーバーに分離し、受け入れチームに受け入れられるブランチをテストチームと調整します。その後、誰かが受け入れテストから本番環境への最終的な展開を開始する責任があります。
これは私の経験では普遍的な問題です。私はそれに対処します:
そのプロセスを制御するには、いくつかのブランチが必要です。
1234-user-crud
、1235-bug-delete-catalog
など。タスク番号でコミットを特定します。これは、マージで問題が発生したときに役立ちます(そうするでしょう)。release
ブランチにも当てはまります。Gitフローを参照してください。
|FEAT_2|
|
.---C06<-------.---------.
/ \ \
/ |FEAT_1| \ \
/ | \ \
/ .--C07<--.--------\---------\---------.
/ / \ \ |TEST| \ \
/ / \ \ | \ \
/ / .-----`--C09<--`--C10 \ \ |RELEASE|
/ / / \ \ |
<v4.6.0> / / / .----`--C11<---`--C12<--.
| / / / / \
C01<--C02<--C04<--´----´--------´-----------------------´---------------------------`--C13
| | |
<v4.5.0> <v4.6.1> |MASTER|
|
<v4.7.0>
非常にシンプル:
開発者は自分のマシンで作業し、それぞれが自分のデータベースを使用します。 (ライセンス、データベースのサイズなどが原因で)各開発者が個別のデータベースを使用できない場合、開発者間でデータベースを共有する際に多くの問題が発生します。誰かがブランチの列またはテーブルを削除すると、他の人がブランチは依然としてデータベース内のこの列/テーブルでカウントされます。
このプロセスの最大の問題はマージです。
test
とrelease
で同じマージを作り直す必要があります。これは、クラスの削除、メソッドの移動/名前の変更など、コードに適切なリファクタリングが行われている場合は苦痛です。できないtest
(またはrelease
)機能ブランチに分岐し、マージコミットはtest
(またはrelease
)でのみ解決できます。したがって、2つの異なるブランチで同じ競合を解決し、おそらくマージごとに異なるコードを生成することになります。将来的に、テストチームが機能を2回テストする必要があることがわかります:test
release
ブランチ。マージごとに異なるバグが発生する可能性があるためです。
もう1つの問題はtest
ブランチです。時々このブランチを「リサイクル」(master
から削除して新しいブランチを作成)する必要があります。古いブランチ(または古いマージ、削除されたマージされたブランチ)は、新しいコードの問題、master
の内容とは大きく異なる。このとき、test
で再びマージするブランチを制御する必要があります。
本当に最善の解決策は、ビジネスチームが次のバージョンで何を提供する必要があるかを理解し、全員が独自のブランチ(開発ブランチ)で作業することです。彼らにとっては、いつでも次のバージョンに含めたい「完了した」機能を選択できる可能性があります(これはあなたのシナリオだと思います)が、これは開発者にとっては悪夢であり、テストチーム。
あなたのように聞こえますmerging統合ブランチから本番ブランチへの変更です。あなたが言及した理由から、IMHOは良い習慣ではありません。特定のリリースの本番ブランチがメインの統合ブランチからプルされるとすぐに、統合ブランチはいつでも分岐できます(すべてが次のリリースに進化するはずですが)。統合ブランチから現在のリリースブランチにマージすると、そのリリースと互換性のない変更が発生する可能性があります。
私見適切なプロセスは次のとおりです。
個人的には、これはツールの問題ではなく、プロセスの問題である可能性があるようです。ここで私が提案するいくつかのこと:
正直なところ、最大のことは、いつ配信するか、特定の時間内に実際に完全に完了することができるタスクの数についての規律だと思います。
まとめると、古い機能のテストと配信が完了したときにのみ、QAに配信します。