この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
最近社内で何かと話題になっている CI(継続的インテグレーション)ツール Jenkins を使ってみました。
プロジェクトの開発メンバー各々でデプロイを行うと、何かと設定ミスやビルド環境の違いにより、
思わぬトラブルや、余計な時間のロスを招いたりします。
そんなときは、Jenkins がスマートにビルドを行ってくれますので、このおじちゃんに頼ってみましょう。
Jenkins を導入
Jenkinsには、パッケージ形式とwar形式があるようです。 今回はビルドサーバにtomcatがインストール済みなので、war形式で導入します。
ビルドサーバにログインし、wget でwarファイルを取得します。
$ wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war
tomcatのwebappディレクトリにコピーし、Tomcatを起動します。
$ mv jenkins.war /usr/local/tomcat/webapps/
$ cd /usr/local/tomcat/
$ ./bin/startup.sh
デプロイされました。非常に簡単ですね。
Jenkins にアクセスしてみる
http://[servername]:8080/jenkinsにアクセスします。
準備中・・・
少し経つと、Jenkins が起動されました。
ビルド対象プロジェクトを作成する
プロジェクトの構成は以下の通りです。
distパッケージ以下に、本番用のプロパティファイル(jenkins.properties)を置きました。
build.xmlからwarタスクを実行すると、本番用のプロパティファイルを参照し、warファイルを作成するようにします。
以下が、build.xmlになります。
<?xml version="1.0" encoding="UTF-8"?>
<!-- ======================================================================
ExJenkins
ExJenkins build file
yamato
====================================================================== -->
<project name="ExJenkins" default="war" basedir=".">
<description>
ExJenkins build file
</description>
<property name="webapp" value="${basedir}/src/main/webapp"/>
<property name="compile.src" location="${basedir}/src/main/java"/>
<property name="compile.resources" location="${basedir}/src/main/resources"/>
<property name="compile.dest" location="${webapp}/WEB-INF/classes"/>
<property name="dist.resources" location="${basedir}/src/dist/resources"/>
<property name="war.dir" value="${basedir}/war"/>
<property name="tomcat.dir" value="/usr/local/tomcat/lib"/>
<!-- =================================
target: init
================================= -->
<target name="init" description="initialize">
<mkdir dir="${war.dir}"/>
</target>
<!-- =================================
target: compile
================================= -->
<target name="compile" description="compile the source" depends="clean">
<mkdir dir="${compile.dest}"/>
<javac srcdir="${compile.src}" destdir="${compile.dest}" encoding="UTF-8"
includeantruntime="false">
<classpath>
<fileset dir="${webapp}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
<pathelement location="${tomcat.dir}/servlet-api.jar" />
<pathelement location="${tomcat.dir}/annotations-api.jar" />
<pathelement location="${tomcat.dir}/el-api.jar" />
<pathelement location="${tomcat.dir}/jasper.jar" />
<pathelement location="${tomcat.dir}/jsp-api.jar" />
</classpath>
</javac>
<copy todir="${compile.dest}">
<fileset dir="${compile.resources}"/>
</copy>
<copy todir="${compile.dest}" overwrite="true">
<fileset dir="${dist.resources}"/>
</copy>
</target>
<!-- =================================
target: war
================================= -->
<target name="war" depends="init,compile" description="generate the WAR file">
<patternset id="exclude.fileset">
<exclude name="WEB-INF/lib/sources/**"/>
</patternset>
<war destfile="${war.dir}/ExJenkins.war"
webxml="${webapp}/WEB-INF/web.xml"
basedir="${webapp}">
<patternset refid="exclude.fileset"/>
</war>
</target>
<!-- =================================
target: clean
================================= -->
<target name="clean" description="clean up">
<delete dir="${compile.dest}"/>
</target>
</project>
tomcatのlibパスは、ビルドサーバ上のパスを指定します。
<property name="tomcat.dir" value="/usr/local/tomcat/lib"/>
Jenkinsでジョブの作成
Jenkinsでジョブを作成します。
新規ジョブ作成で、ジョブ名を入力し、OKをクリックします。
SVN の指定
先ずはSVNのパスを指定します。
リポジトリURLとチェックアウト方式を選択します。
ここで気を付けなくちゃいけないのは、チェックアウト方式で、'svn update' を実行 を選択してしまうと、
ワークスペースに古いファイルが残る恐れがあるので、'svn revert' してから 'svn update' を実行 を選択するようにします。
SVNの"認証を入力"という警告が表示されているので、クリックしてアカウントを指定します。
SVNのアカウントを指定して、実行をクリックします。
実際に運用する際は、Jenkins専用のアカウントを作っておくといいと思います。
Ant の指定
プロジェクトで作成した、build.xmlのタスクを指定します。
シェルの指定
ビルド後にシェルを実行することが出来ます。
今回は例として、ホームディレクトリにwarファイルをコピーするだけのシェルを作成しました。
#!/bin/bash
WORKSPACE=/home/classmethod/.jenkins/workspace/ExJenkins
BUILD_DATE=`date '+%Y%m%d%H%M%S'`
cd ~/dist
mkdir $BUILD_DATE
cp $WORKSPACE/ExJenkins/war/ExJenkins.war $BUILD_DATE/
ビルドの実行
ビルドを実行すると、コンソール出力からビルドの状態が確認できます。
ビルド結果を確認する
ビルドサーバでビルド結果を確認してみます。
$ pwd
/home/classmethod/dist/20120221105420
$ ls -ltr
-rw-rw-r-- 1 classmethod classmethod 7854650 2012-02-21 10:54 ExJenkins.war
正しくwarファイルが作成されました。
まとめ
以上で簡単なJenkinsの使い方は終わりです。
今回は、シンプルな構成でしたが、あるプロジェクトをビルド後に別プロジェクトをビルドしたり、
メールを飛ばしたり、ビルド時間をスケジュールしたり、自動テストを行ったりと、他にも様々な機能があります。
みなさんのプロジェクトでも是非導入してみてください!