2015年5月7日木曜日

buildnumber-maven-plugin を使って war ファイル内の Manifest.MF にリビジョン情報を埋め込む

概要

作成したwarの中にgitのリビジョン情報があると何かと便利です
いつのコミットから生成されたwarなのか知りたいケースは多いと思います
Mavenを使ってリビジョン情報を埋め込むことができたので紹介します

環境

  • Windows7 64bit
  • Java 1.8.0_25
  • Maven 3.2.2
  • buildnumber-maven-plugin 1.3
  • maven-war-plugin 2.6

Mavenでサンプル用のWebアプリプロジェクトを作成

適当に作成すればOKです
すでにmvn packageでwarが作成できるプロジェクトがあればそれでもいいです
ない場合はこちらを参考に作成してください
Eclipseの場合はMavenプロジェクトを作成する際にアーティファクトIDにmaven-archetype-webappを選択してサンプルプロジェクトを作成してください

また、今回はプロジェクト自体がgitリポジトリで管理されていることを想定しているのでプロジェクトをgit化してください
リモートリポジトリはなくてもいいのでgit initできていればOKです
Eclipseの場合は

Team -> Share Project -> Git -> Use or create repository in parent folder or project -> Create Repository

としてgit化してください

そしてgit add->git commitとしてはじめのコミットを作成しておきましょう

buildnumber-maven-pluginの設定

pom.xmlを編集します
<build> -> <plugins>タグ内に以下のプラグインを追加します

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.3</version>
    <executions>
        <execution>
            <phase>validate</phase>
            <goals>
                <goal>create</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <doCheck>false</doCheck>
        <doUpdate>false</doUpdate>
    </configuration>
</plugin>

上記を記載することでbuildnumber-maven-pluginが有効になります

ポイントはdoCheckdoUpdateのタグの部分です
falseを設定することで以下の効果があります

  • git statusを使って差分チェックをしなくなります
  • git pullをして最新のソースをremoteからマージしなくなります

上記が有効だとmvnビルドするのにいちいちgitコミットしなければいけないのとgit pullをするための認証情報の設定を別途記載する必要があります
trueでも設定さえちゃんとされていればビルドは次に進みますが個人的にはyak shavingしているだけの印象だったのでfalseを設定しました
また、falseを設定することでgitコマンド自体が不要になるのでEclipse上でmvnビルドしている場合は

[ERROR] ‘git’ は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。

というエラーが出るのを回避することもできます

warをアーカイブするときにManifest.MFを拡張

Manifest.MFを拡張するにはmaven-war-pluginを定義し直します
pom.xmlを編集します
<build> -> <plugins>タグ内に以下のプラグインを追加します

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>war</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <archive>
            <manifestEntries>
                <Implementation-ScmBranch>${scmBranch}</Implementation-ScmBranch>
                <Implementation-Build>${buildNumber}</Implementation-Build>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

ポイントは<archive> -> <manifestEntries>内の2つの宣言で特にvalueの変数が重要です
buildnumber-maven-pluginを有効にすることで${scmBranch}${buildNumber}という変数が使えるようになります
ここで指定するタグは何でもOKです
記載したタグ情報がそのままManifest.MFに記載されることになります

scm の設定を追記

どこのgitのリビジョン情報を参照するのかpom.xml内に記載する必要があります
この設定は<project>タグ直下に記載してください

この定義がないとcreate failed: The scm url cannot be null.という言われて怒られます
以下の設定をpom.xmlに記載します

<scm>
    <connection>scm:git:file://.</connection>
    <developerConnection>scm:git:file://.</developerConnection>
    <url>scm:git:file://.</url>
    <tag>HEAD</tag>
</scm>

今回の想定はプロジェクト自体がgitで管理されていることを想定しています
なのでプロジェクト自体を指し示すようにscmを定義します
もちろんここにはGithubのURLやイントラネット内にあるgitリポジトリを指定することも可能です

ビルドしてみる

ここまで設定できたらビルドしてみましょう
コマンドで実行する場合は
mvn package
でOKです

Eclipseで実行する場合はRun As -> Maven build でgoalsにpackageを指定して実行しましょう

ビルドが成功するとtargetディレクトリ配下にwarファイルが作成できています
このwarファイルを解凍してMETA-INF/Manifest.MFを見てみましょう
以下のようにリビジョン情報とビルドしたブランチ情報が追記されていればOKです

Manifest-Version: 1.0
Built-By: kakakikikeke
Build-Jdk: 1.8.0_25
Implementation-ScmBranch: master
Created-By: Apache Maven 3.2.1
Implementation-Build: 29fb55a9daa2afc3961b9759d0f4e50ca3cac281
Archiver-Version: Plexus Archiver

紹介は以上です
今回はリビジョン情報を埋め込みましたがManifest.MFには他にもいろいろな情報を埋め込めるので好きな情報を埋め込むといいと思います

参考サイト

0 件のコメント:

コメントを投稿