Rails で Capistrano

Capistrano の基本的な使い方 が分かったので、今度は Rails App での Capistrano の利用を見てみたい。

前提条件

まず、利用にあたり、前提条件は以下。

  • Ruby on Rails APP をデプロイしたい
  • Subversion を利用している
  • プロダクション先は決定している
    • ソフトウェア, DBMS サーバ
  • Subversion レポジトリとデプロイ環境のユーザ名が同一
  • Subversion レポジトリはローカルホストからも、デプロイ先のサーバからもアクセス可能
  • ターゲットホストには公開鍵を使い ssh 経由でアクセスできること
  • データベースが作成され、APP が利用するユーザ名でクエリ発行可能な状態になっていること

Capistrano 初期設定

Rails APP で Capistrano を利用するにあたり、

  • Capfile を APP の ルートディレクトリに設置
  • デプロイに関する基本設定を記述する config/deploy.rb を用意

する。これらのスタブファイルを capify コマンドで作成する。

# capify .
[add] writing `./Capfile'
[add] writing `./config/deploy.rb'
[done] capified!

"cap -T" コマンドで、この初期設定により利用可能になるタスクの一覧 (多くはデプロイに関連するもの) を見ることができる。

# cap -T
cap deploy               # Deploys your project.
cap deploy:check         # Test deployment dependencies.
.......
Extended help may be available for these tasks.

"cap -e" で各タスクの詳細な説明を見ることができる。

# cap -e deploy:symlink                                                                                                     
------------------------------------------------------------
cap deploy:symlink
------------------------------------------------------------
Updates the symlink to the most recently deployed version. Capistrano works by
putting each new release of your application in its own directory. When you
deploy a new version, this task's job is to update the `current' symlink to
point at the new version. You will rarely need to call this task directly;
instead, use the `deploy' task (which performs a complete deploy, including
`restart') or the 'update' task (which does everything except `restart').

プロジェクトの詳細を設定

capify により以下のような config/deploy.rb が生成される。

set :application, "set your application name here"
set :repository,  "set your repository location here"

# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}"

# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion

role :app, "your app-server here"
role :web, "your web-server here"
role :db,  "your db-server here", :primary => true

上記の引数を、プロジェクトの設定に書き換える。
Capistrano はデフォルトでは /path/to/yourapp/ にデプロイする。
デプロイ先が元のディレクトリと異なる場合には、deploy_to 変数をセットする。

set :deploy_to, "your deploy_to directory"

ゲートウェイ

セキュリティ上、ゲートウェイを設定したい場合は、config/deploy.rb にて以下のようにゲートウェイサーバを指定する。

set :gateway, "your_gateway_server"

spin ファイルの設定

以下、3001 番ポートでの Mongrel デーモンを仮定する。
script/process/spawner を呼出す spin スクリプトを書き、script ディレクトリ以下に配置する。
まず、script/spin ファイルを作成し、以下のように記述する。

#!bin/sh
/path/to/yourapp/script/process/spawner -p 3001 -i 1

実行権限を与える。

#chmod u+x script/spin

これにより、script/spin で Mongrel を起動、再起動が可能になる。
複数の Mongrel プロセスを立ち上げる場合には、spin ファイルは以下のようになる。

/path/to/yourapp/script/process/spawner -p 3001 -i 3

これで、3 Mongrel プロセスが起動する。

セットアップ

Capistrano 最初のコマンドを発行する。

# cap deploy:setup
  * executing `deploy:setup'
  * executing "umask 02 && mkdir -p /home/haida/ /home/haida/releases /home/haida/shared /home/haida/shared/system /home/haida/shared/log /home/haida/shared/pids"
    servers: ["your_app_server"]
  * establishing connection to gateway `your_gateway_server'
    starting connection to gateway `your_gateway_server'
    gateway connection established
  * establishing connection to `your_app_server' via gateway
    connected: `your_app_server' (via gateway)
    [your_app_server] executing command
    command finished

Capistrano はサーバにログインし、以下のようなディレクトリ階層を作成する。

#{deploy_to}/
#{deploy_to}/releases
#{deploy_to}/shared
#{deploy_to}/shared/log
#{deploy_to}/shared/system
#{deploy_to}/shared/pids

依存関係のチェック

Capistrano のデプロイに必要なソフトウェアが全てインストールされているか、以下のコマンドで確認する。

# cap -q deploy:check
You appear to have all necessary dependencies installed

実際に deploy:check タスクが何をしているかは -q (Quiet オプション) を取って実行すると確認できる。

Cold デプロイ

初期のデプロイ時には APP はまだ走っていない "cold" 状態。そこで "cold" タスクを実行する。

# cap deploy:cold

このタスクはコードをサーバに移動し、マイグレーション、spin スクリプトを実行する。
これ以降の deploy は

# cap deploy

で実行する。

ロールバック

ひとつ前のリリース状態には以下のコマンドで簡単に戻せる。

# cap deploy:rollback