Thanks Driven Life

日々是感謝

RRRSpec を試してみた (ついでに on Docker)

経緯

補足ブログにもある通り RRRSpec が全てのケースにおいて有用というわけではないですが、 携わっているプロダクトに使えそうならそれはそれでいいなと思って、まずは動作までを試してみました。

rrrspec/local_test を実行してもなんかうまくいかなかったので、 server や worker などしっかり立てて実行してみようと思い、それならばと勉強中の Docker で行いました。

gongo/docker-rrrspec-example · GitHub

結論から言うと、細かい部分がまだできてませんが、ひとまずテスト実行&結果確認まではできたっぽいです

各コンテナについて

$ ls docker-rrrspec-example/containers
base    client  mysql   project redis   server  volume  web     worker

HACKING.md を見たり「とりあえず実行」を繰り返した結果、これらのコンテナを用意しました。

  • mysql, redis
    • taskset や queue とかを持ってるっぽい
  • master, worker
    • rrrspec-serverとして動作する
  • client
    • rrrspec-client として動作する
  • volume
  • web
    • テスト結果が web で見れる? rrrspec-web サーバ

実行してみる

ちなみに今回は boot2docker on OS X Mavericks という環境で作成しました。きっと CoreOS とか Docker on Ubuntu とかでもきっと大丈夫だと思います。多分。

コンテナ作成

$ git clone https://github.com/gongo/docker-rrrspec-example.git
$ cd docker-rrrspec-example
$ ./build.sh

コンテナ起動

$ ./run.sh

これで client コンテナ以外が起動します。worker の数を変更したければ ここらへん を変える感じで

テスト実行してみよう

run.sh で一緒に client コンテナを起動→テスト実行してもよかったのですが、せっかくなのでここは手でやっちゃいました。

$ docker run -i -t \
             --volumes-from rrrspec-volume \
             --link rrrspec-redis:cache \
             --link rrrspec-mysql:db \
             example/client /bin/bash

これで client コンテナを起動&ログインできるので

# rrrspec-client start --rsync-name ''

と実行するとテストが始まります

テスト結果を見てみよう

# rrrspec-client actives

と実行して rrrspec:tasksets:... みたいなのが表示されなければ、テストは完了しているので run.sh で一緒に起動しているはずの web コンテナ (http://localhost:9292) にアクセスします

※ 余談ですが、boot2docker で起動したコンテナにはホスト(OSX)からは直接アクセスできないので、よくある感じで port forwading しました https://github.com/dotcloud/docker/issues/4007#issuecomment-35246612

web コンテナの Web ページを見ると

f:id:gongoZ:20140331234753p:plain

f:id:gongoZ:20140331234802p:plain

といった感じで結果が見れます。う、うごいてるっぽい?

補足説明

MySQL ではなく SQLite3 を使おうとしたんだけど

rrrspec/local_test/rrrspec_servers.rb を参考に、最初は SQLite3 を使おうとしましたが、rrrspec-server/lib/rrrspec/server/persister.rb で「SQLite3 に UNIX_TIMESTAMP はねえ」っと怒られたので、MySQL に落ちつきました

なんで worker だけ bundle exec しているのか

containers/worker/Dockerfile ここですね。client や server と違って、worker だけは bundle exec 前提 になっていた感じなので。そういう意味では逆に全部 bundle exec で揃えてもよかった

client 実行時の --rsync-name '' ってなに

このオプションを入れないと rrrspec-client/lib/rrrspec/client/support.rbnil は無理だわーってエラーでちゃったので…。どういう用途の値なのかちょっとわからなかったので空文字で逃げました。

なんでさっきのテスト結果、全部 failed なの

わからん 。なんか実行の仕方違うのかな…。もしかしたら前述の rsync-name を適正にしたらよかったり?

あと、今の rrrspec-client-config.rb の設定がわるいのか、 テスト全部通った時だけなぜかテストが終わらない という日本語でおkの現象になりました。具体的に言うといつまでも rrrspec-client actives で表示され続ける感じ。よくわかってません。


追記

この修正 したらそれっぽい画面になった

FAILED あり

f:id:gongoZ:20140401061653p:plain

全部 SUCCESSED なテストもできた

f:id:gongoZ:20140401062250p:plain

stdout/stderr がまだ表示されてなかったりするけど、とりあえず結果が見えるだけでもだいぶテンションあがる

まとめ

  • Docker の勉強になった。もっといい感じの書き方があれば是非
  • RRRSpec 、私が携わっているプロダクトにすぐ載せるというのはやはり難しいが、未来を感じた(ク社の人達にしては現在なのだが)のでとても良い
  • RRRSpec に詳しいかた、ここはこういう設定するのが正しいぜ、みたいなのがあれば是非