経緯
以前 parallel_testsで調子乗って -n 30 とかしたらマシンが死んだ記憶が甦ってきたので、このアプローチに移動しないといけない / “分散テスト実行システムRRRSpecをリリースしました | クックパッド開発者ブ…” http://t.co/SMjoNnh92R
— Wataru MIYAGUNI (@gongoZ) 2014, 3月 24
補足ブログにもある通り 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
- worker がテストコードとかを持ってくる用の rsync サーバ想定
- 今回は Data Container として動かしており、各コンテナからは
/path/to/project
にマウントされてる扱いにしている。参考: Docker でデータのポータビリティをあげ永続化しよう - Qiita
web
- テスト結果が web で見れる?
rrrspec-web
サーバ
- テスト結果が 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 ページを見ると
といった感じで結果が見れます。う、うごいてるっぽい?
補足説明
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.rb で nil は無理だわーってエラーでちゃったので…。どういう用途の値なのかちょっとわからなかったので空文字で逃げました。
なんでさっきのテスト結果、全部 failed なの
わからん 。なんか実行の仕方違うのかな…。もしかしたら前述の rsync-name
を適正にしたらよかったり?
あと、今の rrrspec-client-config.rb の設定がわるいのか、 テスト全部通った時だけなぜかテストが終わらない という日本語でおkの現象になりました。具体的に言うといつまでも rrrspec-client actives
で表示され続ける感じ。よくわかってません。
追記
この修正 したらそれっぽい画面になった
FAILED あり
全部 SUCCESSED なテストもできた
stdout/stderr がまだ表示されてなかったりするけど、とりあえず結果が見えるだけでもだいぶテンションあがる
まとめ
- Docker の勉強になった。もっといい感じの書き方があれば是非
- RRRSpec 、私が携わっているプロダクトにすぐ載せるというのはやはり難しいが、未来を感じた(ク社の人達にしては現在なのだが)のでとても良い
- RRRSpec に詳しいかた、ここはこういう設定するのが正しいぜ、みたいなのがあれば是非