分類
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,這兩個元件是獨立的。

在〈Capistrano 自動化 deploy Rails〉中有 2 則留言

發表迴響