Mavenでビルドした成果物にバージョン管理システムのリビジョン番号を含める


2011年 03月 03日

テストしたい機能がデプロイされているかどうか確認するためにアプリのリビジョン番号を埋め込というのはよくある話です。

mavenでこの機能を実現するプラグインが存在しないか確認したのですが、とくに存在しなかったようなので、弊社のプロジェクトでは次の様な設定をpom.xmlに設定してリビジョン番号を取得しています。

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>1.6</version>
      <executions>
        <execution>
          <id>svn-info</id>
          <configuration>
            <target>
              <exec executable="ruby" dir="./"
                    input="../.svn/entries"
                    output="src/main/resources/svnrevision.properties"
                    failifexecutionfails="false">
                <arg value="-e"/>
                <arg value="gets;gets;gets;puts %{svn.revision=#{gets}}"/>
              </exec>
            </target>
          </configuration>
          <goals>
            <goal>run</goal>
          </goals>
        </execution>
      </executions>
    </plugin>

antrunのexecを最大限利用し標準入力に使うファイル、標準出力の出力先ファイルを指定しています。

入力ファイルは../.svn/entriesです。マルチモジュールプロジェクトの子pomに記述する事が前提となっていますので親ディレクトリを参照しています。

出力ファイルは各プロジェクトのsrc/main/resources/svnrevision.propertiesです。プログラムはこのプロパティファイルを使ってリビジョン番号を表示します。

プログラムは入力の4行目を取り出すだけになっています。これは.svn/entriesファイルの4行目にリビジョン番号が含まれているからです。今回の例ではpom.xmlに埋め込みたいという理由でrubyを利用していますが、どんなプログラムでも4行目が取り出せればOKです。

この設定は次の様なマルチモジュールプロジェクトの子pomに記述する想定となっています。(※本来であれば親pom.xmlに設定を記述したいのですが、このような理由で設定できません)

killer-app/ (project root)
  |- .svn
  |    |- entries
  |- pom.xml (親pom)
  |- killer-app-common
  |    |- pom.xml (子pom)
  |- killer-app-web
       |- pom.xml (子pom)

実行結果例です。

% cat src/main/resources/svnrevision.properties
svn.revision=31378

svnversionを利用しない理由

svnversionを利用しない理由はこのようにやけに遅いからです。

% time svnversion
31473
svnversion  1.44s user 3.73s system 97% cpu 5.272 total

Subversion以外のVCSの場合

Gitの場合

git logの結果を利用しましょう。

<exec executable="git" dir="./"
      output="src/main/resources/gitcommitid.properties"
      failifexecutionfails="false">
  <arg value="log"/>
  <arg value="-n1"/>
  <arg value="--format='git.commitid=%H'"/>
</exec>

実行結果です。

% cat src/main/resources/gitcommitid.properties
git.commitid=674466c243814f9c5fc3a0aeaa10ab18345b067c

Mercurialの場合

hg logの結果を利用しましょう。

<exec executable="hg" dir="./"
      output="src/main/resources/hgrevision.properties"
      failifexecutionfails="false">
  <arg value="log"/>
  <arg value="-l1"/>
  <arg value="--template"/>
  <arg value="hg.revision={rev}:{node}"/>
</exec>

実行結果例です。

% cat src/main/resources/hgrevision.properties
hg.revision=608:761847ca1074c0386130e63270d062382a26bf40

Bazaarの場合

bzr version-infoの結果を利用しましょう。

<exec executable="bzr" dir="./"
      output="src/main/resources/bzrrevision.properties"
      failifexecutionfails="false">
  <arg value="version-info"/>
  <arg value="--custom"/>
  <arg value="--template"/>
  <arg value="bzr.revision={revno}:{revision_id}"/>
</exec>

実行結果例です。

$ cat src/main/resources/bzrrevision.properties
95:nmb@wartburg.edu-20101108172717-fntyygimogbb2vyf