web-dev-qa-db-ja.com

連続配信を行う際の自動プロジェクトバージョンのMavenの方法は何ですか?

機能の準備ができたらいつでも運用環境に展開するWebアプリケーションがあります。1日に数回、時にはリリースの間に数週間かかることもあります。

現在、プロジェクトのバージョン番号を増やしていません。すべてがバージョン0.0.1-SNAPSHOT 1年以上。 Webアプリの継続的な配信を行うMavenの方法は何だろうと思っています。コミットごとにバージョン番号を上げるのはやり過ぎであり、現在行っているようにバージョン番号を決して上げないことも間違っているようです。

このタイプのMavenの使用に推奨されるベストプラクティスは何ですか?

問題は、実際には2つあります。

  • 個々のプロジェクトのバージョン番号を進めるpom.xmlファイル(および多くの場合があります)。
  • 互いに最新のものを使用するために、すべての依存コンポーネントのバージョン番号を更新します。
46
ams

Mavenで継続的配信を行う実際の現実を説明する次のプレゼンテーションをお勧めします。

重要なポイントは、各ビルドが潜在的なリリースであるため、スナップショットを使用しないことです。

42
Mark O'Connor

これは、Mark O'Connorの回答によってリンクされたビデオに基づく私の要約です。

  • このソリューションには、gitのようなDVCSとJenkinsのようなCIサーバーが必要です。
  • Continuous Deliveryパイプラインでスナップショットビルドを使用せず、mavenリリースプラグインを使用しないでください。
  • 1.0-SNAPSHOTなどのスナップショットバージョンは、1.0.buildNumberなどの実際のバージョンに変換されます。ここで、buildNumberはJenkinsジョブ番号です。

アルゴリズムの手順:

  1. Jenkinsは、ソースコードを使用してgitリポジトリのクローンを作成し、ソースコードのバージョンが1.0-SNAPSHOTであると言います
  2. Jenkinsは1.0.JENKINS-JOB-NUMBERというgitブランチを作成するため、スナップショットバージョンは実際のバージョン1.0.124に変換されます
  3. Jenkinsはmavenバージョンプラグインを呼び出して、pom.xmlファイルのバージョン番号を1.0-SNAPSHOTから1.0.JENKINS-JOB-NUMBERに変更します
  4. ジェンキンスはmvn installを呼び出します
  5. mvn installが成功した場合、Jenkinsはブランチ1.0.JENKINS-JOB-NUMBERをコミットし、実際の非スナップショットバージョンが、後で再現するためにgitの適切なタグで作成されます。 mvn installが失敗した場合、Jenkinsは新しく作成されたブランチを削除し、ビルドに失敗します。

マークの答えからリンクされたビデオを強くお勧めします。

34
ams

Maven 3.2.1以降、継続的な配信に適したバージョンがすぐにサポートされています: https://issues.Apache.org/jira/browse/MNG-5576 バージョンでは3つの定義済み変数を使用できます。

${changelist}
${revision}
${sha1}

基本的にあなたがすることは:

  1. バージョンを設定します1.0.0-${revision}。 (mvn versions:setを使用すると、マルチモジュールプロジェクトですばやく正確に実行できます。)
  2. ローカル開発用のプロパティ<revision>SNAPSHOT</revision>を配置します。
  3. CI環境でmvn clean install -Drevision=${BUILD_NUMBER}またはこのようなもの、またはmvn clean verify -Drevision=${BUILD_NUMBER}を実行します。

たとえば、 https://wiki.jenkins-ci.org/display/JENKINS/Version+Number+Plugin を使用して、興味深いビルド番号を生成できます。

ビルドが安定していることが判明したら(たとえば、受け入れテストに合格)、バージョンをNexusまたは他のリポジトリにプッシュできます。不安定なビルドはゴミ箱に移動します。

16
Piotr Gwiazda

Mavenのバージョン番号と継続的配信(CD)の扱い方については、いくつかの素晴らしい議論と提案があります(回答の私の部分の後に追加します)。

だから最初にスナップショットのバージョンに関する私の意見。 Mavenでは、SNAPSHOTは、これがSNAPSHOTサフィックスの前の特定のバージョンに現在開発中であることを示しています。このため、Nexusやmaven-release-pluginなどのツールには、SNAPSHOTSに対する特別な扱いがあります。 Nexusの場合、それらは別のリポジトリに保存され、同じSNAPSHOTリリースバージョンで複数のアーティファクトを更新できます。そのため、スナップショットは、知らないうちに変更される可能性があります(pomの数値は決してインクリメントしないため)。このため、ビルドの信頼性がなくなったため、特にCDの世界でプロジェクトでSNAPSHOT依存関係を使用することはお勧めしません。

