Hatena::ブログ(Diary)

cooldaemonの備忘録 RSSフィード

2009-10-20

Ruby Enterprise Edition + Webistrano

諸事情によりシステム標準の rubyRuby Enterprise Edition で入れた ruby を同居させていたのですが、Webistrano は、models/deployment.rb の deploy_in_background! というメソッドの中で直接 ruby コマンドを実行しているので、システム標準の ruby が呼ばれてしまいます。

とりあえず ruby を /opt/ruby-enterprise-X.X.X-YYYYMMDD/bin/ruby に置換して対応しました。

それ以外は、特に手を加えず Ruby Enterprise Edition 経由で入れた Phusion Passenger 上で問題なく動いているのですが・・・なんか嫌だなぁ

2008-10-07

Webistrano で Catalyst で作ったアプリをデプロイする

とある Subversionリポジトリとするプロジェクトで、デプロイツールとして Capistrano を使用しようと思ったのですが、私と同僚の開発環境が異なる事を理由に、前から目を付けていた Webistrano を試してみました。

動作環境

apache2.2.9
mysql5.0.67
ruby1.8.6
rails2.1.0
passenger2.0.3
capistrano2.5.0
webistranoRevision 189

webistrano 本体は http://labs.peritor.com/svn/webistrano/trunk/ からチェックアウトしたものを使用しています。

基本的な使い方

下記を眺めると、何となく理解できます。

Screencasts – Peritor Webistrano – Trac

Catalyst で作ったアプリをデプロイする

Export capfile メニューから Capfile を参照すると、一行目で load 'deploy' していたので /path/to/lib/capistrano/recipes/deploy.rb を眺めながら下記の Recipe を書いてみました。

下記は古い Recipe です。最新は、gist: 20946 ― GitHub にあります。新しい版は、:shared_dirs を指定する事で :shared_children にディレクトリのリストを追加できるようになっています。

namespace :deploy do

  desc "finalize update."
  task :finalize_update, :except => { :no_release => true } do
    run "chmod -R g+w #{latest_release}" if fetch(:group_writable, true)

    run <<-CMD
      rm -rf #{latest_release}/log &&
      ln -s #{shared_path}/log #{latest_release}/log
    CMD
  end

  desc "restart app servers."
  task :restart, :roles => :app, :except => { :no_release => true } do
    sudo "/usr/local/etc/rc.d/apache22 stop"
    sudo "/usr/local/etc/rc.d/apache22 start"
  end

  task :before_setup do
    set :shared_children, %w(log)
  end

end
finalize_update

share ディレクトリ配下 には log ディレクトリのみ配置したかったので、上記のように上書きしました。

restart

FreeBSD 上で mod_perl を使用しているので、上記のように上書きしました。

before_setup

setup 時、shared_children に設定されているディレクトリが share 配下に作られるのですが、configuration の value に %w(log) と入れても "%w(log)" とされる為、苦肉の策で before_xxx で上書きしました。

何か良い手、ないですかね?

新しい版では、before_setup を定義せずに :shared_children を書き換えてます。

感想

「デプロイ元の環境に依存せず、Web U/I から簡単にデプロイできる」という事を差っ引いても、複数の Stage を登録でき、細かい用途毎に Recipe を分割管理できるので、利便性が非常に高く感じられます。

これに慣れると、素の capistrano なんて使ってられないなぁ。