読者です 読者をやめる 読者になる 読者になる

garbagetown

個人の日記です

capistrano (4)

水曜どうでしょうの DVD がごっそり手に入りそう。うれしい。

restart.txt

capistrano によるデプロイ後、passenger 上のアプリケーションを再起動するには $RAILS_ROOT/tmp/restart.txt という空ファイルを作ればいいらしい。
passenger のマニュアル にあるレシピを deploy.rb に追記。

namespace :deploy do
  task :start, :roles => :app do
    run "touch #{current_release}/tmp/restart.txt"
  end

  task :stop, :roles => :app do
    # Do nothing.
  end

  desc "Restart Application"
  task :restart, :roles => :app do
    run "touch #{current_release}/tmp/restart.txt"
  end
end

で、cap deploy を実行。

% cap deploy
(snip)
  * executing `deploy:restart'
  * executing "ls -xt /var/rails/sample/releases"
    servers: ["appserver"]
    [appserver] executing command
    command finished
  * executing "touch /var/rails/sample/releases/20090520140043/tmp/restart.txt"
    servers: ["appserver"]
    [appserver] executing command
    command finished

restart.txt を作ってくれたっぽい。実際に確認してみると

$ ls -la /var/rails/sample/releases/20090520140043/tmp
total 8
drwxr-xr-x  2 cap cap 4096 2009-05-20 23:00 ./
drwxrwxr-x 11 cap cap 4096 2009-05-20 23:00 ../
lrwxrwxrwx  1 cap cap   29 2009-05-20 23:00 pids -> /var/rails/sample/shared/pids/
-rw-r--r--  1 cap cap    0 2009-05-20 23:00 restart.txt

確かに restart.txt が作成されており、アプリケーションサーバが再起動して最新のモジュールにアクセス可能になっている事も確認できた。
この restart.txt はアプリケーションサーバ再起動後も削除されずに残っているが、作成時のタイムスタンプを見て再起動するか否かを判定しているので、残っていても構わないらしい。構わないのかもしれないけど、ウザいので削除して欲しい気もする。

deploy.rb

結局こんな風になった。まだまだ奥は深そうだが、取りあえず今は充分。

set :application, "sample"
set :deploy_to, "/var/rails/#{application}"

set :user, "cap"
set :use_sudo, false
set :default_run_options, :pty => true

set :repository,  "gitserver:/var/git/sample.git"
set :scm, :git

role :app, "appserver"
role :web, "appserver"
role :db,  "appserver", :primary => true

task :update_config, :roles => [:app] do
  run "chmod 775 #{release_path}/script/spin"
end
after "deploy:update_code", :update_config

namespace :deploy do
  task :start, :roles => :app do
    run "touch #{current_release}/tmp/restart.txt"
  end

  task :stop, :roles => :app do
    # Do nothing.
  end

  desc "Restart Application"
  task :restart, :roles => :app do
    run "touch #{current_release}/tmp/restart.txt"
  end
end

分からないこと

  • windows + gitbash という環境でストレス無く ssh-agent を使う方法
    • pagent は却下
    • gitbash で eval `ssh-agent` から ssh-add しても、cap deploy すると最初の一回だけはパスフレーズの入力を求められてウザい。そういうもの?
  • git リポジトリにアクセスする際にログインパスワードを求められる件