ChefのCookbookの開発保守効率向上のために、
Jenkinsによる自動テスト・CIを最近始めましたが、
色々やりながらちょっとずつ試して、
やっと「コレだ!」と思える構成とフローができました。
その全体像は別で述べたいと思いますが、
その中でやっている、テスト実行の高速化が上手くいったのでその話を。
Cookbookの開発で一番ネックになるのはやはりテストで、
- テスト環境の立ち上げ
- Cookbook適用
- テスト実行
で、一回の実行にけっこう時間がかかる訳です。
git pushをJenkinsでフックして自動実行→終わったら通知
となって待たなくて良くなったとはいえ、できる限り早く結果は知りたい。
まず、Virtualbox仮想環境→コンテナ環境でテスト環境の立ち上げを高速化。
そもそも僕の場合はCI環境はEC2仮想サーバなので、
Virtualboxは使えないのですが、
LXCではなく、一応Macでも同じ方法でテストできるDockerを選択しました。
その上で、Dockerのコンテナ配置場所を
SSDインスタンスのエフェメラルディスクをRAID0で組んでマウントすることで、
さらに高速化することができました。
Dockerやtest-kitchen,kitchen-dockerのインストール方法及びAWSの操作は本筋とそれるので割愛します。
2014.04.17 /var/lib/docker/containers→/var/lib/dockerに修正しました。
/var/lib/docker/containersだと、
起動時にEBS領域から切り取られてコンテナ用のファイルシステムが作られてしまいます。
RAID組んでDockerのコンテナ配置場所にマウントするのはこんな感じです↓
# mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/xvdb /dev/xvdc
# mkfs.ext4 /dev/md0
# mount /dev/md0 /var/lib/docker
※インスタンスタイプがc3.lergeの例なので、エフェメラルディスクは2つ
※HVM AMIを選択すること
※エフェメラルディスクは起動時に割り当てが必要
エフェメラルディスクのRAID設定はよく使いそうなので、
「それこそChefの出番だろ」と思ってコチラも作ってはみたのですが、
Stop→StartでRAIDの設定消えたり、
RebootではRAIDの設定は残るけど、RAIDデバイスの名前が変わったりで、
上手くいかない場合があって試行錯誤中です…
とりあえず試作品です。上手くいったらLWRPで手軽に使える感じにしたいです。
これをやることで、以下のような結果が得られました。
測定に使用したCookbookはコチラです。
EBS
Chef Client finished, 52/60 resources updated in 292.319082057 seconds
Kitchen is finished. (5m44.96s)
Ephemeral disk RAID0
Chef Client finished, 52/60 resources updated in 220.907645243 seconds
Kitchen is finished. (4m37.20s)
iMac(2011 mid)で10分以上、さくらVPS2GBプラン(個人ではAWSまだ高いw)で、
8分ほどかかる特別時間のかかるCookbook(wなので、
かなり良い結果と言えるのではないでしょうか:-)
2014.04.17 追記:
上述したように、/var/lib/docker/containersだと、
起動時にEBS領域から切り取られてコンテナ用のファイルシステムが作られてしまっていることが発覚しましたが、
変更してEphemeral disk上になるようにしても優位な結果が得られませんでした。
上の比較で優位な結果が出たのは、起動直後のEBSは性能が悪い聞いたことがあるので、
そういう類で差がついたものと思われます。
全然別件ですが、もしChefネタなので一応宣伝。
札幌に在住の方がもし居ましたら、
こんなんやりますので、ご興味あればどうぞ。
Chef Meetup Sapporo