Upgrade to Capistrano 3.0

# はじめに

![capistrano](http://www.capistranorb.com/images/CapistranoLogo.png)

「[Capistrano](https://github.com/capistrano/capistrano) のバージョンが上がったので使おうとしたら丸一日ハマっていた。」
「な…　何を言ってるのか　わからねーと思うが (ry」

### Table of Contents

1. Gemfile
2. cap install
3. Capfile
4. config/deploy.rb
5. config/deploy/production.rb | staging.rb
6. 参考文献

基本的な使い方などは[README](https://github.com/capistrano/capistrano/blob/master/README.md)を読んでください。
まあ、読んでてもアレだったんですけどね。

# Gemfile

Capistranoはどのような言語やフレームワークからでも利用可能」by [公式サイト](http://www.capistranorb.com/)とのことで、もはやRailsだけのものではありません（以前からですけど）。
よって、本体とは別に、プラグイン形式でGemを追加していきます。

``` ruby
group :development do
  # ...
  gem 'capistrano'
  gem 'capistrano-rails'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  # ...
end
```

`capistrano-rails`に気づかずにエラーと戦っている場合があるので、気をつけてください。

capistrano 2.x時代に`capistrano_colors`をもし使っているなら、もう必要ないので、削除してください。

# cap install

`cap install`により以下のファイルが生成されますが、上書き保存されてしまうので、それぞれ別名で保存しておくことをおすすめします。

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

# Capfile

なんとなく存在していた`Capfile`ですが、今回のアップデートでは中身がガラッと変更されました。

以下がデフォで生成されます(2013-10-10現在)

``` ruby
# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'

# Includes tasks from other gems included in your Gemfile
#
# For documentation on these, see for example:
#
#   https://github.com/capistrano/rvm
#   https://github.com/capistrano/rbenv
#   https://github.com/capistrano/chruby
#   https://github.com/capistrano/bundler
#   https://github.com/capistrano/rails/tree/master/assets
#   https://github.com/capistrano/rails/tree/master/migrations
#
# require 'capistrano/rvm'
# require 'capistrano/rbenv'
# require 'capistrano/chruby'
# require 'capistrano/bundler'
# require 'capistrano/rails/assets'
# require 'capistrano/rails/migrations'

# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
```

これを私は以下のように変更しました。

``` ruby
# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'

require 'capistrano/rbenv'

set :rbenv_type, :user # or :system, depends on your rbenv setup
set :rbenv_ruby, '2.0.0-p247'

require 'capistrano/bundler'
require 'capistrano/rails'

# Loads custom tasks from `lib/capistrano/tasks' if you have any defined.
Dir.glob('lib/capistrano/tasks/*.cap').each { |r| import r }
```

# config/deploy.rb

2.x時代のdeploy.rb を使いまわすことは出来ません。
cap install にて生成されるものをベースに組み立てるのが吉です。

微妙に設定項目名が変更されているので、古いものと見比べながら設定して行きます。
このとき、一点、重要な変更が。

以前は`set :application`したものをローカル変数`application`として使えたのですが、今回からは`fetch(:application)`という形で呼び出します。

コレ非常に重要。

### passengerユーザの場合

``` ruby
namespace :deploy do

  desc 'Restart application'
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      # Your restart mechanism here, for example:
      execute :mkdir, '-p', release_path.join('tmp') # <= これを追加する
      execute :touch, release_path.join('tmp/restart.txt')
    end
  end
  # ...
end
```
デプロイ時に、なぜか`tmp`ディレクトリを生成しないので、（誰かのプルリクエストが適用されるまでは）tmpディレクトリを作成するように追記しておくと良いです。

# config/deploy/(production.rb|staging.rb)

これも生成されたファイルをよく読んでください。
難しくありません。ただ、`fetch(:user)`など、変数の呼び出しに注意してください。

# 参考文献

- [公式サイト](http://www.capistranorb.com/)
- [Capistrano/capistrano - github](https://github.com/capistrano/capistrano)

# 最後に

capistranoはrailsのものだけじゃない、ということをよく理解させてくれるようなアップデートでした。
`capistrano-rails`というカタチで外出しされているのはとても良いことですね。

`database.yml`のsymlinkとか、migrationとかをサラッとやってくれるので助かります。
皆さんもぜひ、capistranoをv3.0にアップデートしましょうね！