web-dev-qa-db-ja.com

gitブランチからMavenアーティファクトバージョンを取得する

基本的に、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プラグインから他の目標を使用するか、追加のパラメーターを指定することにより、特定のケースをサポートするためにわずかに変更される場合があります。

長所:

  • 丈夫
  • この作業を行うためにpom.xmlファイル自体を変更する必要はありません
  • この「機能」は、フックを非アクティブ化するだけでオフにできます(削除または実行不可にする)-再び、pom.xmlでの変更は不要です。

短所:

  • 他の人にフックの使用を強制することはできません-リポジトリのクローン作成後に手動でインストールする必要があります(または、Gitユーザーが.gitディレクトリ内のものに触れることを恐れている場合、フックをインストールするスクリプトを提供できます)。

[〜#〜] 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'
44
Timur

この質問を復活させて非常に最近別の解決策を投稿して申し訳ありませんが、git describeのようにmavenバージョンを動的に変更し、いくつかのgit機能を使用することは確かに可能です。

これを行うプロジェクトは、 jgitver-maven-plugin(免責事項;私は著者です)、使用します jgitver jgitベースのライブラリgit情報からmavenプロジェクトバージョンを取得します。

enter image description here

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には問題はありません。


12

免責事項:私は著者です

私のmavenコア拡張機能は、現在のブランチまたはタグに基づいて仮想的にバージョンを設定します。必要に応じて、カスタムバージョンのフォーマットパターンを設定できます。

https://github.com/qoomon/maven-branch-versioning-extension

バージョン形式の例enter image description here

10
qoomon

アーティファクトファイル名に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
2
Chronial

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
1
Ed Randall

buildnumber-maven-plugin を確認しました。これにより、gitのリビジョン番号を使用する機会が与えられます。しかし、別の何かが必要でした。さらに、次のようなことを行うことをお勧めします。

   1.0.0-SNAPSHOT 
   1.0.0-SNAPSHOT 

マスターにビーイング

ブランチでは、バージョンを簡単に変更できます

  1.0.0-BF-SNAPSHOT 
1
khmarbaise