複製鏈接
請複製以下鏈接發送給好友

Capistrano

鎖定
Capistrano是一種在多台服務器上運行腳本的開源工具,它主要用於部署web應用。它自動完成多台服務器上新版本的同步更新,包括數據庫的改變。
外文名
Capistrano
開發語言
Ruby
穩定版
2.6.0 / 4 May. 2011
原始作者
Jamis Buck

Capistrano基本信息

Capistrano最初由Jamis Buck用Ruby開發,並用RubyGems部署渠道部署。Capistrano不僅限於應用Ruby on Rails的 web應用框架,而且可以用於部署用其他框架的web應用程序,比如用PHP開發的。Capistran最初是用來應用於bash指令行。Ruby on Rails框架的用於也可以使用它的新特性,例如,對當前web應用部署改變使其更新版本,或者使其回滾到之前的舊版本。
Capistran最初叫SwitchTower,由於商標爭端於2009年二月24日改為Capistran。而且原始作者於當天宣佈不再是該軟件的維護者。
應用平台 POSIX (Linux, OpenBSD, Mac OS X)
類型 Deployment Tool
License MIT
Capistrano是一種通過ssh向多個服務器部署web應用的一種框架和工具。它使用一種簡單的Domain Specific Language,這種語言是從工具rake中部分借用過來的,Rake的作用類似C語言中的make工具,允許你定義任務,這些任務也許用於某些特定角色的服務器。同時它還允許你透過網關在防火牆和VPN之後執行任務。
當您完成了Rails 2.x應用後,是時候用到Capistrano了,它可以很容易的幫您自動向多台服務器同步部署應用。Capistrano的安裝也很簡單,只需要gem install capistrano即可。在我們有效地設置Capistrano之前,我們必須做好應用部署相關的決定,Capistrano可不能幫你解決這些問題。但是Capistrano的默認設置足以解決大部分問題。
首先我們需要安裝web服務器軟件,可以選擇的有Apache, Lighttpd, 和 nginx 如果沒有特別需求,可以選擇nginx,小巧而高效。
數據庫
然後是數據庫,你需要決定你的產品需要那款數據庫軟件,MySQL 和 PostgreSQL是兩個不錯的開源選擇,即使大公司更傾向使用Oracle。有些人會選擇使用SQLite,他很適合單用户的嵌入式環境,但卻不適合web環境。在這些選擇中,MySQL通常來説是最容易安裝和設置的,所以此處推薦MySQL。
然後是Ruby,Ruby對任何Rails應用來説都非常關鍵,你需要決定你要安裝Ruby的版本和插件。這些年JRuby也能跑Rails,但是如果你決定用JRuby來代替MRI Ruby來部署的話,你的設置環節可能需要較大的改變。
應用層是實際運行你的web應用的環節。Mongrel是個很流行的選擇,而Thin and Passenger (例如 mod_rails)也變得越來越流行。有的人會嘗試使用WEBrick來部署產品,但並不推薦使用它,WEBrick用於應用的開發和測試還是不錯的,但要用於大規模部署產品的生產環境可能就不太好。還需要注意的是,如果你使用Passenger之類的話,你需要確保你的web服務器軟件支持他,Passenger只支持Apache2和nginx
雖然版本控制系統跟產品部署的設置沒什麼關係,但是在默認設置下,Capistrano很大程度上依賴你的版本控制系統。Capistrano支持的版本控制系統比較少,要支持更多的版本控制系統,你需要做更多地工作。最常見的SubversionGit都能得到很好的支持,最易選一個你用的慣的它也支持的版本控制系統。
接下來我們按照如順序配置
nginx
MySQL
MRI Ruby
Mongrel
Subversion
Capification
安裝完Capistrano之後要做的第一件事就是"capify"你的應用,這個過程是設置Capistrano來部署你的應用,很簡單,只需在你的應用的root目錄裏執行capify .(即capify+" "+ ".")。這將產生兩個文件,一個是capfile,這個是Capistrano需要的主要文件,就像make自動產生makefile,rake自動產生Rakefile一樣,Capistrano默認尋找並加載capfile文件,默認產生的rapfile非常小,它所做的事就是加載“config/deploy.rb";第二個文件是"config/deploy.rb″,這個文件包含你的應用程序部署所需的設置。Ralis的所有設置文檔都放在config目錄下,通常,你不需要管capfile文件,只需要把精力放在config/deploy.rb的設置和優化上。如果你的Capistrano用於非Rails環境,你可能只有一個capfile文件,而沒有config/deploy.rb這個文件。
Configuration
設置,如果你看看config/deploy.rb的內容,你就會發現,裏面沒多少可設置的東西。首先我們要告訴Capistrano我們的應用程序被"調用"了
set:application, "your_application_name"
然後我們需要告訴Capistrano我們的源代碼在哪裏,這個地址你的本地主機和服務器都可以到達。
set :repository, "svn+ssh://code#######/repos/your_application_name"
然後,如果你用的不是Subversion,你還需要告訴Capistrano你使用的版本控制系統:
set :scm, :git
部署目錄結構
一次成功的部署將會產生如下文件目錄結構:
[deploy_to]
[deploy_to]/releases
[deploy_to]/releases/20080819001122
[deploy_to]/releases/...
[deploy_to]/shared
[deploy_to]/shared/log
[deploy_to]/shared/pids
[deploy_to]/shared/system
[deploy_to]/current ->[deploy_to]/releases/20100819001122
(deploy_to代表你想讓Capistrano在你的服務器部署的位置)
每部署一次,將在release目錄下產生新的目錄,然後新版本將在部署在那裏。然後"current"鏈接將指向新產生的目錄.
還需要注意的是,設置你的web服務器軟件時要在相應的root目錄下執行。
回到設置上來
接下來回到設置Capistran上來。我們需要告訴Capistran我們的應用放在服務器的哪裏。默認是在"/u/apps/#{application}"。但是你也許想在/var/www上部署,這就需要這樣設置:
set :deploy_to, "/var/www"
然後在告訴Capistrano我們的服務器在哪兒,各自都起到什麼作用:
role :app, "tutorial#com"
role :web, "tutorial#com"

