再考・Maven2+Hudsonによる1clickリリース管理

前回簡単にまとめた方式ですが、運用してみて大きな落とし穴がありました。まぁMavenの制約なんですけど、、、本当、Mavenって飼い慣らすのが大変。

前回の方式の問題点

  • 前回まとめた方式では、バージョン番号を変数とする方式としていました。
  • 具体的に、以下のような感じ。
    • タグには${releaseVersion}と変数で書いておき、タグでデフォルト値を設定しておく(このデフォルト値が日々のSNAPSHOTビルドのバージョン番号となります)。
    • Hudsonからのリリースビルド時は、-DreleaseVersion=1.0とリリースバージョンを渡す。1.0という数字は、HudsonのParameterized Buildを使用して、ビルド時に画面から入力できるようにする。
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>sample</artifactId>
  <packaging>jar</packaging>
  <version>${releaseVersion}</version>
  <name>Sample</name>

  <properties>
    <releaseVersion>1.0-SNAPSHOT</releaseVersion>
  </properties>

  ・・・
</project>
  • この方式は、単独のプロジェクトであれば問題ありません。しかし、プロジェクト間で依存関係のある場合に問題があることが分かりました。
  • 上記のようなPOMを持つプロジェクトをビルドし、リモートリポジトリにデプロイしても、実はタグは${releaseVersion}のままのようです*1
  • で、このPOMを他プロジェクトから参照した場合、どうもの部分で書いている変数が解決されないようです。
  • 問題を確認したプロジェクト構成は以下のような構成でした。

ProjectX -----依存-----> ProjectY ----親参照----> ParentZ

  • ProjectXからYは解決できるのですが、YからZへの親への参照時にZのバージョン番号が解決できずにエラーとなってしまいました*2。ProjectYの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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.example</groupId>
    <artifactId>Z</artifactId>
    <version>${releaseVersion}</version>
  </parent>
  <artifactId>Y</artifactId>
  <packaging>jar</packaging>
  ・・・
</project>
  • なんとか${releaseVersion}部分を解決できる方法がないかググってみたり色々試してみたものの、お手上げ状態になってしまいました。

というわけで方式を再考

  • 変数化し、-DオプションでHudsonから渡すだけという単純な方法は残念ながら断念。
  • リモートリポジトリにデプロイする際には、タグの部分はきちんとバージョン番号を埋め込んであげないと駄目、ということです。
  • となると、結局maven-release-pluginがやってくれているようなPOMの書き換えが必要になってしまうんですよね。。。
  • とはいえ、maven-release-pluginにまた戻るのも悔しい(苦笑)
  • そこで試行錯誤した結果、以下のプラグインを組み合わせることでまぁなんとかできそうな感じです。
  • 上記プラグインの組み合わせでの実現方式については、次回のエントリに書こうと思います。

*1:maven-install-plugin or maven-deploy-pluginが自動的にversion部分を書き換えてpom.xmlを生成してくれれば良いのに、と思うのですがねぇ。

*2:Mavenは親POMが定義されていると、自動的に親を参照します。親POMに共通の依存関係とかプラグインの設定といったプロジェクトで共通の情報を定義できるので、まずは親を参照する動きとなります。