上記の理由により、プロジェクトを他のプロジェクトで使用する場合、プロジェクトバージョンとしてのSNAPSHOTは問題になります。

SNAPSHOTのもう1つの問題は、実際には追跡可能でもなく、再現性がないことです。実稼働中にバージョン0.0.1-SNAPSHOTが表示された場合、ビルドがどのリビジョンからビルドされたのかを検索する必要があります。ファイルシステムでこのソフトウェアのリリースを見つけたら、pom.propertiesまたはMANIFESTファイルを見て、これが古いゴミであるか、最新バージョンであるかどうかを確認する必要があります。

バージョン番号の手動変更を回避するため(特に1日に複数のビルドをビルドする場合)、ビルドサーバーに番号を変更させます。だから開発のために私は行くだろう

<major>.<minor>-SNAPSHOT

バージョンですが、新しいリリースをビルドするとき、ビルドサーバーはSNAPSHOTをよりユニークで追跡可能なものに置き換えることができます。

たとえば、次のいずれかです。

<major>.<minor>-b<buildNumber>
<major>.<minor>-r<scmNumber>

したがって、メジャー番号とマイナー番号は、マーケティングの問題に使用したり、新しい素晴らしいマイルストーンに到達したことを示したり、必要に応じて手動で変更したりできます。また、buildNumber(Continuous Integrationサーバーの番号)またはscmNumber(SubversionまたはGITのリビジョン)により、各リリースが一意で追跡可能になります。 buildNumberまたはSubversionリビジョンを使用する場合、プロジェクトバージョンはソート可能です(GIT番号ではありません)。 buildNumberまたはscmNumberを使用すると、このリリースの変更点を簡単に確認できます。

他の例は、stackoverflowのバージョン管理です。

<year>.<month>.<day>.<buildNumber>

そして、ここに不足しているリンク:

9
mszalbach

これをしないでください!

<Major>.<minor>-<build>

mavenはハイフンの後をLEXICALとして扱うため、バックサイドで噛みつきます。これは、バージョン1が字句的に10より高いことを意味します。

これは、mavenの最新バージョンを要求している場合と同様に、上記のポイントが優先されます。

解決策は、ビルド番号の前にハイフンではなく小数点を使用することです。

これをしてください!

<Major>.<minor>.<build>

SNAPSHOTバージョンをローカルに持つことはできますが、ビルドの一部として使用することをお勧めします

mvn versions:set -DnewVersion=${major}.${minor}.${build.number}

Pomからメジャー/マイナーバージョンを取得する方法があります。たとえば、help:evaluateを使用して、versions:setを呼び出す前に環境変数にパイプします。これは汚れていますが、もっと簡単にするために頭(そしてチームの他の人)をひっかいて、(当時)Mavenはこれを処理するのに十分なほど成熟していませんでした。 Maven 2.3.1にはこれを支援する何らかの方法があるかもしれないと思うので、この情報はもはや関係ないかもしれません。

多数の開発者が同じmajor.minorバージョンでリリースすることは問題ありませんが、マイナーな変更は継続的であり、メジャーバージョンの変更にはいくつかの重大なAPIの変更、または機能/動作の非推奨があることに留意してください。

継続的デリバリーの観点からは、すべてのビルドは潜在的にリリース可能であるため、すべてのチェックインでビルドを作成する必要があります。

6
user924272

出発点として Maven:The Complete Reference。Project Versions。 をご覧ください。

それから、良い バージョン管理戦略の投稿 があります。

2
dmitri

Webアプリの仕事では、現在このバージョン管理パターンを使用しています。

<jenkins build num>-<git-short-hash>

例:247-262e37b9。

常にユニークで、それを生成したjenkinsビルドとgitリビジョンまでさかのぼることのできるバージョンを提供するため、これは素晴らしいことです。

Maven 3.2.1以降では、$ {property}をバージョンとして使用するための警告を最終的に削除したため、これらを簡単に構築できます。すべてのPOMを変更して、<version>${revision}</version>および-Drevision=whatever。唯一の問題は、リリースされたPOMでバージョンが${revision}実際のpomファイルでは、あらゆる種類の奇妙な問題が発生する可能性があります。これを解決するために、ファイル内の変数置換を行う単純なMavenプラグイン( https://github.com/jeffskj/cd-versions-maven-plugin )を作成しました。

1
Jeff S