ビルド職人本のサンプルプロジェクトの展開例

おやすみ、るびこ

Jenkinsではじめるビルド職人入門 | Gihyo Digital Publishing … 技術評論社の電子書籍」で例示したサンプルプロジェクトの展開例を紹介します。


サンプルプロジェクトはWebアプリケーションを作るための構成ですが,作るアプリがWebアプリだけで終わるってプロジェクトは希ですよね。大抵のプロジェクトには多少なりともバッチ処理が含まれると思います。以下の判断の善し悪しは人によりけりですが,あたしはこんな考えてバッチ用のプログラムをプロジェクトに混ぜ込みます。

  • WebがJavaなんで,バッチもJavaで組む(mainメソッド持ったクラスを作る)
  • Java単体じゃバッチは起動できないので,ラウンチ用のシェルも作る(*.batとか*.shとかね)
  • バッチ用に,WEB-INF的なディレクトリを用意して,そこにバッチ用の設定ファイルを置く(たとえば,log4j.propertiesとか)


「Webとバッチじゃ目的違うんだから,プロジェクト分けろよ−」ってのが一番ありそうな指摘だけれど,Webからもバッチからも使うクラスもあるし,キレイに分けても主旨を他の開発者に理解してもらうのが億劫だしという消極的理由で同じプロジェクトにWebとバッチを混在させてます。


具体的にどこをどう直すかというと,Chapter4のサンプル(1.basicってやつ)をベースにこんな風にします。


ポイントは,以下のとおり。

  • シェル置き場(${src.batch.dir})を作った。何気にある ${src.batch.dir}/confにはバッチ用の設定ファイルを置くよ。
  • バッチの成果物置き場(${dest.batch.dir})を作った。ここのディレクトリ構造がバッチ処理の構造そのものになる(./confとか./libに注目してね)。
  • ${dest.batch.dir}/libには,${lib.compile.dir}${lib.provided.dir}の内容がコピられる。
    • あと,${dest.java.dir}をJarに固めたのもね。
    • バッチ処理でDBアクセスするようだったら,そのJDBCドライバは${lib.provided.dir}においてもらう。
    • バッチの起動シェルでは,${dest.batch.dir}/lib内のJarファイルをかき集めてクラスパスを組み立てるような記述をしといてもらう。
  • 設定ファイル置き場(${dest.batch.dir}/conf)は「ボクがここを設定ファイル置き場に決めた」だけでしかないので,そっから何かを読み込むようにバッチプログラムを組むのだよ。


ビルドスクリプトはそれぞれ次のように修正します。

---- build-common.xml ----
<!-- パスの設定 -->
<property name="src.java.dir" value="src/java" />
<property name="src.web.dir" value="web" />
<property name="src.batch.dir" value="src/batch" />    ← ここと

<property name="dest.dir" value="dest" />
<property name="dest.java.dir" value="${dest.dir}/classes/java" />
<property name="dest.javadoc.dir" value="${dest.dir}/report/javadoc" />
<property name="dest.batch.dir" value="${dest.dir}/batch" />    ← ここ


build-jenkins.xmlは,build-batchターゲットを追加して,releaseターゲットを修正します。

---- build-jenkins.xml ----
<target name="build-batch" description="バッチモジュールの作成" depends="compile-main">
  <delete dir="${dest.batch.dir}"/>
  <mkdir dir="${dest.batch.dir}/lib"/>
  <copy todir="${dest.batch.dir}">
    <fileset dir="${src.batch.dir}" includes="*.sh, *.cmd, **/*.properties"/>
  </copy>
  <jar destfile="${dest.batch.dir}/lib/${ant.project.name}.jar"
       basedir="${dest.java.dir}"/>
  <copy todir="${dest.batch.dir}/lib">
    <fileset dir="${lib.provided.dir}" includes="*.jar"/>
    <fileset dir="${lib.compile.dir}" includes="*.jar"/>
  </copy>
</target>

<target name="release" depends="clean, build-webapps, build-batch, javadoc"
                       description="リリースモジュールの作成">
  <zip destfile="${dest.dir}/${ant.project.name}.zip">
    <fileset file="${dest.dir}/${ant.project.name}.war"/>
    <zipfileset dir="${dest.javadoc.dir}" prefix="javadoc"/>
    <zipfileset dir="${dest.batch.dir}" prefix="batch"/>
  </zip>
</target>


なんちゃってバッチプログラム(Java)はこんなの。

package com.example;

public class BatchMain {
    public static void main(String[] args) {
        Greeting greeting = new Greeting();
        System.out.println("greeting = " + greeting.sayHello());
    }
}


なんちゃってバッチシェルはクラスパスの設定が面倒くさいから省略w。要するにですね,

java -cp ${CLASSPATH} com.example.BatchMain


みたいなことをしてるとイメージしてもらえればよいです。
#こうゆう横着かますからMavenizeできないんだろうなって自覚はある。:-)

続きを読む