@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Gitlabの更新を契機にJenkinsでnode.jsアプリケーションをテスト

はじめに

前提条件

  1. ソース管理はgitlab
  2. JenkinsはCloudbeesを使う*1
  3. テストはfresby.jsで書いてる

目標

gitlabでトピックブランチをmasterにマージしたら自動的にテストする

gitlabの設定

秘密鍵

Jenkinsがgit cloneできるように秘密鍵を登録します。

  1. Jenkinsで新規プロジェクトを作成
  2. (Cloudbeesの場合)Jenkinsの秘密鍵が用意されている
  3. gitlabの自分のアカウントに追加

pullするだけなので、自分のアカウントをそのまま使います。 複数人で開発するプロジェクトでは、Jenkins用ユーザを用意した方がいいかもしれません。

webhook

  1. gitlabのプロジェクトのSettingsのHooksを設定
  2. Push eventsイベントを選択
  3. 次のフォーマットのURLを登録
http://< jenkins host >/git/notifyCommit?url=git@< gitlab host >:< repository owner >/< repository name >.git

例えば

http://ledsun.ci.cloudbees.com/git/notifyCommit?url=git@gitlab.com:ledsun/sampleproject.git

参考:YUKASHIKADO Inc. 開発ブログ • Jenkins と GitLab と rbenvでプライベートなRuby開発環境を構築する

Jenkinsの設定

plugin

gitlabと連携するためのプラグインをインストールします。

  1. Jenkins > Jenkinsの管理 > プラグインの管理
  2. Gitlab Hook Pluginをインストール

Jenkinsのプロジェクト設定

Jenkinsのダッシュボードからプロジェクトを作成し設定します。

ソースコード管理

  1. git を選ぶ
  2. git urlを指定。例えばgit@gitlab.com:ledsun/sampleproject.git
  3. masterブランチを設定

ブランチを指定すると、masterにマージしたときだけビルドを実行します。 指定しないと、トピックブランチをプッシュした時もビルドが実行します。

ビルド・トリガ

  1. SCMをポーリングにチェックを入れる

ビルド

シェルの実行に次のスクリプトを指定します。

curl -s -o use-node https://repository-cloudbees.forge.cloudbees.com/distributions/ci-addons/node/use-node
NODE_VERSION=0.10.26 . ./use-node
npm install
npm install jasmine-node@1.14.2
npm install forever
export PATH=$PATH:node_modules/jasmine-node/bin/:node_modules/forever/bin
forever start --no-colors app.js
sleep 2s
jasmine-node spec/dev/ --junitreport
forever stop --no-colors app.js

注意点

  1. Cloudbeesでnodeを使うにはおまじないが必要
  2. nodeコマンドはローカルにイスントールしてパスを通す
  3. jasmine-nodeでfresby.jsのテストを実行するときはバージョン1.14.2を指定する
  4. テスト終了後にプロセスをnodeアプリケーション終了するためにforeverを使う
  5. nodeアプリケーションの起動に時間がかかるのでsleepで待つ

nodeを動かす

CloudBees DEV@cloud (Jenkins as a Service) Documentation のサンプルを参考にします。 サンプルはnode.jsのバージョンが古いのでなるべく最新の10.26を指定します。

curl -s -o use-node https://repository-cloudbees.forge.cloudbees.com/distributions/ci-addons/node/use-node
NODE_VERSION=0.10.26 . ./use-node

これでnpmコマンドも入ります。

nodeコマンドをインストール

Cloudbeesでは、nodeコマンドはHow do I get a grunt task working with a Cloudbees Jenkins build - Stack Overflow のようにローカルにインストールしてPATHを設定して使います。

  • forever
  • jasmine-node

をインストールします。

npm install jasmine-node@1.14.2
npm install forever
export PATH=$PATH:node_modules/jasmine-node/bin/:node_modules/forever/bin

nodeアプリケーションの開始

終了しなくても一度の実行ではテストが成功します。 何度か実行すると失敗します。

Jenkinsでnodeのアドオンをビルドして、それを使ったhttpサーバアプリケーションを起動する - 猫ぱーんち!を参考にし foreverを使って明示的に起動・終了します。

Jenkinsのコンソールはカラー表示に対応していないので--no-colorオプションをつけます。

forever start --no-colors app.js

foreverを使うとアプリケーションの起動完了前に次のコマンドが実行されます。 起動完了を待つためにスリープを入れます。

sleep 2s

テストの実行

frisby.jsのテストはjasmine-nodeコマンドで実行します。 jasmine-nodeの最新版(1.14.3)は上手く動きません。1つ前のバージョン1.14.2を使います。

また、Jekinsでテスト結果を集計するために--junitreportオプションをつけます*2

jasmine-node spec/dev/ --junitreport

nodeアプリケーションの終了

forever stop --no-colors app.js

ビルド後の処理

Junitテスト結果の集計にreports/*.xmlを指定します。 Jenkinsのダッシュボードに成功・失敗したテスト件数が表示されるようになります。

確認

Jenkinsの設定が上手く言っているか確認するために、ビルドの実行をしてみましょう。

20140718追記

jasmine-nodeの1.14.5がリリースされ、バージョン指定が不要になりました。

*1:Cloudebeesの設定方法はCloudbeesを使ってJenkinsを用意するを見てください。

*2:2014年7月8日時点では、--junitreportオプションを付けるとテストが正しく実行されません。1.14.4で解消されるそうです