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するようにしてApacheBasic認証するようにした。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だったけど半日くらいでこんだけの環境がセットアップできるので結構お手軽だと思う。