使用 Capistrano 部署總結

簡介
Capistrano 是一個 Ruby 程序轿秧,它提供高級的工具集來部署你的 Web應用到服務器上。Capistrano 允許你通過 SSH 從源代碼控制倉庫(SVN 或 Git)復制代碼到服務器廉邑,并執(zhí)行如重啟 Web服務器谈喳、操作緩存、重命名文件、遷移數(shù)據(jù)庫等部署前/后的功能记劝。利用 Capistrano一次也可部署多臺機器。

安裝 Capistrano
為了安裝 Capistrano族扰,你的電腦需要已安裝 Ruby 和 RubyGems厌丑。

gem list Capistrano -a -r http://ruby.taobao.org/

*** REMOTE GEMS ***
capistrano (3.2.1, 3.2.0, 3.1.0, 3.0.1, 3.0.0, 2.15.5, 2.15.4, 2.15.3, 2.15.2, 2.15.1, 2.15.0, 2.14.2, 2.14.1, 2.13.5, 2.12.0, 2.11.2, 2.9.0, 2.8.0, 2.7.0, 2.6.0, 2.5.21, 2.5.20, 2.5.19, 2.5.18, 2.5.17, 2.5.16, 2.5.15, 2.5.14, 2.5.13, 2.5.12, 2.5.11, 2.5.10, 2.5.9, 2.5.8, 2.5.7, 2.5.6, 2.5.5, 2.5.4, 2.5.3, 2.5.2, 2.5.1, 2.5.0, 2.4.3, 2.4.2, 2.4.1, 2.4.0, 2.3.0, 2.2.0, 2.1.0, 2.0.0, 1.4.2, 1.4.1, 1.4.0, 1.3.1, 1.3.0, 1.2.0, 1.1.0)
capistrano-af83 (0.4.7, 0.4.6, 0.4.5, 0.4.4, 0.4.3, 0.4.2, 0.4.1, 0.4.0, 0.3.8, 0.3.2, 0.3.1, 0.3.0, 0.2.4, 0.2.3, 0.2.2, 0.2.1, 0.2.0, 0.1.9, 0.1.8, 0.1.7, 0.1.6, 0.1.5, 0.1.4, 0.1.3, 0.1.2, 0.1.1, 0.1.0)
capistrano-akamai (0.0.1)
capistrano-alice (0.0.7, 0.0.6, 0.0.5, 0.0.4, 0.0.3, 0.0.2, 0.0.1)
capistrano-asgroup (0.0.1)
上面的命令列出了目前capistrano所有的版本及其相關的插件(插件還有很多,這里我沒粘全)渔呵,可以看到目前capistrano的最新版本為3.2.1 怒竿。不過由于webistrano環(huán)境所使用的是2.6.0 。本篇還是以2.6.0的版本進行安裝和總結扩氢。

注:capistrano 3.X.X 版本和 capistrano 2.X.X之間已經(jīng)發(fā)生了比較大的變化 耕驰。這有點類似于python3與python2的區(qū)別。

安裝方法:

$ gem install capistrano -v 2.6.0
//如果需要安裝capistrano擴展录豺,再增加下面的操作
$ gem install capistrano-ext
如果你遇到了問題或想要了解更多細節(jié)朦肘,可以參考官方的 Capistrano 入門指南,或找到使 Capistrano 工作的各種組件双饥。

注:安裝時媒抠,會自動安裝依賴包,請確認 net-ssh 的版本號為2.7.0 咏花,不然執(zhí)行任何deploy操作時會遇到類似如下的ssh認證報錯

[deploy:update_code] exception while rolling back: Capistrano::ConnectionError, connection failed for: ... (Net::SSH::AuthenticationFailed: Authentication failed for user
具體可以參看github上的net-ssh項目的issues部分 趴生。

創(chuàng)建項目
在終端中導航到你的應用根目錄,并執(zhí)行以下命令:

$ sudo capify .
[add] writing './Capfile'
[add] making directory './config'
[add] writing './config/deploy.rb'
[done] capified!
$ tree
.
├── Capfile
└── config
└── deploy.rb
在capistrano 3.x.x的版本中昏翰,此處已經(jīng)不能使用這樣的方法創(chuàng)建項目苍匆,應該使用下面的操作:

$ capify .

Capistrano 3.x is incompatible with Capistrano 2.x.
This command has become cap install in Capistrano 3.x
For more information see http://www.capistranorb.com/


$ sudo cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
Capified
$ tree
.
├── Capfile
├── config
│ ├── deploy
│ │ ├── production.rb
│ │ └── staging.rb
│ └── deploy.rb
└── lib
└── capistrano
└── tasks
也不難看出,兩者的目錄結構也已經(jīng)發(fā)生了一些變化棚菊。個人嘗試了下3.x.x版本浸踩,發(fā)現(xiàn)其功能和細節(jié)較2.x.x 做了很多優(yōu)化。如果不使用古老的webistrano做web前端窍株,建議使用新版本民轴。由于webistrano 已經(jīng)三年多沒更新(作者也已宣布不再更新)攻柠,所以不確定其與capistrano 3.x.x 的兼容性 。

創(chuàng)建的項目中一個特殊的 Capfile 文件后裸,Capfile 將幫助 Capistrano 正確加載你的 deploy.rb模板瑰钮,而deploy.rb文件定義了模塊、namespace微驶、task等浪谴,在部署過程中,只需要按主機組執(zhí)行相應的task即可完成相應的操作因苹。

編寫 Capistrano模板
1苟耻、配置deploy.rb文件

以下deploy.rb
文件中一些詳細的分析

require 'bundler/capistrano' #添加之后部署時會調用bundle install, 如果不需要就可以注釋掉
require "capistrano/ext/multistage" #多stage部署所需
set :stages, %w(development production)
set :default_stage, "development"
set :application, "crm_app_end" #應用名稱
set :repository, "https://test.361way.com/svn/trunk"
set :keep_releases, 5 #只保留5個備份
set :deploy_to, "/var/www/#{application}" #部署到遠程機器的路徑
set :user, "user1" #登錄部署機器的用戶名
set :password, "user1" #登錄部署機器的密碼扶檐, 如果不設部署時需要輸入密碼
default_run_options[:pty] = true #pty: 偽登錄設備

default_run_options[:shell] = false #Disable sh wrapping

set :use_sudo, true #執(zhí)行的命令中含有sudo凶杖, 如果設為false, 用戶所有操作都有權限
set :runner, "user2" #以user2用戶啟動服務
set :svn_username, "xxxx"
set :scm, :subversion #注意subversion前有冒號款筑,不能少

Or: accurev, bzr, cvs, darcs, git, mercurial, perforce, subversion or none

set :deploy_via, :copy #如果SCM設為空智蝠, 也可通過直接copy本地repo部署

set :domain, "crm.abc.com" #custom define

role :web, "192.168.0.13", "192.168.0.117" # Your HTTP server, Apache/etc
role :app, "192.168.0.13", "192.168.0.117" # This may be the same as your Web server
role :db, "192.168.0.13", :primary => true # This is where Rails migrations will run

role :db, "your slave db-server here"

namespace :deploy do
desc "remove and destory this app"
task :destory, :roles => :app do
run "cd #{deploy_to}/../ && #{try_sudo} mv #{application} /tmp/#{application}_#{Time.now.strftime('%Y%d%m%H%M%S')}" #try_sudo 以sudo權限執(zhí)行命令
end
after "deploy:update", "deploy:shared:setup" #after, before 表示在特定操作之后或之前執(zhí)行其他任務
namespace :shared do
desc "setup shared folder symblink"
task :setup do
run "cd #{deploy_to}/current; rm -rf shared; ln -s #{shared_path} ."
end
end
after "deploy:setup", "deploy:setup_chown"
desc "change owner from root to user1"
task :setup_chown do
run "cd #{deploy_to}/../ && #{try_sudo} chown -R #{user}:#{user} #{application}"
end
task :start do
run "cd #{deploy_to}/current && ./crmd.sh start"
#try_sudo "cd #{deploy_to}/current && ./restart.sh"
end
task :stop do
run "cd #{deploy_to}/current && ./crmd.sh stop"
end
task :restart do
run "cd #{deploy_to}/current && ./crmd.sh restart"
end
end
上面關于環(huán)境部分這里特別說下奈梳,如果有多個stage要部署杈湾,則在config下創(chuàng)建deploy文件夾, 在該文件夾下有各stages文件, 文件名和 set :stages, %w(development production) 對應攘须, 如development.rb production.rb漆撞,在各文件中設置相應變量即可,

set :stages, ["staging", "production"]
set :default_stage, "staging"
production.rb 設置類似如下:

set :deploy_to, "/var/www/#{application}"

The hostnames to deploy to.

role :web, "devel.example.com"

Specify one of the web servers to use for database backups or updates.

This server should also be running Drupal.

role :db, "devel.example.com", :primary => true

The username on the target system, if different from your local username

ssh_options[:user] = 'alice'

The path to drush

set :drush, "cd #{current_path} ; /usr/bin/php /data/lib/php/drush/drush.php"
同樣development.rb:

server "my_fancy_server.com", :app, :web, :db, :primary => true
set :deploy_to, "/var/www/fancy_shoes_development"
實際應用中于宙,我們也可以配置在不同環(huán)境中使用同一主機中使用不同的目錄浮驳,也可以配置不同的環(huán)境里包含著不同的主機。在多環(huán)境中限煞,執(zhí)行部署的命令需要指定環(huán)境:

cap production deploy:...
在2.x.x 的多環(huán)境配置中使用cap發(fā)布也可以不指環(huán)境抹恳,這需要在配置中指定其中一個環(huán)境為默認環(huán)境 。在3.x.x中署驻,默認創(chuàng)建的demo項目中奋献,就已經(jīng)創(chuàng)建好了deploy目錄,并生成了production和staging兩個環(huán)境文件旺上,而且在執(zhí)行時默認強制需要指定發(fā)布的環(huán)境瓶蚂,所以3.x.x的默認結構更清晰 。

2宣吱、驗證配置的執(zhí)行deploy

全部準備好后窃这,先試試我們的 recipe,以便讓 Capistrano 在服務器上創(chuàng)建初始的目錄結構征候。從你的應用根目錄執(zhí)行下列命令:

$ cap deploy:setup
當你執(zhí)行該命令時杭攻,Capistrano 將 SSH 到你的服務器祟敛,進入你在 deploy_to 變量中所指定的目錄,并創(chuàng)建特殊的 Capistrano 目錄結構兆解。如果遇到權限或 SSH
訪問錯誤馆铁,你將獲得錯誤消息。當命令執(zhí)行時仔細看看 Capistrano 的輸出锅睛。

在我們使用 Capistrano 做實際部署之前的最后一步是埠巨,確保 setup命令在服務器上全都設置正確。使用以下命令進行簡單驗證:

$ cap deploy:check
該命令將檢查你的本機環(huán)境及服務器现拒,并定位問題辣垒。如果你看到錯誤消息,修復后再運行此命令印蔬。一旦你執(zhí)行 cap deploy:check 沒有錯誤勋桶,則可繼續(xù)處理。

部署過程中我們還會用到下面的語句(需要在deploy.rb里事先進行定義task):

$cap deploy:setup #建立部署路徑
$cap deploy:update #部署
$cap deploy:start #啟動服務
$cap deploy:stop #停止服務
$cap deploy:restart #重啟服務
$cap deploy:rollback #回滾
提示與技巧
使用遠端緩存改進性能

Capistrano
的工作方式在每次部署時都將創(chuàng)建新的倉庫克隆及導出扛点。那必將很慢哥遮,通過添加一些擴展選項到deploy.rb recipe 則可提速。添加下列內容到 deploy.rb 文件描述 scm 設置的位置:

set :deploy_via, :remote_cache
此命令使 Capistrano 在服務器上只克隆/導出倉庫一次陵究,然后在每次部署時使用 svn up 或 git pull 代替。如果你經(jīng)常部署奥帘,你將發(fā)現(xiàn)提速明顯铜邮。

添加定制的部署鉤子(Hook)

Capistrano 顯然比通過 SSH
復制文件要高級。你可以配置事件或命令以便在文件復制完成后執(zhí)行寨蹋,如重啟 Web服務器松蒜、執(zhí)行定制的腳本等。Capistrano 稱這些為“任務”已旧。例如秸苗,添加以下代碼到
deploy.rb 文件:

namespace :deploy do
task :restart, :roles => :web do
run "touch #{ current_path }/tmp/restart.txt"
end
task :restart_daemons, :roles => :app do
sudo "monit restart all -g daemons"
end
end
Capistrano 中的任務非常強大,我們在本指南中僅接觸到表皮运褪。你可以創(chuàng)建任務在部署前惊楼、部署后或單獨操作服務器。這可以是任何維護類型:重啟進程秸讹、清理文件檀咙、發(fā)送郵件通知、執(zhí)行數(shù)據(jù)庫遷移璃诀、運行腳本等等弧可。

我們的示例包括兩個定制任務×踊叮“restart”任務是內建于 Capistrano中的棕诵,將在部署完成后自動執(zhí)行裁良。我們使用由 Passenger 驅動的現(xiàn)代 Rails 應用技術
touch tmp/restart.txt,你的 Web 服務器可能需要不同的命令校套。

我們的第二個示例任務是“restart_daemons”价脾,Capistrano
不會默認執(zhí)行此定制任務。為了讓它運行搔确,我們需要添加一個 hook:

after "deploy", "deploy:restart_daemons"
此命令告訴 Capistrano 在我們的部署操作完成后執(zhí)行任務彼棍。其他可用的 hook 是before,將在文件復制之前執(zhí)行任務膳算。

關于 before 及 after hook座硕,你可以閱讀官方的 Capistrano 文檔:

Before Tasks
After Tasks
將 Git 分支與環(huán)境關聯(lián)

因為我們有兩個服務器環(huán)境(臨時和生產),你可能想要綁定 Git分支到這些環(huán)境涕蜂。這樣华匾,你可以自動部署 staging 分支到臨時環(huán)境,master分支到生產環(huán)境机隙。簡單添加下列內容到 production.rb:

set :branch, 'production'
并添加以下內容到 staging.rb

set :branch, 'staging'
現(xiàn)在每次你執(zhí)行 cap deploy 時蜘拉,Capistrano 將從你的 staging 分支(因為 staging是我們的默認環(huán)境)部署代碼。如果你運行 cap production deploy有鹿,Capistrano將從你的 master 分支部署代碼旭旭。

參考文檔:
capistrano部署drupal應用
使用capistrano部署web應用
github wiki頁

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市葱跋,隨后出現(xiàn)的幾起案子持寄,更是在濱河造成了極大的恐慌,老刑警劉巖娱俺,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稍味,死亡現(xiàn)場離奇詭異,居然都是意外死亡荠卷,警方通過查閱死者的電腦和手機模庐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來油宜,“玉大人掂碱,你說我怎么就攤上這事⊙槊恚” “怎么了顶吮?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粪薛。 經(jīng)常有香客問我悴了,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任湃交,我火速辦了婚禮熟空,結果婚禮上,老公的妹妹穿的比我還像新娘搞莺。我一直安慰自己息罗,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布才沧。 她就那樣靜靜地躺著迈喉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪温圆。 梳的紋絲不亂的頭發(fā)上挨摸,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音岁歉,去河邊找鬼得运。 笑死,一個胖子當著我的面吹牛锅移,可吹牛的內容都是我干的熔掺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼非剃,長吁一口氣:“原來是場噩夢啊……” “哼置逻!你這毒婦竟也來了?” 一聲冷哼從身側響起备绽,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诽偷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疯坤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡深浮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年压怠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飞苇。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡菌瘫,死狀恐怖,靈堂內的尸體忽然破棺而出布卡,到底是詐尸還是另有隱情雨让,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布忿等,位于F島的核電站栖忠,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜庵寞,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一狸相、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捐川,春花似錦脓鹃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岩齿,卻和暖如春太颤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纯衍。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工栋齿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人襟诸。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓瓦堵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親歌亲。 傳聞我的和親對象是個殘疾皇子菇用,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)陷揪,斷路器惋鸥,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 下載ubuntu 14.4server版安裝, 裝完干凈的系統(tǒng)后悍缠,我們首先需要更新 $ sudo apt-get ...
    星野君閱讀 2,302評論 0 2
  • CentOS用戶操作 創(chuàng)建新用戶和組useradd deploy -G admin -p deploy創(chuàng)建新組ad...
    王諳然閱讀 3,369評論 1 4
  • 寫給剛剛開始學習Ruby on Rails的朋友們卦绣,希望能對第一次在云服務器上發(fā)布自己項目的朋友有一點點幫助...
    LonelyChris閱讀 1,923評論 2 26
  • 戀愛,說起來是挺美好的事飞蚓,有人說戀愛是一種修行滤港,修煉好了兩個人會甜蜜幸福,修煉不好的話兩個人沒準就分道揚鑣啦趴拧! 戀...
    詩蒙閱讀 407評論 0 0