ログ日記

作業ログと日記とメモ

GWT + Git + Hudson の設定

昨日色々考えた末に、Hudsonを使ってみることにした。
名前は知っていてちょっと大げさかなと思っていたのだがMavenに比べたら簡単そうだ。


http://gihyo.jp/dev/feature/01/hudson/0001
ここを参考にしつつ。


Debian squeezeでの作業ログ。

Hudson can be installed as a Debian package, which enables:

  • Automatic upgrade of Hudson via apt
  • /etc/init.d hook up to start Hudson on boot

To use the repository, first add the key to your system:

wget -O /tmp/key http://hudson-ci.org/debian/hudson-ci.org.key
sudo apt-key add /tmp/key

Then install Hudson

wget -O /tmp/hudson.deb http://hudson-ci.org/latest/debian/hudson.deb
sudo dpkg --install /tmp/hudson.deb

Once the package is installed, apt-get update; apt-get install hudson will update Hudson. See Wiki for more information.

http://hudson-ci.org/debian/

Debianのtestingでもパッケージでインストールできる。


Tomcatとポートが同じなので、Tomcatがインストールされている場合はポートを変更する。設定ファイルは /etc/default/hudson ここ。
とりあえず最初はデフォルトの8080で立ち上げてみる。/etc/init.d/hudson start で立ち上がるので、ブラウザからアクセスする。


まだ何も設定していないのに普通に日本語が表示された。気が利いている。
最初のシェルスクリプトジョブの部分で詰まった…特定の場所だけ日本語が出ない。これは普段からなんだけどまぁいいかと放置していた…。さすがに直そうと思って
http://www.google.com/support/forum/p/chrome/thread?tid=3faeaaaeb36aaf86&hl=ja
ここに書いてあるChrome Stylistを入れて全てのサイトに * { font-family: sans-serif !important; } を設定した。どれがOpenTypeか分からなかったので。
これで表示はOK。
それにしても、最近のオープンソースプロジェクトはデザインが洗練されてきたねぇ…いいことだ。



最初に管理者ユーザーを作ってセキュリティ設定をする。それからGitプラグインを入れる。Webの設定画面から全てが完了する…すごい。
今回は既存のGitリポジトリがあるマシンとは別のHudson用マシンを使ったので、Gitのリポジトリ設定もする。
gitosisを使っているので、その権限を設定する。

usermod -G nogroup,gitosis hudson

gitwebが入ってなければインストール。

aptitude install gitweb

/etc/apache2/conf.d/gitweb に設定があるので適当に変更してアクセスする。
Hudsonのリポジトリブラウザの設定をgitwebにして、URLに http://example.com/gitweb/?p=project.git を入れる。


エラーになるがワークスペースを作るために一度ビルドを実行する。追記:git config --global で実行したらワークスペースは不要。
git操作のために、hudsonユーザのgit config設定をする。

$ cd /srv/hudson/jobs/project/workspace
$ git config user.email "some@email.com"
$ git config user.name "hudson"
http://wiki.hudson-ci.org/display/HUDSON/Git+Plugin

念のためhudsonユーザで実行した。

sudo -u hudson git config --global user.email "user@example.com"
sudo -u hudson git config --global user.name "hudson"

そしてもう一度ビルドを実行。hudson-projectname-2 というタグができたようだ。


gitのpost-receiveのhookスクリプトを書いてテストする。
/srv/gitosis/repositories/app.git/hooks/post-receive

wget -O /dev/null "http://localhost:8080/job/projectname/build?token=token"

プロジェクトのページを開けておくと、ブラウザをリロードしなくても動的にビルド履歴が追加された。すごい。
うまくいかない場合はコマンドラインからwgetを実行してチェックする。



ここからいよいよコンパイル&アップロードのスクリプトを書く。
まず gwt-2.1.0.M3 を /usr/local/gwt などに展開する。
それから共通のjarファイルも/usr/local/java などに入れる。
スクリプトを/usr/local/bin/ に書く。

#!/bin/bash

USAGE="Usage: gwt-build.sh com.company.appname.ModuleName dirName appPath"
if [ "$1" == "" ]; then
    echo "ERROR: Required module name."
    echo $USAGE
    exit 1
fi

if [ "$2" == "" ]; then
    echo "ERROR: Required dir name to deploy."
    echo $USAGE
    exit 1
fi

if [ "$3" == "" ]; then
    echo "ERROR: Required application path."
    echo $USAGE
    exit 1
fi

# copy libs and other files
GWT_HOME=/usr/local/gwt-2.1.0.M3
SHARED_LIB=/usr/local/java
mkdir -p war/WEB-INF/lib
cp $GWT_HOME/gwt-servlet.jar war/WEB-INF/lib/
cp $SHARED_LIB/*.jar war/WEB-INF/lib/
mkdir -p war/WEB-INF/classes
cd src
find . ! -name "*.java" -type f | cpio -pd ../war/WEB-INF/classes > /dev/null 2>&1
cd ..
echo product > war/WEB-INF/classes/env.txt

# compile java
CLASSPATH=$GWT_HOME/gwt-user.jar:$GWT_HOME/gwt-dev.jar
for jar in `ls $SHARED_LIB`; do
  CLASSPATH=$CLASSPATH:$SHARED_LIB/$jar
done
find src -name "*.java" | xargs javac -sourcepath src -d war/WEB-INF/classes \
  -g:lines.vars.source -cp $CLASSPATH
RET=$?
if [ $RET -ne 0 ]; then
        exit $RET
fi

# compile gwt
java -cp src:$GWT_HOME/gwt-user.jar:$GWT_HOME/gwt-dev.jar com.google.gwt.dev.Compiler -war war $1
RET=$?
if [ $RET -ne 0 ]; then
        exit $RET
fi

# upload and reload app
rsync -avz --delete war/ user@webapp_host:~$2
wget -O /dev/null --http-user=user --http-passwd=pass \
  "http://webapp_host:8080/manager/html/reload?path=$3"

追記:シェルの実行入力ボックスに~/を入れると自動で/var/lib/hudsonに変換されるようなので、~はスクリプト上に書いた。
追記:終了コードチェックを追加した。
これを実行するために、Hudsonのビルドでシェルの実行に

/usr/local/bin/gwt-build.sh com.company.app.MyApp /java/webapps/myapp /myapp

を入力して保存。


アップロードでrsyncsshを使うので、そのの設定

sudo -u hudson ssh-keygen
# pubキーをwebapp_hostのauthorized_keysに追加

これでGitコミットをトリガーにコンパイルしてアップロードするまでが一通り完成。
どこかで失敗したらエラーを出すとか、CSSのみの更新ならビルドしないなどは今後考える。
.gitignoreファイルはこんな感じ。

.gwt/
war/com.company.app.MyApp/
war/WEB-INF/classes/
war/WEB-INF/lib/
*~


warディレクトリ以下を全てignoreにして、別のリポジトリで管理してもいいかもしれない。
cssやhtmlの更新の場合はリソース用リポジトリのpost-receiveにtomcatアプリのリロードだけ書けば無駄な処理も走らないとか考えている。


今回はアプリ個別のlibディレクトリを設定しなかったが、利用する場合はsrc/libにjarを入れておきクラスパスを設定する必要があるのでもう少しスクリプトの修正が必要かもしれない。