基本的に、gitの現在のブランチから外部的に定義されたモジュールのアーティファクトバージョンが必要であることを意味するワークフロー要件があります。
つまりgitのmasterブランチにいる場合、<version>master-...</version>
そしてbugfixXブランチにいる場合、<version>bugfixX-....</version>
このpom.xmlの生成されたアーティファクト。
私は以前に https://github.com/koraktor/mavanagaiata がプロパティとしてSHA-1ハッシュを提供できることを発見しましたが、ドキュメントからはブランチも提供できるようです。プロパティを設定し、<version>${our.version}</version>
ポンポンで。これが可能であれば、pom.xmlの動作を確認したいと思います(また、500ポイントの報奨金に報いる)。
そうでない場合、プリプロセスまたは「git checkout」のいずれかがフックの一部で追加のマジックを実行していると思います(まだ試していませんが、動作するコードも素晴らしいでしょう)。
最上位レベルのPOMがあり、この機能を実行する必要があるモジュールをビルドする前に、実行して ".."にプロパティファイルを生成できます。
これを解決する方法に関する提案はありますか?
確かに、Mavenは、他の目標を持つ1つの実行で自身のプロジェクトのバージョンを変更することはできません。その上、私が知る限り、Mavenは<version>
タグ内の任意のプロパティをサポートしていません。したがって、POMのバージョンを変更する目標を実行するには、個別の実行が必要です。それを行うことができるさまざまなプラグインがあります-この場合、versions
プラグインからのversions:set
ゴールを使用できます- http://mojo.codehaus.org/versions-maven-plugin/ set-mojo.html
したがって、たとえば次のように実行できます。
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$branch-SNAPSHOT
$branch
変数には、現在のGitブランチ名が含まれている必要があります。次のように、git rev-parse
で抽出できます。
branch=$(git rev-parse --abbrev-ref HEAD)
しかし、それでも何らかの方法で実行する必要があります。手動で行うこともできますが、面倒です。したがって、私の推測では、実際に最も堅牢なソリューションはGit側からこれにアプローチすることです。つまり-Gitフック。ジョブを実行する完全なGit post-checkout
フックを次に示します(個々のファイルのみではなく、ブランチがチェックアウトされたときにのみフックを実行するフィルタリングを備えた上記と同じコード):
#!/bin/bash
echo 'Will change the version in pom.xml files...'
# check if the checkout was to checkout a branch
if [ $3 != '1' ]
then echo 'git checkout did not checkout a branch - quitting';exit
fi
# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)
version=$branch-SNAPSHOT
# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Changed version in pom.xml files to $version'
このコンテンツをファイルPROJECTDIR\.git\hooks\post-checkout
ファイルに配置します。フックファイルは、実行するために実行可能である必要があることに注意してください(chmod +x post-checkout
)。
versions
プラグインに関する注意事項はほとんどありません。非常に柔軟で、多くのオプションをサポートしており、プロジェクト構造に応じて役立つその他の目標はほとんどありません(親pomを使用するかどうか、子に独自のバージョンがあるか、それらは親などから派生していますか)。したがって、上記のフックは、versions
プラグインから他の目標を使用するか、追加のパラメーターを指定することにより、特定のケースをサポートするためにわずかに変更される場合があります。
長所:
短所:
[〜#〜] update [〜#〜]
以下は、より複雑なバージョンのフックです。バージョンをブランチ名に設定するだけでなく、古いバージョンのサフィックスも保持します。たとえば、古いバージョンmaster-1.0-SNAPSHOT
を提供すると、feature1
ブランチに切り替えると、プロジェクトのバージョンがfeature1-1.0-SNAPSHOT
に変更されます。このbashスクリプトにはいくつかの問題があります(名前にダッシュ記号(-
)のないブランチ名が必要であり、ルートpomのバージョンのみを使用します)が、フックがどのように拡張されるかについてのアイデアを与える可能性があります: mvnコマンドとbashコマンドを組み合わせて使用すると、POMの非常に多くの情報を抽出および更新できます。
#!/bin/bash
echo 'Will change the version in pom.xml files...'
# check if the checkout was to checkout a branch
if [ $3 != '1' ]
then echo 'git checkout did not checkout a branch - quitting';exit
fi
# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)
# get current version of the top level pom
current_version=$(mvn help:evaluate -Dexpression=project.version | grep -v '\[.*')
# extract version suffix
suffix=$(echo $current_version | cut -d \- -f 2)
# build new version
version=$branch-$suffix
# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Changed version in pom.xml files to $version'
この質問を復活させて非常に最近別の解決策を投稿して申し訳ありませんが、git describe
のようにmavenバージョンを動的に変更し、いくつかのgit機能を使用することは確かに可能です。
これを行うプロジェクトは、 jgitver-maven-plugin(免責事項;私は著者です)、使用します jgitver jgitベースのライブラリgit情報からmavenプロジェクトバージョンを取得します。
Maven拡張機能として非常に使いやすい
...
<build>
<extensions>
<extension>
<groupId>fr.brouillard.oss</groupId>
<artifactId>jgitver-maven-plugin</artifactId>
<version>0.1.0</version>
</extension>
</extensions>
...
</build>
...
拡張機能はプラグイン拡張機能として使用することもできます。これにより、たとえばSNAPSHOTSを使用したくない場合に備えて、より多くの構成が可能になります。完全な使用シナリオの説明については、 project ページを参照してください。
また、多かれ少なかれ同じことを行う gradle plugin が利用可能です。
[edit 1]:ThorbjørnRavn Andersenコメントへの回答
プラグインは、元のpomファイルまたはbuild.gradleファイルを変更しません。
mavenプラグインの場合、変更は、mavenオブジェクトモデルのメモリ内で行われ、tempディレクトリの一時ファイルに書き込まれます。計算はgitメタデータ(タグ、コミットなど)のみに基づいています。
この非変更により、git履歴を汚染しないようにすることができます。 git commitに満足したら、それにgit tag -a x.y.z
およびmvn deploy
のタグを付けます:それだけです。
プロジェクトファイルのバージョンは役に立たなくなり、たとえば0に設定できます。
現在、および IDEA-1557 により、IntelliJの最近のEAPバージョンのみがmavenプラグインで動作します。 EclipseとNetbeansには問題はありません。
免責事項:私は著者です
私のmavenコア拡張機能は、現在のブランチまたはタグに基づいて仮想的にバージョンを設定します。必要に応じて、カスタムバージョンのフォーマットパターンを設定できます。
アーティファクトファイル名にgitタグとバージョン情報を設定するだけで十分な場合は、 maven-jgit-buildnumber-plugin を使用できます。
<build>
<finalName>${artifactId}-${git.buildnumber}</finalName>
<plugins>
<plugin>
<groupId>ru.concerteza.buildnumber</groupId>
<artifactId>maven-jgit-buildnumber-plugin</artifactId>
<version>1.2.7</version>
<executions>
<execution>
<id>git-buildnumber</id>
<goals>
<goal>extract-buildnumber</goal>
</goals>
<phase>prepare-package</phase>
</execution>
</executions>
</plugin>
<!-- more plugins -->
</plugins>
</build>
このプラグインを使用してみましたか?: https://github.com/ktoso/maven-git-commit-id-plugin レポジトリ状態に関するすべての関連情報を含むプロパティファイルを生成するように構成できます。
- ブランチ
- 記述する
- commitId
- buildUserName
- buildUserEmail
- buildTime
- commitUserName
- commitUserEmail
- commitMessageShort
- commitMessageFull
- commitTime
maven-3.5.0から内の$ {revision}、$ {sha1}および$ {changelist}プロパティのサポートがありますversionタグ。たとえば、CIビルドジョブのバージョンにGitブランチ名を組み込みたい場合、この機能で十分です。 Maven CIフレンドリーバージョン を参照してください
基本的に、pom.xmlで修正バージョンを次のように置き換えます。
<version>${revision}${changelist}</version>
次を含むファイル.mvn/maven.config
を作成して、プロジェクトルートディレクトリのrevisionおよびchangelistのデフォルト値を設定します。
-Drevision=1.2.3
-Dchangelist=-SNAPSHOT
このファイルをバージョン管理にチェックインし、プロジェクトのリビジョンをバンプしたときに更新します。
CIシステムでは、Gitブランチ名のクリーンアップされた表現を使用してchangelist変数をオーバーライドできます。
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD | sed -E -e 's@[^0-9A-Za-z.-]+@-@g')
mvn clean install -Dchangelist="-${BRANCHNAME}"
(ブランチ名、YMMVを取得するためにgit symbolic-ref --short HEAD
を好むかもしれません)
ブランチfeature/branchname
用にCIシステムによって構築されたアーティファクトには、次のようなバージョン付きブランチサフィックスが付きます。
yourproject-1.2.3-feature-branchname.jar
オーバーライドを使用しない開発者は、次のようにビルドします:
yourproject-1.2.3-SNAPSHOT.jar
buildnumber-maven-plugin を確認しました。これにより、gitのリビジョン番号を使用する機会が与えられます。しかし、別の何かが必要でした。さらに、次のようなことを行うことをお勧めします。
1.0.0-SNAPSHOT
1.0.0-SNAPSHOT
マスターにビーイング
ブランチでは、バージョンを簡単に変更できます
1.0.0-BF-SNAPSHOT