Capistranoとcapistrano-ext

CapistranoRubyで作られたデプロイツールです。Railsを作った37signalsという企業で、自分たちが使うための実用的なツールとして作られました。Railsと相性がよいのはもちろんですが、Capistrano自体は汎用的なデプロイツールとして作られています。

capistrano-extはCapistranoを、簡単に複数の環境を扱えるように拡張します。開発の現場ではよく、ステージング環境(本番そっくりに作られた本番とは別の環境)と本番環境を切り替えて使いますが、capistrano-extを使うと共通の設定はconfig/deploy.rbに、環境毎の設定はconfig/deploy/staging.rbとconfig/deploy/production.rbに書くことができるようになります。

では、さっそく使ってみましょう。インストールにはRubyGemsを使います。

$ sudo gem install capistrano
$ sudo gem install capistrano-ext
$ gem list
capistrano (2.5.18)
capistrano-ext (1.2.1)

デプロイ用設定ファイルを作るために$RAILS_ROOTに移動します。

$ cd myapp
$ capify .
[add] writing './Capfile'
[add] writing './config/deploy.rb'
[done] capified!

Capfileはデフォルトのレシピを読み込んだり、config/deploy.rbを読み込むためのファイルです。通常、Capfileを書き換える必要はありません。

FILE : Capfile

load 'deploy' if respond_to?(:namespace) # cap2 differentiator
Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }

load 'config/deploy' # remove this line to skip loading any of the default tasks

capistrano-extを使う場合、config/deploy.rbには共通の設定だけを残します。デプロイ先やロールが環境毎に異なる場合、これらの設定はconfig/deploy/staging.rbやproduction.rbに移動します。

FILE : config/deploy.rb

require 'capistrano/ext/multistage'

set :application, 'myapp.mydomain.com'                       # アプリケーション名
set :repository, 'git+ssh://mydomain.com/var/git/myapp.git'  # リポジトリのアドレス

set :scm, :git          # SCM、省略するとSubversion
set :user, 'myuser'     # SSHで接続するときに使うユーザー名
set :use_sudo, false    # sudoコマンドを使わない
set :deploy_via, :copy  #

def restart_file
  File.join(current_path, 'tmp', 'restart.txt')
end

namespace :deploy do
  task :restart, :roles => :app do
    run "touch #{restart_file}"
  end
end

config/deploy/staging.rbやproduction.rbには環境毎の設定を記述します。

FILE : config/deploy/staging.rb

set :branch, 'staging'                     # SCM上のブランチ名
set :rails_env, 'staging'                  # Rails上の環境名
set :deploy_to, '/var/www/myapp/staging/'  # デプロイ先の絶対パス

[:web, :app].each do |type|
  role type,
  'staging.myapp.mydomain.com'
end

role :db, 'staging.myapp.mydomain.com', :primary => true  # rake:db:migrateを実行するサーバー

ここで誤解しがちなのが、

role :db, 'staging.myapp.mydomain.com', :primary => true

です。ロールの名前が:dbなのでついデータベースサーバーを指定したくなりますが、ここにはrake:db:migrateなど、データベース関係のタスクを実行するサーバーを指定します。

はじめてのデプロイを実行する前に、必要となるディレクトリをデプロイ先のサーバーに作成しておく必要があります。これには$RAILS_ROOTで以下のコマンドを実行します。

cap staging deploy:setup

これにより、デプロイ先のサーバーにSSHで接続して、以下のディレクトリが作成されます。

/var/www/myapp
/var/www/myapp/releases
/var/www/myapp/shared
/var/www/myapp/shared/log
/var/www/myapp/shared/pids
/var/www/myapp/shared/system

すべての準備が整ったら、デプロイしてみましょう。はじめてデプロイするときは以下のコマンドを実行します。

cap staging deploy:cold

これにより、デプロイ先のサーバーに最新のソースコードが配置され、migrationを実行した後、myappが起動(再起動)されます。

re: Capistranoでアプリケーションのデプロイ作業を効率化