読者です 読者をやめる 読者になる 読者になる

Yahoo! Pipesで作ったパイプの動作をCloudBeesの無料Jenkinsホスティングから監視する

以前から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サービスもあってそっちの工夫のしようがありそう。

テストスクリプト

とりあえず以下で作ったパイプをテストに入れてみる。

実際のエンドポイントにアクセスして正常なフィードかどうかというのを、受け取ったレスポンスに20件のアイテムデータがあるかどうかで判断する。Yahoo! Pipes上でパースに失敗していた場合とかはここが0件になっているという算段。

テストフレームワークmocha。リクエストにrequestRSSのパースに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"
  }

動作イメージ

おさらい

以下がビルドセットのソースコード

laiso/pipes-test · GitHub