View on GitHub

akkunchoi.github.com

capistrano

暫定まとめ。

Rails のデプロイ

RAILS_ENVを忘れたり、assets:precompileを忘れたりして無駄に時間を使ってしまうことが多いので、capistranoを使うようにしました。 大げさかなと思ってあまり積極的ではなかったですが、セットアップも簡単で、1コマンドで本番リリースできるので導入して良かったです。

以下導入手順です。

まずはGemに追加し、インストールする。

# Gemfile
group :development do
  gem 'capistrano'
  gem 'capistrano-ext'
  gem 'capistrano_colors'
end      

初期化を実行。Capfileが作成される。

$ bundle exec capify .

Capfileを編集する。

# Capfile
# assets pipelineを使う場合はコメントを外す
load 'deploy/assets'

よく config.assets.precompile にファイルを追加するのを忘れて泣く。。

config/deploy.rbを作成する。

# config/deploy.rb
require "bundler/capistrano"

set :application, "sample"
set :repository,  "myuser@example.com:sample.git"
set :scm, :git
set :branch, :master

set :git_enable_submodules, 1

role :web, "example.com"                          # Your HTTP server, Apache/etc
role :app, "example.com"                          # This may be the same as your `Web` server
role :db,  "example.com", :primary => true # This is where Rails migrations will run

set :user, 'myuser'
set :use_sudo, false

set :rails_env, 'production'
set :deploy_to, "/var/www/#{application}"

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

after "deploy:update_code", :role => [:app] do
  run "cp #{release_path}/config/database.yml.sample #{release_path}/config/database.yml"
end

# if you want to clean up old releases on each deploy uncomment this:
after "deploy:restart", "deploy:cleanup"

初期化してディレクトリを作成する。

$ cap deploy:setup

deploy:cold すると、db:migrate が実行される。

$ cap deploy:cold

普段のデプロイはこっちでいい。coldとの違いはよくわかっていない。

$ cap deploy

データベースファイルの設定が違う場合はどうなるんだろう??

デプロイ先のディレクトリはこんな感じになります。

/
|-- current/  => 特定のreleaseにシンボリックリンク
|-- releases/
|     |-- 20130130160241/
|     |-- 20130123040226/
|     `-- ....
`--shared/
      |-- assets
      |-- bundle
      |-- log
      |-- pids
      `-- system