本文基於Capistrano 2版本,文中的命令不必定適用於Capistrano 3。git
簡單地講,Capistrano是一個gem
。對於不太熟悉Ruby的朋友來講,gem
就是一套按照必定規範打包好的Ruby代碼,能夠類比Java裏面的Package。github
實際上,Capistrano是專門用來部署rails程序的一套工具。web
Rails應用程序的部署方案十分靈活,適應於不一樣的生產服務器場景。在實際生產中,rails程序中包含的各種gem和生產服務器上的gem每每版本不一致,這就爲部署增長了一些難度。數據庫
利用Capistrano進行部署,就能很容易解決這個問題。同時,使用Capistrano部署rails程序,更有一種「敏捷」的感受。api
在進行Rails開發過程當中,一個重要的工具就是版本控制,而咱們常常用Git。用過Heroku的開發者,或者有靜態博客的朋友都能感覺到一點——把版本控制與部署方案融合到一塊兒很是方便。幸運的是,Capistrano對包括Git在內的各種版本控制有很是好的支持。本文中,我將使用Git做爲版本控制軟件,與Capistrano一塊兒工做,進行項目部署。服務器
利用Capistrano部署Rails程序,能夠分爲下面四個步驟。app
配置部署服務器ssh
對應用程序進行版本控制工具
遠程部署應用程序測試
版本控制推動部署
對生產服務器的基本配置,包括Web靜態服務器、數據庫、版本控制搭建、防火牆等的控制不在本文討論範圍內。它們之中任何一點拿出來都夠寫一本書了。
首先,要在部署服務器能夠訪問到的地方建立一個新的版本庫。
讀者能夠在公司/實驗室裏搭建GitLab,或者鏈接到GitHub上。若是是本身搭建GitLab,其實徹底能夠把Git服務器和生產服務器放在同一臺機器上。能夠經過如下命創建Server端的遠程版本庫,也能夠經過訪問Git服務器的Web界面自行操做。
$ mkdir -p ~/git/project.git $ cd ~/git/project.git $ git --bare init
值得注意的是,即便是把Git Server和Web Server放在同一臺機器上,Capistrano也是經過Web服務的形式訪問Git。這裏能夠配置公鑰來簡化整個流程。
$ test -e ~/.ssh/id_dsa.pub || ssh-keygen -t dsa $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
還有一件很是重要的事情:Capistrano將在應用程序目錄名和Rails子目錄中插入名爲current
的目錄,其中包括public
子目錄。在用Capistrano部署好的項目中,目錄結構相似下面的樣子(current
是當前部署的版本,releases
是該分支下根據版本生成的曾經的項目,shared
中是各個版本共享的資源):
$ ls project > current releases shared
而這個public
目錄就是咱們熟悉的Rails程序中靜態資源目錄;也就是說,不論你用Apache或Ngnix仍是其餘Web服務器來部署靜態資源,須要把這個目錄設置爲根目錄。以Apache配置爲例:
DocumentRoot /home/project/current/public/
到此爲止,對服務器的預先配置就已經完成了,接下來的工做均可以在開發環境中完成。
最開始,要在項目的Gemfile中加入Capistrano gem:
... gem 'capistrano' ...
而後執行命令bundle install
來安裝gem。接下來執行一條很重要的命令,它的做用是把項目中用到的gem及其版本號都記錄下來:
$ bundle pack //而後能夠作一個版本記錄,並推送到遠程庫 $ git add . $ git commit -m "install capistrano & bundle gems" $ git push origin master
以上,已經完成了項目gem整理。接下來咱們要把項目代碼放入生產環境。
接下來的過程,咱們能夠先猜想一下:
把代碼pull到服務器的DocumentRoot
在生產服務器上生成數據庫
安裝gem
重啓Passenger
……
這些事情,能夠想到的話,就能夠手動來作;可是等下,要Capistrano是作什麼的……
沒錯,到了這一步,就能夠顯示Capistrano的威力了:自動化部署。以上的事情能夠全交給它來作,固然前提是要寫一份自動化部署的腳本。
首先,在開發環境的項目根目錄中執行命令:
$ capify [add] writing './Capfile' [add] writing './config/deploy.rb' [done] capified! //Capistrano3中使用下面的命令 $ cap install
如今多出來了兩個文件:Capfile
和deploy.rb
,前者是Capistrano對Rakefile的模擬,不須要改動,後者是一個自動化的腳本,須要編輯的就是這個。這個文件裏須要用到一些Capistrano的DSL,能夠看這裏參考。在此給出一份比較簡單的腳本做爲參考,它是上面命令生成的默認腳本。
# config valid only for Capistrano 3.1 lock '3.1.0' set :application, 'my_app_name' set :repo_url, 'git@example.com:me/my_repo.git' namespace :deploy do desc 'Restart application' task :restart do on roles(:app), in: :sequence, wait: 5 do # Your restart mechanism here, for example: # execute :touch, release_path.join('tmp/restart.txt') end end after :publishing, :restart after :restart, :clear_cache do on roles(:web), in: :groups, limit: 3, wait: 10 do # Here we can do anything such as: # within release_path do # execute :rake, 'cache:clear' # end end end end
在修改好:application
、:repo_url
等值後,就能夠開始進行部署了。
第一次部署的時候,請運行:
$ cap deploy:setup
以後會要求輸入服務器密碼。鏈接成功後會在生產服務器上生成必要的目錄。
若是想測試配置,看還有沒有別的問題,能夠運行:
$ cap deploy:check
一旦解決完全部問題,就能夠運行下面的命令,進行數據庫生成,並完成部署:
$ cap deploy:migrate $ cap deploy
至此,就已經把項目部署到生產服務器上了。
已經部署完了麼?
並非這樣的,不要忽視掉最開始強調版本控制的用意。Capistrano能讓你在持續開發的狀況下進行版本推動部署,而操做很是簡單。每次作好提交、並把版本庫推送到遠端後,就能夠運行cap deploy
進行部署。
若是有某些緣由,須要回到上一個部署的版本,執行命令:
$ cap deploy:rollback
沒錯!整個部署的過程就是這樣。
若是想掌握關於它的高級用法,能夠看Wiki文檔。
本文只是以Rails爲例講解了Capistrano的用法,實際上它還能夠用來部署其餘語言寫的Web應用程序,好比Java、PHP、Python等,讀者有興趣的話能夠繼續探索下去。