任意のバージョン番号でリリース成果物を生成できるようにする必要がある Jenkins/maven ビルドがあります。バージョン番号は、パラメーターとしてビルド ジョブに渡されます。versions:set
バージョンを pom.xml にあるものから $VERSION パラメータに更新するために使用しています。ビルドが実行されると、実際には maven が pom.xml の作業コピーのバージョンを更新しているように見えますが、古いバージョン番号でアーティファクトをビルドします。
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<name>someservice</name>
<groupId>com.domain.group</groupId>
<artifactId>someservice</artifactId>
<version>1.0.0-SNAPSHOT</version>
Jenkins ジョブで最上位の Maven ターゲットを呼び出します。
-V
-B
-e
-U
clean
versions:set
-DnewVersion=${VERSION}
package
deploy
-Dmaven.test.skip=true
私のビルド出力は次のようになります ($VERSION が 0.1.2 の場合)
[INFO] ------------------------------------------------------------------------
[INFO] Building someservice 1.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- versions-maven-plugin:2.2:set (default-cli) @ someservice ---
[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: /svn/group/someservice/trunk
[INFO] Processing change of com.domain.group:someservice:1.0.0-SNAPSHOT -> 0.1.2
[INFO] Processing com.domain.group:someservice
[INFO] Updating project com.domain.group:someservice
[INFO] from version 1.0.0-SNAPSHOT to 0.1.2
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.147s
[INFO] Finished at: Wed May 20 11:40:46 PDT 2015
[INFO] Final Memory: 10M/180M
[INFO] ------------------------------------------------------------------------
最初の実行は古いバージョンでビルドされますが、作業ディレクトリが元に戻されていない場合、その後の実行は更新された pom.xml の新しいバージョンで正しくビルドされることに気付きました。成果物がビルドされる前に、pom ファイルを新しいバージョンで更新するにはどうすればよいですか?
制約:
- pom.xml に変更を加えることは可能かもしれませんが、それは私たちの直接の管理下にあるわけではなく、あまり実用的な解決策ではありません。理想的な世界では、pom はすでに正しいバージョンで更新されており、これをまったく行っていません。
- Mavenビルドの前にシェルステップを追加して、pom.xmlなどでsed replaceを実行できることはわかっています。それは機能しますが、醜く、より複雑な pom ではうまくスケーリングできません。ネイティブの Maven ソリューションが非常に好まれます。
- これをジェンキンスとは別にテストしました(つまり
mvn versions:set -DnewVersion=0.1.2
)、動作は同じです