Node.jsのプロジェクトをJenkinsで自動テスト
Node.jsでつくったサービスをJenkinsで自動テスト走らせるようにした。gitでpushしたら自動でテストが走って失敗したらメールとかチャットに通知してくれる。便利。
インストール
サーバーはUbuntu(v10.04@sakura vps)なのでここに書いてある通りにする。
http://pkg.jenkins-ci.org/debian/
まずキーを取得。
$ wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
次に以下を/etc/apt/sources.listに追加。
deb http://pkg.jenkins-ci.org/debian binary/
んでインストール。
$ sudo apt-get update $ sudo apt-get install jenkins
インストールできたら/etc/default/jenkinsが設定ファイルなんでportとか変更するなら変更して
$ sudo service jenkins restart
で再起動。特にはまりどころなし。起動したらもうブラウザからアクセスできるはず。起動まで10分くらいでできた。
Gitの設定
Git Pluginというので簡単にできた。Git Pluginにしたら設定でリポジトリのURLとか入れて、jenkinsユーザーでsshの鍵作って鍵を設定、Jenkins全体の設定のところのGit pluginという設定項目のところで、user.nameとuser.emailを設定する。こんくらい。user.nameとuser.emailっていう設定がややわかりにくいくらい。
これ設定したらタスク実行時にリポジトリcloneしてそこをworkingディレクトリとして実行してくれる。簡単。
テストの設定
テストの実行のコマンドを設定画面の「シェルの実行」に書く。プロジェクトがNode.jsなんでまずjenkinsユーザーでnodebrewをインストールして該当のバージョンをinstallしてuseしとく。そんで実行時にパスを追加するようにした。設定したシェルスクリプトはこれだけ。
export PATH=$HOME/.nodebrew/current/bin:$PATH npm install npm test
npm testでテストできるようにしてて、package.jsonにはこう書いてある。
"scripts": { "test": "./node_modules/.bin/mocha test/*.js --reporter tap", }
testにはmochaを使っててreporterをtapにしてある。これでビルド実行してテストがちゃんと走ればOK。(追記)
認証
ApacheがすでにフロントにあったのでそいつからproxyするようにしてApacheでBasic認証するようにした。Apacheの設定はこんな感じ。
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName <hostname> <Location /> AuthUserFile /path/to/.htpasswd AuthGroupFile /dev/null AuthName "Please Enter Your Password" AuthType Basic Require valid-user </Location> ProxyPass / http://localhost:<port>/ ProxyPassReverse / http://localhost:<port>/ </VirtualHost>
mod_proxyが有効になってないとエラるので有効にしとく。
次にProxy経由じゃないとアクセスできないように/etc/default/jenkinsの最後に書いてある起動オプションにhttpListenAddressを設定しとく。
JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpListenAddress=127.0.0.1 --httpPort=$HTTP_PORT --ajp13Port=$AJP_PORT"
git push hook
git pushしたら自動でテスト走るようにしたい。JenkinsはURLにリクエストするとビルドを実行してくれる機能がある。リポジトリにはBeanstalkというサービスを使っていてこいつにWeb Hookという機能があって、pushしたら設定したURL叩いてくれるのでこいつを使う。
これを有効にしてURLにこれを設定するだけ。簡単。
http://<user>:<pass>@<hostname>/job/<job-name>/build?delay=0sec
テストが失敗したときの通知
メールの通知はデフォルトで設定できるやつがコケたときだけメール送信してくれるのでいいんだけど、campfire(チャット)への通知が既存のプラグインだと成功時も送られるのでうざい。のでこのエントリーを参考にシェルスクリプトでやった。
http://ikasama.hateblo.jp/entry/2011/12/21/033421
Post build taskのスクリプトはこんな感じ。
RESULT=`curl -u <user>:<pass> ${BUILD_URL}api/xml | perl -le '$_=<>;print [/<result>(.+?)</]->[0]'` if [ $RESULT != 'SUCCESS' ]; then curl \ -u <campfire_token>:X \ -H 'Content-Type: application/json' \ -d "{\"message\":{\"body\":\"${JOB_NAME} #${BUILD_NUMBER}: ${RESULT} (${BUILD_URL})\"}}" \ https://<subdomain>.campfirenow.com/room/<room_id>/speak.json fi
初Jenkinsだったけど半日くらいでこんだけの環境がセットアップできるので結構お手軽だと思う。