Using Capistrano to deploy current branch

CapistranoLogo

Capistrano 是一套用 Ruby 語言所寫的 Deploy Tool,可以用來管理多台伺服器自動化流程,在 Rails 專案內都會使用這套 Deploy Tool,也方便管理遠端機器。這次有個問題是,假設我們在 Staging 或 Production 設定檔分別定義了 :branch 變數如下

set :branch, "master"
set :env, "production"

這時候可以透過底下指令來 Deploy 到遠端伺服器

$ bundle exec cap production deploy

假設這次想要 deploy 不同 branch 到 Production Server,就必須修改 production.rb 設定檔,每次不同 branch 就要改一次,會比較麻煩,要解決此問題只需要將上述程式碼改成可以用 command line 方式管理

set :branch, fetch(:branch, "master")
set :env, fetch(:env, "production")

將指令換成

$ bundle exec cap -S branch="my-branch" production deploy

也就可以達成目的了。多人同時在開發專案時,一定會有很多 feature 或 issue branch,開發者會希望目前在哪個 Branch,程式碼 commit 後,就直接用 cap deploy,將現在的 Branch 程式碼 Deploy 到伺服器,方便其他人測試,要達成此功能,請修改 deploy.rb 加入底下程式碼

# Figure out the name of the current local branch
def current_git_branch
  branch = `git symbolic-ref HEAD 2> /dev/null`.strip.gsub(/^refs\/heads\//, '')
  branch
end

# Set the deploy branch to the current branch
set :branch, fetch(:branch, current_git_branch)

完成後,請將 config/deploy/*.rb 內的 set :branch 全部拿掉,這樣切到任何 Branch,就直接下 cap deploy 即可,,當然也可以透過 command line 方式指定 Branch 來 Deploy。最後附上 Capistrano 的目錄架構圖

├── Capfile
├── config
│   ├── deploy
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
└── lib
    └── capistrano
            └── tasks

參考文章: