capistrano-itamaeというgemを作った

# このgemについて
[capistrano](http://capistranorb.com/) から [itamae](http://itamae.kitchen/) を実行するためのgemです

https://github.com/sue445/capistrano-itamae

[![rubygems](https://qiita-image-store.s3.amazonaws.com/0/8059/61f7d33f-4303-e28c-7c55-5cc4ad115869.png)](https://twitter.com/rubygems/status/754689614212980736)

---
# モチベーション
* capistranoとitamaeの2ヶ所でホスト情報を管理するのがつらくなったのでcapistranoからitamaeを呼べるようにした
  * capistranoで持ってるホスト情報をもとに `itamae ssh`
* 複数サーバにsshしてコマンド発行する時はcapistranoは便利

---
# 使い方
## 初期設定
それぞれ追加

```rb:Gemfile
group :development do
  gem "capistrano-itamae", require: false
end
```

```rb:Capfile
require "capistrano/itamae"
```

---
## 基本的な使い方
`on roles` の中で `itamae_ssh` メソッドを呼ぶだけ

```ruby
desc "Run itamae"
task :itamae do
  on roles(:all) do
    itamae_ssh "recipe.rb"
  end
end
```

実際に実行されるコマンド

```shell-session
itamae ssh cookbooks/recipe.rb --host=HOST 〜
```

ssh関係のパラメータ [^ssh_options] はcapistranoに設定済のものが自動で `itamae ssh`に渡される

[^ssh_options]: `--host`, `--user`, `--port`, `--key` など

---
## 複数のレシピを実行したい時
配列で渡す

```ruby
desc "Run itamae"
task :itamae do
  on roles(:all) do
    itamae_ssh ["recipe1.rb", "recipe2.rb"]
  end
end
```

実際に実行されるコマンド

```shell-session
itamae ssh cookbooks/recipe1.rb cookbooks/recipe2.rb --host=HOST 〜
```

---
## オプションを渡したい時（その1）
`:itamae_ssh_default_options` にセットすると全体に適用される

```ruby
set :itamae_ssh_default_options, "--node-yaml=node.yml"

desc "Run itamae"
task :itamae do
  on roles(:all) do
    itamae_ssh "recipe.rb"
  end
end
```

実際に実行されるコマンド

```shell-session
itamae ssh cookbooks/recipe.rb --node-yaml=node.yml --host=HOST 〜
```
---
## オプションを渡したい時（その2）
`itamae_ssh` の第2引数に渡すとその場所だけオプションが有効になる

```ruby
set :itamae_ssh_default_options, "--node-yaml=node.yml"

desc "Run itamae"
task :itamae do
  on roles(:all) do
    itamae_ssh "recipe.rb", "--dry-run"
  end
end
```

実際に実行されるコマンド

```shell-session
itamae ssh cookbooks/recipe.rb --node-yaml=node.yml --dry-run --host=HOST 〜
```

---
# itamae-templateとの差異
* [itamae-template](https://github.com/k0kubun/itamae-template) が `itamae local` [^itamae-local] 前提なのに対し、capistrano-itamaeは（今のところ） `itamae ssh` [^itamae-ssh] 前提なこと
  * `itamae local` だと `itamae ssh` に比べて速いんだけど、レシピ実行のための環境をサーバにセットアップする手間があって手間
  * アプリ実行に不要なものは極力サーバに入れたくない派
* itamae-templateだと雑にgemを入れて雑にレシピ実行するにはちょっと向いてない
* メリデメはあるので好きな方を使えばいいと思います

[^itamae-local]: サーバに入ってitamaeを実行
[^itamae-ssh]: sshごしにitamaeを実行

---
# まとめ
* capistranoとitamaeを一緒に使いたい時にご利用ください
  * 詳しいことはREADME参照

---
# おまけ：capistranoプラグインのインテグレーションテスト
今回の場合

* capistranoを適用したダミーアプリを用意して
* Vagrantで立てたVMに `cap deploy`
  * cap taskの中で `itamae_ssh`
* Serverspec実行
* [Wercker](http://wercker.com/) + [DigitalOcean](https://www.digitalocean.com/) でCI実行

---
## ディレクトリ構成
https://github.com/sue445/capistrano-itamae/tree/v0.1.0/spec/integration

```sh
spec/integration/
├── Capfile
├── Rakefile
├── Vagrantfile
├── config
│   ├── deploy
│   │   └── development.rb
│   └── deploy.rb
├── cookbooks
│   ├── memcached.rb
│   ├── node.yml
│   └── tmux.rb
└── spec
    ├── memcached_spec.rb
    ├── spec_helper.rb
    └── tmux_spec.rb
```

---
## インテグレーションテスト作った感想
[![リファクタリングする時にテストがある安心感ぱない](https://qiita-image-store.s3.amazonaws.com/0/8059/6fd4928f-07ff-dc23-afe6-b9a0725e8646.png)](https://twitter.com/sue445/status/753592162873290753)

安心感 :innocent: 

---
## 参考URL
* CapistranoのdeployタスクをVagrantマシンに適用して開発する - Qiita
  * http://qiita.com/sonots/items/c3d60a155094b839ea0f