Git Flowは長い間存在しており、多くの人がお気に入りのgitワークフローとしてGitFlowを採用しているようです。
Java/Maven設定でGitフローを実装することになると、以下のすべてのブランチにあるソフトウェアモジュールのバージョン管理にどのように取り組むべきか疑問に思いました。
単純なMavenの世界では、
開発ブランチとマスターブランチだけがあれば問題ありませんが、GitFlowでMavenバージョン管理をどのように処理しますか。
マスターのバージョンは、最終的にリリースブランチから作成およびリリースされるバージョンになるため、定義は非常に簡単です。
しかし、コードがリリースブランチに移動するとすぐに、ここでどのバージョン管理戦略を展開しますか?
このアプリケーションでは、maven-release-plugin
を使用してpomファイルのバージョンを更新していました。 Jenkinsのようなツールを使用している場合、ジョブを構成するたびに、ダウンストリームジョブをトリガーするためのプロビジョニングもあります。したがって、この場合、次の設定があります。
release
からmaster
へのプルリクエストが行われ、ビルドはリリース時に実行され、成功するとマージが可能になります。develop
ブランチの同じスナップショットバージョンも更新されました。したがって、私たちの場合、リリースが2つのバージョン更新を経るたびに、1つはリリースバージョンがカットされたとき、もう1つはリリース後にマスターと開発にマージするときにスナップショットバージョンがカットされたときです。したがって、マスターとリリース後に開発する場合、最終バージョンは常にスナップショットバージョンになります。一部のチームでは、開発時にスナップショットバージョンのみを更新し、リリースバージョンをマスターに直接プッシュすることを確認しました(つまり、スナップショットにバージョンを変更せずに、master
からrelease
にマージします。ダウンストリームジョブは、develop
にマージするときにバージョンをスナップショットに変更します)。
あなたの質問について:リリースブランチでは、リリースが本番環境に入る前に複数のコミットが存在する可能性もあると思います。スナップショット以外のバージョンを再利用することはできないため、コミットごとにここで固定バージョンをインクリメントしますか、それともファイナライズしてマスターにプッシュする前に、リリーススナップショットバージョンでも機能しますか?
理想的なケースでは、リリースブランチは直接コミットしません。そのため、開発を経て開発を行う必要があります。そのため、開発からリリースにマージするたびに、プロセスとしてセットアップされるため、バージョンをインクリメントする必要があります。また、バグ修正と機能をそれぞれずつインクリメントすると、バグ修正と機能を追跡しやすくなります。リリース。
ソース管理(Gitが管理)と建物(Mavenが管理)の領域を分離しておくことが重要だと思います。つまり、バージョン管理とブランチの管理は、_pom.xml
_ファイルの外部で行う必要があります。それでもいくつかのMavenプラグインを使用して実現できますが、このプラグインはビルドプロセスの一部ではなく、このプロセスの外部のツールである必要があります。
そうは言っても、Mavenバージョンの この説明 を見てください。リリースブランチが作成されると、バージョン_X.Y.Z
_がこのリリース用に「予約」されます(そしてdevelop
ブランチはアトミックに増分スナップショットバージョンX.Y.(Z+1)-SNAPSHOT
またはX.(Y+1).Z-SNAPSHOT
など、次のリリースの種類によって異なります)。その間、リリースブランチはしばらくの間存在し、競合を回避するためにビルド間でアーティファクトのバージョンを変更する必要がある場合があります。これは、ビルド番号または修飾子とビルド番号を一緒に使用することで実行できます。たとえば、_X.Y.Z-alpha-0
_から開始して、_X.Y.Z-beta-0
_以降に変更するまで続行できます。 「プレリリース」アーティファクトをリポジトリにデプロイする必要があるたびに、ビルド番号をインクリメントします。最終的に、リリースが行われると、バージョン_X.Y.Z
_は、ビルド番号と修飾子を持つすべてのバージョンよりもMavenによって「大きい」と見なされます。