機能の準備ができたらいつでも運用環境に展開するWebアプリケーションがあります。1日に数回、時にはリリースの間に数週間かかることもあります。
現在、プロジェクトのバージョン番号を増やしていません。すべてがバージョン0.0.1-SNAPSHOT
1年以上。 Webアプリの継続的な配信を行うMavenの方法は何だろうと思っています。コミットごとにバージョン番号を上げるのはやり過ぎであり、現在行っているようにバージョン番号を決して上げないことも間違っているようです。
このタイプのMavenの使用に推奨されるベストプラクティスは何ですか?
問題は、実際には2つあります。
pom.xml
ファイル(および多くの場合があります)。Mavenで継続的配信を行う実際の現実を説明する次のプレゼンテーションをお勧めします。
重要なポイントは、各ビルドが潜在的なリリースであるため、スナップショットを使用しないことです。
これは、Mark O'Connorの回答によってリンクされたビデオに基づく私の要約です。
1.0-SNAPSHOT
などのスナップショットバージョンは、1.0.buildNumber
などの実際のバージョンに変換されます。ここで、buildNumber
はJenkinsジョブ番号です。アルゴリズムの手順:
1.0-SNAPSHOT
であると言います1.0.JENKINS-JOB-NUMBER
というgitブランチを作成するため、スナップショットバージョンは実際のバージョン1.0.124
に変換されます1.0-SNAPSHOT
から1.0.JENKINS-JOB-NUMBER
に変更しますmvn install
を呼び出しますmvn install
が成功した場合、Jenkinsはブランチ1.0.JENKINS-JOB-NUMBER
をコミットし、実際の非スナップショットバージョンが、後で再現するためにgitの適切なタグで作成されます。 mvn install
が失敗した場合、Jenkinsは新しく作成されたブランチを削除し、ビルドに失敗します。マークの答えからリンクされたビデオを強くお勧めします。
Maven 3.2.1以降、継続的な配信に適したバージョンがすぐにサポートされています: https://issues.Apache.org/jira/browse/MNG-5576 バージョンでは3つの定義済み変数を使用できます。
${changelist}
${revision}
${sha1}
基本的にあなたがすることは:
1.0.0-${revision}
。 (mvn versions:set
を使用すると、マルチモジュールプロジェクトですばやく正確に実行できます。)<revision>SNAPSHOT</revision>
を配置します。mvn clean install -Drevision=${BUILD_NUMBER}
またはこのようなもの、またはmvn clean verify -Drevision=${BUILD_NUMBER}
を実行します。たとえば、 https://wiki.jenkins-ci.org/display/JENKINS/Version+Number+Plugin を使用して、興味深いビルド番号を生成できます。
ビルドが安定していることが判明したら(たとえば、受け入れテストに合格)、バージョンをNexusまたは他のリポジトリにプッシュできます。不安定なビルドはゴミ箱に移動します。
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>
そして、ここに不足しているリンク:
これをしないでください!
<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の変更、または機能/動作の非推奨があることに留意してください。
継続的デリバリーの観点からは、すべてのビルドは潜在的にリリース可能であるため、すべてのチェックインでビルドを作成する必要があります。
出発点として Maven:The Complete Reference。Project Versions。 をご覧ください。
それから、良い バージョン管理戦略の投稿 があります。
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 )を作成しました。