Capistrano 2.1 利用法

Capistranoとは、アプリケーションの配布・再起動などを簡単に行えるツールです。CapistranoはRubyで作られており、簡単に拡張することができます。特にRuby on Railsとの相性がよく、サーバ名などを設定するだけで使用することができます。
Capistranoの解説記事はあちこちで見かけることができますが、最新の2.0系では利用方法が変わっており、以前の記事があまり役に立たなくなっています。今回、2.1で環境構築したので、その際に得たノウハウをまとめておきます。
使用した環境は以下の通りです。

  • Debian GNU/Linux Sarge
  • Ruby 1.8.6
  • RubyGems 0.9.2
  • Rails 1.2.3
  • Mongrel 1.0.1
  • Subversion 1.4.3
  • Capstrano 2.1.0

CapistranoはRubyGemsを使用してインストールします。その際にいくつかの関連パッケージが必要になります。以下のコマンドでCapistranoをインストールできます。

# gem install capistrano --include-dependencies
Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed capistrano-2.1.0
Successfully installed net-ssh-1.1.2
Successfully installed needle-1.3.0
Successfully installed net-sftp-1.1.0
Successfully installed highline-1.4.0
Installing ri documentation for net-ssh-1.1.2...
Installing ri documentation for needle-1.3.0...
Installing ri documentation for net-sftp-1.1.0...
Installing ri documentation for highline-1.4.0...
Installing RDoc documentation for net-ssh-1.1.2...
Installing RDoc documentation for needle-1.3.0...
Installing RDoc documentation for net-sftp-1.1.0...
Installing RDoc documentation for highline-1.4.0...


正常にインストールされた場合、capというコマンドが使えるようになります。このコマンドを使って、アプリケーションの配布などを行います。

$ cap --version
Capistrano v2.1.0


RailsにCapistranoを組み込むためには、capifyコマンドの第一引数にRailsプロジェクトのルートディレクトリを指定して実行してください。Capfileとconfig/deploy.rbの2つのファイルが作成されます。

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


CapfileとはmakeにおけるMakefileやrakeにおけるRakefileのようなものです。このファイルにはタスクを記述することができます。しかし、Rails用の基本的なタスクはすでに定義されているため、特に記述しないで利用することができます。追加タスクを作りたい場合や、既存のタスク内容を変更したい際に編集します。初期状態でのCapfileの内容は以下の通りです。

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


config/deploy.rbにはRailsの配布サーバやソース管理サーバなどを設定します。初期状態での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


applicationにはアプリケーション名を指定します。配布先のディレクトリ名などに利用されます。repositoryにはSubversionのリポジトリへのパスを指定します。アプリケーションの配布を行う際はここから取得されます。標準のアプリケーションの配布先は/u/apps/#{application}です。変更したい場合は、deploy_toに配布先のパスを設定します。scmにはソースコード管理システムの名称を指定します。標準ではSubversionになっていますが、この値を変更することによってCVSなどのソースコード管理システムを利用することができます。MicrosoftのVisual Source Safeには対応していないそうです。app・web・dbにはアプリケーションサーバ・ウェブサーバ・データベースサーバの名前、もしくはIPアドレスを指定します。
以上が標準的な設定ですが、他にもいくつか設定できる項目があります。残念ながらCapistranoはまだドキュメントが充実しておらず、ソースコードやコミュニティBBSから情報を集めるしかないようです。以下、便利そうなものをいくつか紹介します。

set :scm_user, "Your SCM user name"
set :scm_password, "Your SCM Password"


ソースコード管理システムにログインするユーザ名・パスワードを指定出来ます。

set :use_sudo, false


標準はtrue。コマンドを実行する際にsudoを利用しなくなります。レンタルサーバなのでsudoが利用できない場合に便利かと思います。

set :user, "Your user name"


サーバにログインする際のユーザを変更できます。

default_run_options[:pty] = true


標準はfalse。pseudo-ttyを利用するかどうか設定できます。バージョン2.1からpseudo-ttyを標準では利用しないようになったのですが、いくつかのサーバでは問題が発生することがあり、その際にはこのオプションをtrueに変更すると以前と同じ動作をするよ、ということのようです。

default_run_options[:shell] = false


標準はtrue。コマンドを実行する際にsh -c “コマンド”で発行するのですが、これを無効にすることが出来ます。
コマンド実行について
Capistranoのコマンドを実行する際にはcapというコマンドを使います。
まずはcap -Tでコマンドの一覧を確認します。

