Node.jsでもCI(継続的インテグレーション:continuous integration)出来るのかな?と思い、調べたところ出来そうだったので、まずはTravis CIを使って回してみます。
準備
GitHubとTravisでアカウントをそれぞれ登録します。んでGitHubでリポジトリを作っておきます。作った後、Travisのサイトを開きログインします。そして右上のアカウントを押すと、GItHubのリポジトリの一覧(下のキャプチャ参照)が出てくるので、先ほど作ったリポジトリを選択してONにしておきます。これでGitHubとTravisの連携が開始されます。
仕様
Travisは言語毎にヘルプドキュメントが作成されているので、まずはそれを読み込んでみます、英語スキルも上げたい。。。
http://docs.travis-ci.com/user/languages/javascript-with-nodejs/
ほんでポイントとしては以下の通り
1) .travis.ymlをプロジェクトルートに作り、テスト対象の言語がNodeであるということとテストするバージョンを書いておく。
2) テストのコマンドはnpm testを実行する。これはpackage.jsonのscriptsにtestを書いとけという話ですね。
3) テスト前にnpm installを実行する。必要なモジュールはpackage.jsonに全部書いとけばOKという話ですかね。
やってみよう
では実際にTravisに働いてもらいます。まずはローカルでブランチを切りwipでプルリクエストを送って、gitignoreとpackage.jsonを追加してpushしてみます。
.gitignore
node_modules/
package.json
{ "name": "travisTest", "version": "0.0.1", "description": "Travisのサンプルテスト", "scripts": { "test": "vows test/division-by-zero-test.js --spec" }, "repository": "https://github.com/rei-m/travisTest", "author": "Rei Matsushita", "license": "MIT", "dependencies": { "vows":"*", "assert":"*" } }
今回はvowsというビヘイビア駆動開発用のフレームワークを使ってみます。assertはまんまですね。ここで大事なのは "test": "vows test/division-by-zero-test.js --spec"の部分です。pushしてTravisが走るとnpm testが実行されて、実体はvows test/division-by-zero-test.js --specが実行されるという形ですね。
とりあえずこれでpushしてGitHubのプルリクエストの画面を開いてみます。そうするとmergeボタンが黄色くなってプルリクエストのコミットログの左にいつもと違うマークが出るはずです。これはテスト実行中の状態でしばらく待つと×マークが出るはずです。
この×マークはpushを契機にTravis CIが走りテストを行った結果、テストが失敗しましたよということを意味しています。マークを押すとTravis側の画面に飛んでテスト結果を見る事が出来ます。テスト結果を見ると下のようなログがつらつらと出ていますね。
失敗しているログを見ると.travis.ymlが見つからないと言われています。では次に.travis.ymlとテストモジュールのtest/division-by-zero-test.jsを追加してpushしてみます。
.travis.yml
language: node_js node_js: - 0.11 - 0.10
test/division-by-zero-test.js
var vows = require('vows'), assert = require('assert'); // Create a Test Suite vows.describe('Division by Zero').addBatch({ 'when dividing a number by zero': { topic: function () { return 42 / 0; }, 'we get Infinity': function (topic) { assert.equal (topic, Infinity); } }, 'but when dividing zero by zero': { topic: function () { return 0 / 0; }, 'we get a value which': { 'is not a number': function (topic) { assert.isNaN (topic); }, 'is not equal to itself': function (topic) { assert.notEqual (topic, topic); } } } }).export(module);
このテストモジュールはvowsのサイトに載っていたサンプルコードで0除算の計算結果をassertかけているだけなので深い意味はありません。では、こちらを置いてpushしてみます。
コミットログを見ると以下のように緑のチェックが入ってマージボタンも緑色になっているはずです。これはTravisのテストが正しく通ったのでマージ出来ることを意味しています。
では意図的に失敗させてみましょう。42 / 0となっている部分を42 / 2にしてエラーを起こしてみます。push後しばらく待つと失敗するはずです。Travis側の画面を見てみましょう。
テストを実行した結果、we get Infinityの部分でテストがこけているのがわかります。Travisが正しくGitHubにテスト結果を返していますね。
テストが通れば後はマージをして終了です。今回はサンプルモジュールでのテストだったので次回は実践的なテストを書いて試してみます。