Capistranoの使い方メモ

デプロイ周りは苦手なので備忘録として残しておきます。Capistranoを用いたRailsアプリケーションのデプロイ方法のメモです。

詳しくは以下のページに細かく載っているので、それがちゃんと理解できれば問題ないと思います。

[入門 Capistrano 3 ~ 全ての手作業を生まれる前に消し去りたい](http://labs.gree.jp/blog/2013/12/10084/)

[Capistrano3のデプロイフレームワークの使い方](http://qiita.com/yuku_t/items/01c0ec4389db143e27f5)

[Capistrano3におけるRailsのデプロイタスクの内部実装](http://qiita.com/yuku_t/items/78f32d6e5d21aee4e745)

[Ruby初心者のCapistranoデプロイ入門](http://shusatoo.net/programming/ruby/ruby-beginner-capistrano-deploy/)

此処から先は上のリンクを踏まえた上での自分なりの理解です。

## 初期化

capistranoを使うときにはじめにやるコマンドは以下です。

```zsh
$ bundle exec cap install
```

作られるファイルは以下です。

`Capfile`
`config/deploy.rb`
`config/deploy/production.rb`
`config/deploy/staging.rb`

Capfileにcapistranoのplugin等をrequireしていきます。deploy.rbには共通の設定を書き、production.rbやstaging.rbには各環境に特化した設定を書きます。


## デフォルトのタスク

`Capfile` で、


```rb
require 'capistrano/deploy'
```

で読み込みを行っていれば、デフォルトでnamespaceがdeployのタスクが読み込まれます。

`capistrano/deploy` では `capistrano/framework` が読み込まれています。

https://github.com/capistrano/capistrano/blob/master/lib/capistrano/tasks/deploy.rake

`capistrano/framework` の実装を見ると細かいタスクの実装は定義されておらず、deployタスクで実行する順番が定義されているようです。

https://github.com/capistrano/capistrano/blob/master/lib/capistrano/tasks/framework.rake

空のタスクを上書きすることにより、デプロイの設定の詳細を記述しています。


順番としては

1. deploy:starting
	1. deploy:print_config_variables
	2. deploy:check
		1. deploy:check:directories
		2. deploy:check:linked_dirs
		3. deploy:check:make_linked_dirs
		4. deploy:check:linked_files
	3. deploy:set_previous_revision
2. deploy:started
3. deploy:updating
	1. deploy:set_current_revision
	2. deploy:symlink:shared 
		1. deploy:symlink:linked_files
		2. deploy:symlink:linked_dirs  
4. deploy:updated
5. deploy:publishing
	1. deploy:symlink:release 
6. deploy:published
7. deploy:finishing
	1. deploy:cleanup_rollback 
8. deploy:finished
	1. deploy:log_revision 

のような感じです。

デフォルトではRailsに関するタスクはないので、

```rb
require 'capistrano/rails'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
```

で読み込むことでmigrationやassetsに関するタスクが追加されます。

## 設定を書く・タスクを書く

共通の設定を `deploy.rb` に書いていきます。

`set` を使用して固有の設定を書きます。

設定については公式のドキュメントを読むのが一番良いです。

[Configuration](http://capistranorb.com/documentation/getting-started/configuration/)


デフォルトのタスク意外にタスクを追加する際は、以下のように書いていきます。

```rb
namespace :hoge do
  task :fuga do
    # ...
  end
end
before 'deploy:starting', 'hoge:fuga'
```

上記のタスクは `deploy:starting` タスクの前に `hoge:fuga` タスクを実行するように書いています。 `before` はcapistranoのDSLで、第一引数で指定したタスクの前に第二引数のタスクを実行するというように使います。 `before` の他にも `after` があり、`capistrano/deploy` で読み込んだデフォルトのタスクにいろいろ追加していくことでデプロイのタスクを作り込んでいきます。

`before`や`after`を多用するとタスクの実行順序がわかりにくくなるため、タスクの上書きが行えるのであれば上書きで対応するのが良さそうです。

タスクの上書きは

```rb
Rake::Task["deploy:migrate"].clear_actions
```

のようにタスクをクリアします。Capistranoの2系列では同名のタスクは上書きできたようですが、3系列で仕様が変わったようです。

[Overriding Capistrano tasks](http://capistranorb.com/documentation/advanced-features/overriding-capistrano-tasks/)

## 実行する

設定やタスクが書き終えたら実行できるか `dry-run` で試します。

`bundle exec cap デプロイする環境　実行するタスク オプション`

```zsh
$ bundle exec cap production deploy --trace --dry-run
```

`--trace` はタスクが出力されるオプションです。 `--dry-run` は実際に動かすかテストできるオプションです。

これでうまくタスクの実行を確認できれば一旦ステージングで試した後、プロダクションでも実行することが可能になると言えると思います。