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/keyThen install Hudson
wget -O /tmp/hudson.deb http://hudson-ci.org/latest/debian/hudson.deb sudo dpkg --install /tmp/hudson.debOnce 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
を入力して保存。
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を入れておきクラスパスを設定する必要があるのでもう少しスクリプトの修正が必要かもしれない。