CapistranoはRubyで作られたデプロイツールです。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でアプリケーションのデプロイ作業を効率化