garbagetown

個人の日記です

capistrano (3)

いよいよモジュールをリリースしてみます。

git と capistrano

今回はバージョン管理システムに git を使用するので、deploy.rb に git からアプリケーションを clone するための情報を追記します。

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

# 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/rails/#{application}"

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

set :user, "cap"
set :use_sudo, false

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

set :repository は git リポジトリのパスです。
set :scm で使用するバージョン管理システムを設定します。git を使用する場合は シンボル :git を設定します。

deploy:cold

それでは早速デプってみましょう。初回デプロイ時には deploy:cold タスクを指定し、モジュールの展開と migration を実行します。

% cap deploy:cold
  * executing `deploy:cold'
  * executing `deploy:update'
 ** transaction: start
  * executing `deploy:update_code'
    executing locally: "git ls-remote gitserver:/var/git/sample.git HEAD"
Enter passphrase for key '/c/Documents and Settings/garbagetown/.ssh/id_rsa':
  * executing "git clone -q gitserver:/var/git/sample.git /var/rails/sample/releases (snip)
    servers: ["appserver"]
Enter passphrase for c:/Documents and Settings/garbagetown/.ssh/id_rsa:
    [appserver] executing command
 ** [appserver :: err] Permission denied, please try again.
 ** [appserver :: err] Permission denied, please try again.
 ** [appserver :: err] Permission denied (publickey,password).
 ** [appserver :: err] fatal: The remote end hung up unexpectedly
    command finished
*** [deploy:update_code] rolling back
  * executing "rm -rf /var/rails/sample/releases/20090518234527; true"
    servers: ["appserver"]
    [appserver] executing command
    command finished
failed: "sh -c \"git clone -q ubuntu99:/home/git/sample.git /var/rails/sample/releases (snip)

なんかコケた。permission denied と言われている気がする。

pseudo-tty

いろいろ調べてみたところ、deploy.rb に

set :default_run_options, :pty => true

と追記すればいいらしい。やってみよう。

$ cap deploy:cold
  * executing `deploy:cold'
  * executing `deploy:update'
 ** transaction: start
  * executing `deploy:update_code'
    executing locally: "git ls-remote gitserver:/var/git/sample.git HEAD"
Enter passphrase for key '/c/Documents and Settings/garbagetown/.ssh/id_rsa':
  * executing "git clone -q gitserver:/var/git/sample.git /var/rails/sample/releases/(snip)
    servers: ["appserver"]
Enter passphrase for c:/Documents and Settings/garbagetown/.ssh/id_rsa:
    [appserver] executing command
 ** [appserver :: out] cap@gitserver's password:
Password:

git サーバへのログインパスワードを訊かれた。公開鍵を使って欲しいのですが、と呟きつつパスワードを入力すると

(snip)
 ** [out :: appserver] nohup:
 ** [out :: appserver] ignoring input and appending output to `nohup.out'
 ** [out :: appserver]
 ** [out :: appserver] nohup:
 ** [out :: appserver] cannot run command `script/spin'
 ** [out :: appserver] : No such file or directory
 ** [out :: appserver]
    command finished
failed: "sh -c \"cd /var/rails/sample/current &&  nohup script/spin\"" on appserver

なんかコケた。ファイルが無いと言われている気がする。

script/spin

capistrano によるモジュールの配置後、script/spin がキックされるので、通常はここに mongrel cluster 周りの設定を書いてクラスタを再起動したりするらしい。
passenger を使用する場合、spin でする事はないっぽいので、空のファイルを作って commit して push して deploy してみる。

% touch script/spin
% git add script/spin
% git commit -m "added script/spin"
[master 725bfbf] added script/spin
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 script/spin
% git push origin master
git@gitserver's password:
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 596 bytes, done.
Total 3 (delta 1), reused 1 (delta 0)
To git@gitserver:/var/git/sample.git
   5bae50c..0f04f26  master -> master

行ってみよう。

% cap deploy:cold
(snip)
 ** [out :: appserver] nohup:
 ** [out :: appserver] ignoring input and appending output to `nohup.out'
 ** [out :: appserver]
 ** [out :: appserver] nohup:
 ** [out :: appserver] cannot run command `script/spin'
 ** [out :: appserver] : Permission denied
 ** [out :: appserver]
    command finished
failed: "sh -c \"cd /var/rails/sample/current &&  nohup script/spin\"" on appserver

なんかコケた。permission denied と言われている気がする。

after "deploy:update_code"

spin がコマンドとして実行できないと言っているので、リリースしたファイルを見てみると

$ cd /var/rails/sample/releases/20090519161820
$ ls -la script/spin
-rw-rw-r--  1 cap cap    0 2009-05-20 01:18 spin

うん、664 だね。こんなもん実行できるわけない。ゲイツさん、本当にありがとうございました。
仕方ないので script/spin のパーミッションを 775 にする新規タスクと、その呼び出しを deploy.rb に追記。

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

行ってみよう。

% cap deploy:cold
(snip)
    triggering after callbacks for `deploy:update_code'
  * executing `update_config'
  * executing "chmod 775 /var/rails/sample/releases/20090519163039/script/spin"
    servers: ["appserver"]
    [appserver] executing command
    command finished
  * executing `deploy:symlink'
  * executing "rm -f /var/rails/sample/current && ln -s /var/rails/sample/releases/(snip)
    servers: ["appserver"]
    [appserver] executing command
    command finished
 ** transaction: commit
  * executing `deploy:migrate'
  * executing "ls -xt /var/rails/sample/releases"
    servers: ["appserver"]
    [appserver] executing command
    command finished
  * executing "cd /var/rails/sample/releases/20090519163039; rake RAILS_ENV=production db:migrate"
    servers: ["appserver"]
    [appserver] executing command
 ** [out :: appserver] (in /var/rails/sample/releases/20090519163039)
    command finished
  * executing `deploy:start'
  * executing "cd /var/rails/sample/current &&  nohup script/spin"
    servers: ["appserver"]
    [appserver] executing command
 ** [out :: appserver] nohup:
 ** [out :: appserver] ignoring input and appending output to `nohup.out'
 ** [out :: appserver]
    command finished

おっ、終わった!