Capistrano其他信息

role :db, "tutorial#com", :primary =>true
如果只有一個服務器,就這樣設置:
server "tutorial#com", :app, :web, :db, :primary =>true
app,web,db是Capistrano需要的三種角色:
web:你的服務器軟件運行的地方;
app:你的應用層運行的地方;
db:遷移運行的地方;
雜項配置
以上的設置對大部分人來説已經足夠了,下面是額外的附加設置,如果你確實需要的話:
set :user, “foo”如果你你登錄的用户名與你登錄本地的用户名不一致,你需要告訴Capistrano你的用户名;
set :scm_username, “foo”如果你登錄你的源代碼庫時使用的用户名與你登錄本地的用户名不一致時,你需要告訴Capistrano。注意到並不是所有的版本控制系統都支持scm_username變量,你可能需要在你的庫中嵌入scm_usernam:e.g. “svn+ssh://#{scm_username}@foo.bar#com/path/to/repo”
set :use_sudo, false,在默認情況下,Capistrano會嘗試使用sudo即管理員權限執行命令,在你不具備sudo權限的時候,這可能會是個問題,需要引起足夠注意。
與Capistrano會話
設置完成之後,我們可以”問問“Capistrano一些問題,看看基本信息:
$ cap -h 顯示Capistrano自身相關信息;
$ cap -H 顯示更多信息;
$ cap -T 顯示tasks
設置服務器
開始正常工作之前,我們需要讓Capistrano建立基本的目錄樹:
$ cap deploy:setup
檢查依賴性:
$ cap deploy:check我們在相應的位置新建了相應的目錄結構,然後我們需要讓Capistrano所需的依賴關係是否都得到滿足
數據庫初始化
接下來是要確定數據庫已經準備好了,安裝設置完之後,還需要確認一下三件事:
(1)你是否已經為你的部署新建了數據庫?
(2)你是否已經為你的config/database.yml文件添加了相應的部分?
(3)你是否為你的數據庫設置了足夠的權限?
Capistrano啓動應用層之前,他首先會執行script目錄下的spin腳本,腳本內容如下:
#!/bin/sh
#{deploy_to}/current/script/process/spawner \
--environment=production \
--instances=1 \
--address=127.0.0.1 \
--port=#{port}
把#{deploy_to}對換成相應的完整路徑
#{port}是你想讓mongrel監聽的端口
接下來就該部署了
$ cap deploy:update
這個指令將把你的源代碼複製到你的服務器上,然後把current這個鏈接更新到最新的目錄下。但是這會兒還沒正式啓動應用層。這一步成功之後,就會登錄到你的服務器,然後把當前目錄定位到你的新版本里,即[deploy_to]/current,首先上載數據庫架構到數據庫裏:
$ rake RAILS_ENV=production db:schema:load
如果這一步成功完成,可以用下面的指令來測試下:
$ script/console production
如果測試成功,會產生如下命令提示符
>>app.get("/")
最後,啓動應用層,看看動態內容是否被成功加載:
$ cap deploy:start
這將會冷啓動應用層,這個過程中使用了上述spin腳本
重啓和重新部署
$ cap deploy:restart
然後正式部署:
$ cap deploy