前回の「Test-KitchenでShell-VerifierとDockerCli-Driverで高速にServerspecテストを回す」の続きっちゃ続きです。
要は
Dockerで起動時間を限りなく小さくし、テストをローカルから叩いてテスティングフレームワークのインストール時間を削るまでできたら、あとはもう、プロビジョニングツールのインストール時間すら削ることができれば、ほぼプロビジョニングとテストの実行時間のみの最速なワークフローが組めるよねって話です。
Chefだと、どうやってもインストールから逃れることは不可能なので、ここはItamaeで行きましょう。
ということでやってみる
LocalShell-ProvisonerはShell-Verifierのほぼ丸パクリで作りましたw
(もちろん、作者の許可は取ってます)
https://github.com/marcy-terui/kitchen-provisioner-local_shell
こんな感じで。
source "https://rubygems.org"
gem 'test-kitchen'
gem 'kitchen-verifier-shell'
gem 'kitchen-provisioner-local_shell'
gem 'kitchen-docker_cli'
gem 'kitchen-vagrant'
gem 'serverspec'
gem 'docker-api'
gem 'kitchen-itamae'
gem 'itamae', '>= 1.3.3'
Itamaeだけバージョン指定入ってますが、これを試そうと思ったらちょっとしたバグというか上手くいってない部分を見つけたので、PR送りました。これが入ったのが 1.3.3 です。
また、今回の比較対象は kitchen-itamae
を使って、インスタンス内にItamaeをインストールして実行するスタイルの以下と比較します。
- Vagrant-Driver + Busser-Verifierのオーソドックスっぽい版
- 前回の最速からChef→Itamaeになってる感じで、DockerCli-Driver + Shell-Verifier版
なので、こんな感じ。
---
platforms:
- name: ubuntu-14.04
suites:
# Vagrant-Driver + Itamae-Provisioner + Busser-Verifier
- name: example1
provisioner:
name: itamae
driver:
name: vagrant
run_list:
- recipes/default.rb
# DockerCli-Driver + Itamae-Provisioner + Shell-Verifier
- name: example2
provisioner:
name: itamae
driver:
name: docker_cli
transport:
name: docker_cli
run_list:
- recipes/default.rb
verifier:
name: shell
command: ./bin/rspec test/integration/docker_cli/serverspec/example_spec.rb
# DockerCli-Driver + LocalShell-Provisioner + Shell-Verifier
- name: example3
provisioner:
name: local_shell
command: ./bin/itamae docker kitchen/recipes/default.rb --container=$KITCHEN_CONTAINER_ID
driver:
name: docker_cli
transport:
name: docker_cli
run_list:
- recipes/default.rb
verifier:
name: shell
command: ./bin/rspec test/integration/docker_cli/serverspec/example_spec.rb
レシピやテスト内容は前回と全く一緒ですので割愛します。
Vagrant-Driver + Itamae-Provisioner + Busser-Verifier
$ time ./bin/kitchen test example1 -l warn
>>>>>> wget, curl, fetch, perl or python not found on this instance.
real 3m56.800s
user 0m8.726s
sys 0m3.052s
約4分。kitchen-itamae
はChefのオムニバスインストーラで入るRubyを使ってItamaeをインストール・実行してるのでChefインストール時間 + Itamaeインストール時間なので、もう少し遅いかと思いましたが、なかなか速いですね。
DockerCli-Driver + Itamae-Provisioner + Shell-Verifier(Serverspec)
$ time ./bin/kitchen test example2 -l warn
>>>>>> wget, curl, fetch, perl or python not found on this instance.
.
Finished in 7.07 seconds (files took 0.61411 seconds to load)
1 example, 0 failures
real 2m30.228s
user 0m4.245s
sys 0m1.049s
ふむ。こちらは予想通りと言った感じです。まあ、だいぶ速いですね。
DockerCli-Driver + Shell-Provisioner(Itamae) + Shell-Verifier(Serverspec)
$ time ./bin/kitchen test example3 -l warn
INFO : Starting Itamae...
INFO : Recipe: /Users/marcy/github/high-speed-infra-ci/kitchen/recipes/default.rb
INFO : execute[apt-get update -y] executed will change from 'false' to 'true'
INFO : package[nginx] installed will change from 'false' to 'true'
INFO : Image created: edc827fdb43070818b41383cdfd9c6cb7aba0d67b98a0bd9cd90fcda138c61f0
.
Finished in 4.52 seconds (files took 0.31834 seconds to load)
1 example, 0 failures
real 1m9.589s
user 0m3.420s
sys 0m0.676s
1分キタ━(゚∀゚)━!
これはもうコーヒー入れる時間は完全にありませんね。
Provisionerに-l
オプションが全く効いてなくて色々出力されちゃってますがw
まとめ
まあ、当たり前っちゃ当たり前なんですが、Dockerで起動も数秒(というかほぼ1秒未満)になり、プロビジョニングフレームワークのインストールもテストの準備も既にできてるローカルから叩かせることで実質ほぼプロビジョニングとテスト実行の時間だけで済むようになります。
何もかも全部1からやる必要ないと思うので、効率も考えて上手くプラグインを組み合わせるとよいんじゃないでしょうか。YAMLで簡易に記述できて、プラグインの組み合わせで良い感じにできるのがTest-Kitchenの価値だと思います。