TIM Labs

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

| コメント(0) | トラックバック(0)

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

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

トラックバック(0)

トラックバックURL: http://labs.timedia.co.jp/mt/mt-tb.cgi/212

コメントする

このブログ記事について

このページは、troterが2011年3月 3日 00:00に書いたブログ記事です。

ひとつ前のブログ記事は「gitでサブモジュールを削除する」です。

次のブログ記事は「maven-antrun-pluginからclosure compilerを利用してみる」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。