以前からYahoo! Pipesに限らず日記に貼り付けたアドホックな作業スクリプトがいつの間にか動かなくなっているのが悲しかったので、なんとかしたいと思っていて。今まで、日記の中にpythonのdoctestを埋め込んで原稿自体にテストランナーを実行するなど紆余曲折をへたのちに、今時っぽくJenkinsに任せることにした(HudsonがPrototype.jsで動いてた時からちょくちょく試してた)。
CloudBees とは
CloudBeesはJava系のPaaS。その中の機能でDEV@cloudというサービスがありそこで無料プランの範囲内でJenkinsを操作するアカウントが持てる。
本来ウェブアプリ実行環境がサービスとしてはメインだろうけど今回はJenkinsの身体だけが目当てで近寄っていく感じです。
無料プランの制限は
から
- 使えるプラグインの種類は基本セットだけ
- ディスク容量は2GBまで
- 平行ビルドは1本のみ
細かい違いは使ってみててもよくわからないが、ビルド実行→queue待ちみたいなタイミングが確かにある。
Nodeの実行環境のセットアップ
ビルド実行ごとにクリーンな環境が割り当てられるので、
シェルスクリプトでダイレクトにバイナリインストールして使う。
具体的には以下のシェルスクリプトをJenkinsのジョブから実行させる。
node_version=v0.8.16 file_name=node-$node_version-linux-x64 if [ ! -e $file_name ] then wget http://nodejs.org/dist/$node_version/$file_name.tar.gz tar xf $file_name.tar.gz fi node_dir=$PWD/$file_name $node_dir/bin/npm install $node_dir/bin/npm test
ちなみにpython -Vしたらデフォルトで2.7.x入ってたのでPython環境のが楽だったかも。CloudBees DEV@cloud (Jenkins as a Service) Documentation を見るとruby/PHP/Pythonなどは入ってるみたい。
あとBuildHive: Cloud Continuous IntegrationというGithub上のリポジトリにたいするCIサービスもあってそっちの工夫のしようがありそう。
テストスクリプト
とりあえず以下で作ったパイプをテストに入れてみる。
- Twitterユーザーの個別フィードが来春で取得できなくなるのでYahoo! PipesでスクレイピングしてRSSにするやつを作った - laiso
- iOS Dev Center のサンプルコードとドキュメントの更新を受け取るフィード作った - laiso - iPhoneアプリ開発グループ
実際のエンドポイントにアクセスして正常なフィードかどうかというのを、受け取ったレスポンスに20件のアイテムデータがあるかどうかで判断する。Yahoo! Pipes上でパースに失敗していた場合とかはここが0件になっているという算段。
テストフレームワークにmocha。リクエストにrequest。RSSのパースにcheerioを使った。
# yahoo-pipes-test.coffee assert = require('assert') describe 'Yahoo! Pipesに登録したパイプの動作監視テスト', -> describe 'Apple Developer Center iOS Sample Code Update (http://pipes.yahoo.com/pipes/pipe.info?_id=2e692378a03f70e68eeaefbd75927624 )', -> it 'SampleCodeのフィードにitemが20個入って返ってくる', (done) -> loadPipes 'http://pipes.yahoo.com/pipes/pipe.run?_id=2e692378a03f70e68eeaefbd75927624&_render=rss', (items) -> assert items.length is 20 done() describe 'Apple Developer Center iOS Documentation Update (http://pipes.yahoo.com/pipes/pipe.info?_id=265d351456e157e65ba1df00baf8c10d )', -> it 'Dcoument Updateのフィードにitemが20個入って返ってくる', (done) -> loadPipes 'http://pipes.yahoo.com/pipes/pipe.run?_id=265d351456e157e65ba1df00baf8c10d&_render=rss', (items) -> assert items.length is 20 done() describe 'TwitterUserFeed (http://pipes.yahoo.com/laiso/twitter_user_feed )', -> it '@nodejsのフィードにitemが20個入って返ってくる', (done) -> loadPipes 'http://pipes.yahoo.com/pipes/pipe.run?_id=c2e8fd12a3c7c90294be218f5d906466&_render=rss&screen_name=nodejs', (items) -> assert items.length is 20 done() # helpers request= require('request') cheerio = require('cheerio') loadPipes = (url, next) -> request url, (error, response, body) -> if (!error && response.statusCode == 200) $ = cheerio.load body next $('item')
テスト実行
npm test で実行できるようにする。外部サーバーにアクセスするのでタイムアウトをデフォルトの10倍ぐらいにしておく。XUnit形式のレポートを吐かせる。
// package.json "scripts":{ "test": "./node_modules/.bin/mocha -t 20000 --compilers coffee:coffee-script *.coffee -R xunit > report.xml" }