Categories
DevOps Rails Ruby

Capistrano 自動化 deploy Rails

今天花了點時間在自己的 server(FreeBSD) 上試用 Capistrano,這是一套讓你在 local 透過 SSH 自動執行遠端任務的 deployment system,當然最常見的應用就是 deploying Rails applications 了。

老實說,第一次的設定還真讓我 try and error,尤其前一陣子剛出 Capistrano 2.0 版,變更了一些用法,所以很多舊範例就不敢用了,而官網上的文件也實在有點簡略說… ^^@ 其中關於 the “spin” script 的部份不甚解原理(?),最後的做法除了讓登入的帳號有 sudo 權限,也需要先手動登入執行第一次的啟動 sudo script/process/spin。

anyway… 還是照著 Getting Started 配著過時的 AWDwR 2nd. Chap 27 來做,值得注意的有

svn 的帳號密碼要這樣設定

set :scm_username, “username” # svn user name
set :scm_password, “password”

另外你應該不會把 database.yml 給 commit 出去,所以先建立好一份來做複製。

namespace :deploy do
desc “Create database.yml ”
task :after_update_code, :roles => [:web] do
db_config = “#{shared_path}/config/database.yml.production”
run “cp #{db_config} #{release_path}/config/database.yml;”
end
end

最後的成果是只要打 cap deploy,就會自動連到 server 上,執行 svn checkout 出最新版本,跑些客製的 script,然後重新 restart mongrel cluster。

為甚麼 Capistrano 這麼被重視呢? 這種 deploy 的過程,其實必定是個一再執行的過程(嗯,除非不需要再開發升級了),而且隨者時間演進,這個過程常常會有各種客製的 script 要執行,例如檔案變更/重新載入 config/清除 cache…etc

然而在發行新版本的時候,往往卻也是已經寫了好多程式,累的要命的時候,這時候一個已經自動化的 deploy process 就像甘霖露水,你不會想一個個手動執行那些複雜步驟的(而且萬一漏做了甚麼,都是無可預期的 disaster )。

Update(2007/9/1): 改在 Mac 上做 deploy,又卡關了好久:

把 /script/process/spin 的內容改成慣用的 mongrel_rails cluster::restart。

depoly.rb 中所有 run rake 的地方,多加完整 rake 路徑。以及 set :rake, “/opt/local/bin/rake”

我暫時沒有開 sudo 權限,所以 cap deploy 的最後一步 restart 會失敗,到這裡就只好手動囉。

Update(2007/9/4): 關於 sudo,應該再新增以下設定

set :use_sudo, false

至此應該一步 cap deploy 就可以搞定了… :)

Update(2007/9/5): 真是一天一牛步在修這個 script,請再加上環境變數 (因為 Capistrano 用 SSH 登入後並不會讀取你的環境變數啊~),還有 deploy:restart 也重寫過吧,不需要使用 /script/process/spin :

default_environment[“PATH”] = “/Users/ihower/bin:/opt/local/bin:/bin:/sbin:/usr/bin:/usr/sbin”

desc “Restart Mongrel”
task :restart, :roles => [:app] do
run <<-EOF
cd #{current_path} && mongrel_rails cluster::restart
EOF
end

至此終於一步 cap deploy 就可以搞定了(Mac)… :)

by the way…解釋一下架構,這邊是用 mongrel_rails cluster 跑在一群 ports 上(例如8000~8002),再搭配 Apache Proxy 機制把 HTTP request balance 到各個 mongrel 上。這是目前 deploy rails 最建議的 solution。

關於 apache settings 照抄 AWDwR 2nd. 的就可以 work 了,跑 cap deploy 的時候也不需要重開 apache,這兩個元件是獨立的。