web-dev-qa-db-ja.com

Mavenを使用して機能ブランチを継続的に構築およびデプロイするにはどうすればよいですか?

私のチームは、機能ブランチを使用して新しい機能を実装し、ユーザーが使用できるようにスナップショットビルドをリモートリポジトリに継続的にデプロイしています。したがって、「デプロイ」は実際には「リモートMavenリポジトリに配布する」ことを意味するだけです。現在、次の理由により、マスターブランチの継続的インテグレーションビルドのみを実行しており、機能ブランチは実行していません。Mavenを使用してプロジェクトをビルドし、JavaDocとソースをJARと一緒に配布しています。

私の計画は、各機能ブランチビルドに分類子を追加することであり、次のようなアーティファクトを作成および展開するときに使用されることを期待していました。

  • ブランチ:マスター
  • 分類子:なし
  • アーティファクト:foo-${version}。jar、foo-${version}-sources。jar、foo-${version}-javadoc.jar

  • ブランチ:feature-X

  • 分類子:myfeature
  • アーティファクト:foo-${version}-feature.jarfoo-${version}-sources-feature.jarfoo-${version}-javadoc-feature.jar

アーティファクトの正確な名前はあまり気にしません。機能ブランチに別々のメイン、ソース、およびJavaDocアーティファクトが必要です。結局のところ、JavaDocプラグインもソースプラグインも、構成された分類子を考慮していないため、マスタービルド用に作成されたアーティファクトを効果的に上書きします。

おそらく問題は解決するでしょうが、artifactIdを変更したくありません。機能ブランチとMavenとの継続的インテグレーションにどのようにアプローチしますか?

36
Oliver Drotbohm

バージョンコンポーネントとの関連性が高いため、バージョンコンポーネントにブランチ修飾子を追加することをお勧めします。これにより、メインブランチと並んでこれらのバージョンへのスナップショットの依存関係も可​​能になります。

9
eckes

ブランチを表す適切なバージョンと、次のようなバージョンを使用することをお勧めします。

1.0.0-マスターのスナップショット

そして

1.0.0-F1機能F1のスナップショット

等.

これにより、リリース1.0.0から機能ブランチが作成されたインジケータも提供されます。

9
khmarbaise

他の人が提案しているように、バージョン番号を使用してブランチ名を格納するのは簡単ですが、バージョン範囲を使用すると問題が発生します。バージョン番号は、そのように使用するためのものではありません。継続的インテグレーションプロセスでそれらを使用して、統合テストをテストされたアーティファクトに依存させます。

[1.8-SNAPSHOT,1.9-SNAPSHOT)

バージョン番号内の修飾子の部分は、同じコードベースの異なる増分ステージを示します。

1.8-alpha1-SNAPSHOT
1.8-alpha1-SNAPSHOT
1.8-beta1-SNAPSHOT

これが、上記のバージョン範囲が上記をキャプチャし、Mavenが この順序で並べ替える :である理由です。

1.8-SNAPSHOT
1.8-alpha1-SNAPSHOT
1.8-alpha1-SNAPSHOT
1.8-beta1-SNAPSHOT

バージョン番号に機能ブランチ名が含まれるアーティファクト(1.8-featureA-SNAPSHOT)修飾子のないスナップショットよりも新しく注文されます。ただし、機能ブランチは「異なる」コードベースであり、同じコードベースの新しい表現ではありません。私たちの統合テストシナリオでは、これは役に立たないテストの失敗につながりました。機能ブランチは、統合テストでテストする準備がまだできていませんでした。

現在、このルールに従います。とにかく何かを変更する必要がある場合は、アーティファクトIDを使用しないのはなぜですか。機能ブランチのアーティファクトIDを変更すると、正常に機能します。

6
Eduard Wirch

アーティファクトのMaven座標を変更する代わりに、 maven-branch-extension を使用して、機能ブランチごとに個別のSNAPSHOT名前空間を効果的に作成できます。プロジェクトページからの引用:

機能ブランチでバージョン番号を変更する代わりに、リポジトリを変更します。各機能は、機能ブランチ専用のリモートリポジトリ内のブランチ名に基づいて、サブディレクトリにデプロイされます。アーティファクトが上書きされるリスクはありません。バージョン番号は変更されません。 Gitとの分岐とマージは単純なままです(意図されていたように!)。

拡張機能は、現在のGitブランチを取得し、リポジトリのURLのプロパティを解決して、アーティファクトを正しく保存および取得できるようにします。また、アーティファクトのローカルリポジトリへのキャッシュとフェッチを管理し、アーティファクトが機能ブランチから作業するときに、アーティファクトが存在する場合は機能ブランチリポジトリから取得されるようにします。

これの利点は、SNAPSHOT依存関係の外部ユーザーが、トピックブランチの内部作業から完全に分離されていることです。

3
Bogdan Calmac