基於Capistrano工具的Rails程序部署方案

本文基於Capistrano 2版本,文中的命令不必定適用於Capistrano 3。git

什麼是Capistrano?

簡單地講,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

如今多出來了兩個文件:Capfiledeploy.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等,讀者有興趣的話能夠繼續探索下去。

相關文章
相關標籤/搜索