DockerCli-Driver + LocalShell-Provisoner(Itamae) + Shell-Verifier(Serverspec)でTest-Kitchen最速フロー

前回の[「Test-KitchenでShell-VerifierとDockerCli-Driverで高速にServerspecテストを回す」](http://qiita.com/Marcy/items/8a85ae78a21787f57bca)の続きっちゃ続きです。

# 要は
Dockerで起動時間を限りなく小さくし、テストをローカルから叩いてテスティングフレームワークのインストール時間を削るまでできたら、あとはもう、プロビジョニングツールのインストール時間すら削ることができれば、ほぼプロビジョニングとテストの実行時間のみの最速なワークフローが組めるよねって話です。
Chefだと、どうやってもインストールから逃れることは不可能なので、ここはItamaeで行きましょう。

# ということでやってみる

LocalShell-ProvisonerはShell-Verifierのほぼ丸パクリで作りましたｗ
（もちろん、作者の許可は取ってます）
https://github.com/marcy-terui/kitchen-provisioner-local_shell

こんな感じで。

```rb:Gemfile
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のオーソドックスっぽい版
- [前回](http://qiita.com/Marcy/items/8a85ae78a21787f57bca)の最速からChef→Itamaeになってる感じで、DockerCli-Driver + Shell-Verifier版

なので、こんな感じ。

```yaml:.kitchen.yml
---
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
```

レシピやテスト内容は[前回](http://qiita.com/Marcy/items/8a85ae78a21787f57bca)と全く一緒ですので割愛します。

## Vagrant-Driver + Itamae-Provisioner + Busser-Verifier

```shell-session
$ 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)

```shell-session
$ 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)

```shell-session
$ 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`オプションが全く効いてなくて色々出力されちゃってますがｗ

# まとめ
まあ、当たり前っちゃ当たり前なんですが、Dockerで起動も数秒（というかほぼ1秒未満）になり、プロビジョニングフレームワークのインストールもテストの準備も既にできてるローカルから叩かせることで実質ほぼプロビジョニングとテスト実行の時間だけで済むようになります。

何もかも全部１からやる必要ないと思うので、効率も考えて上手くプラグインを組み合わせるとよいんじゃないでしょうか。YAMLで簡易に記述できて、プラグインの組み合わせで良い感じにできるのがTest-Kitchenの価値だと思います。