第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 でリモートホストにログインする方式に合わせて記述を修正。