第6回 deploy:update

2008/03/29

今回は、ソースコードをターゲットホストに配備する。

ローカルホストで deploy:update タスクを実行する。(表示の一部省略)

% cap deploy:update
 * executing `deploy:update'
 ** transaction: start
  * executing `deploy:update_code'
...
 ** transaction: commit

しかし、普通はこんな風にはうまく行かない。まず、Subversion リポジトリからソースコードをチェックアウトするのにユーザー名とパスワードが必要であれば、次のような表示になる。

% cap deploy:update
 * executing `deploy:update'
 ** transaction: start
  * executing `deploy:update_code'
  * executing "svn checkout -q  -r21 https://repository.oiax.jp/svn/ballad/trunk ..."
    servers: ["alpha.oiax.jp"]
    [alpha.oiax.jp] executing command
 ** [err] Authentication realm: <https://repository.oiax.jp:80> repository.oiax.jp
 ** Password for 'app':
Password: 

ターゲットホストへのログイン名(app)と同じユーザーで Subversion レポジトリにアクセスできて、かつ、デプロイメント作業をするすべての開発者がそのパスワードを知っているなら、ここでそれを入力すればいい。しかし、開発者間でパスワードを共有するのは避けるべきだ。

そこで、deploy.rb を次のような記述に書き換える:

set :application, "ballad"
set :svn_user, ENV['svn_user'] || ENV['USER']
set :svn_password, Proc.new { Capistrano::CLI.password_prompt('SVN Password: ') }
set :repository,
  Proc.new { "--username #{svn_user} " +
             "--password #{svn_password} " +
             "--no-auth-cache " +
             "https://repository.oiax.jp//svn/ballad/trunk/" }
set :deploy_to,   "/var/rails/#{application}"

set :user, "app"
set :use_sudo, false

role :app, "alpha.oiax.jp"
role :web, "alpha.oiax.jp"
role :db,  "alpha.oiax.jp", :primary => true

こうしておいて、次のように deploy:update タスクを実行する(Subversion のユーザー名を kuroda とする)。

% svn_user=kuroda cap deploy:update

この方法にもちょっと問題がある。途中で SVN Password: プロンプトに対してパスワードを入力するのだが、svn コマンドが画面にエコーされることによって、パスワードが見えてしまうのだ。これでは、他の開発メンバーと一緒に作業している時に困ってしまう。

しかし、必ず -q オプション付きでタスクを実行する習慣を身につければ、この問題は避けられる。

% svn_user=kuroda cap -q deploy:update

さて、何らかの理由でターゲットホストにおいてコマンドの実行が失敗し、途中で止まってしまうことがある。その時は、端末に表示された文字から * executing "..." という形式の最後の行を探し、ダブルクオートで囲まれたコマンドをコピーして、ターゲットホスト上で実行し、原因を探る。


[改訂] 2008/05/17 ユーザー app でリモートホストにログインする方式に合わせて記述を修正。