$ cap -T
cap deploy               # Deploys your project.
cap deploy:check         # Test deployment dependencies.
cap deploy:cleanup       # Clean up old releases.
cap deploy:cold          # Deploys and starts a `cold' application.
cap deploy:migrate       # Run the migrate rake task.
cap deploy:migrations    # Deploy and run pending migrations.
cap deploy:pending       # Displays the commits since your last deploy.
cap deploy:pending:diff  # Displays the `diff' since your last deploy.
cap deploy:restart       # Restarts your application.
cap deploy:rollback      # Rolls back to a previous version and restarts.
cap deploy:rollback_code # Rolls back to the previously deployed version.
cap deploy:setup         # Prepares one or more servers for deployment.
cap deploy:start         # Start the application servers.
cap deploy:stop          # Stop the application servers.
cap deploy:symlink       # Updates the symlink to the most recently deployed ...
cap deploy:update        # Copies your project and updates the symlink.
cap deploy:update_code   # Copies your project to the remote servers.
cap deploy:upload        # Copy files to the currently deployed version.
cap deploy:web:disable   # Present a maintenance page to visitors.
cap deploy:web:enable    # Makes the application web-accessible again.
cap invoke               # Invoke a single command on the remote servers.
cap shell                # Begin an interactive Capistrano session.
Some tasks were not listed, either because they have no description,
or because they are only used internally by other tasks. To see all
tasks, type `cap -Tv'.
Extended help may be available for these tasks.
Type `cap -e taskname' to view it.


cap deploy:setupで配布先サーバにCapistranoで必要なディレクトリを作成します。このコマンドは配布先サーバが変更、または増えた場合にも実行する必要があります。

$ cap deploy:setup
* executing `deploy:setup'
* executing "umask 02 && mkdir -p /home/hajime/production/nanigadeta /home/hajime/production/nanigadeta/releases /home/hajime/production/nanigadeta/shared /home/hajime/production/nanigadeta/shared/system /home/hajime/production/nanigadeta/shared/log /home/hajime/production/nanigadeta/shared/pids"
servers: ["localhost"]
[localhost] executing command
command finished


Capistranoでは実行しているコマンドがこのようにログに表示されるため、処理内容の確認がしやすくて良いです。
続いて、cap deploy:coldで初回配布を行います。(coldの意味がわからないけど、初回はこれらしい) コマンドを実行するとSubversionから最新のソースコードが取得され、setupで作成したreleaseディレクトリ以下のサブディレクトリに格納されます。最後にcurrentディレクトリにシンボリックリンクが張られます。最新版を参照する際は常にcurrentディレクトリを見ればよいわけです。

coldの意味を調べました。
/opt/local/rubygems/gems/capistrano-2.1.0/lib/capistrano/recipes/deploy.rbのdesc曰く

Deploys and starts a `cold’ application. This is useful if you have not deployed your application before, or if your application is (for some other reason) not currently running. It will deploy the code, run any pending migrations, and then instead of invoking `deploy:restart’, it will invoke `deploy:start’ to fire up the application servers.

拙い和訳

`cold’アプリケーションを配布し、起動します。以前にアプリケーションを配布していない場合や、(なんらかの理由で)現在あなたのアプリケーションが稼動していない場合に便利です。これは、コードを配布し、保留されているすべてのマイグレーションを実施し、そして、’deploy:invoke’を実行します。 これは、 ‘deploy:start’を実行し、アプリケーションサーバを起動します。

deployとの違いはmigrateの実施の有無だけでした。「固まって凍っていた」アプリケーションを配布することによって解凍する、という意味合いのようです。
Twitter上でnorioさんに助けていただきました、ありがとう!

2回目以降の配布はcap deployで行えます。環境構築をするまでは大変ですが(自分はSSHがらみでハマりました)、一度構築してしまえば、アプリケーションの配布が楽になり、作業負担やケアレスミスを減らすことができます。
以下、Mongrel用の解説です。
アプリケーションの配布が正常に終了すると、Capistranoはサーバの再起動を試みます。この際に利用するコマンドがscript/spinです。ここにWebサーバごとの起動コマンドを記述する必要があります。自分の場合、フロントにlighttpdを利用して、バックには4つのMongrelプロセスを8000〜80003番のポートで開いています。フロント側はシステム起動時に起動しているので、バックのMongrelの起動方法をscirpt/spinに記述します。

/path/to/rails/application/current/script/process/spawner -p 8000 -i 4


/path/to/rails/applicationは適宜置き換えてください。最後にSubversionでこのファイルに実行属性を付加するように指定しておきます。

$ svn proplist script/spin
Properties on 'script/spin':
svn:executable


解説は以上です。独自タスクの作成など他にもいろんな機能があるので、ぜひ調べてみてください。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする