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
參考文章:
- Capistrano Deployment From Specific Git Branch
- Deploying from your current branch with Capistrano
- Using capistrano to deploy from different git branches