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
おっ、終わった!