一般 config/deploy/staging.rb 的 branch 內容可能會設定成如下:

# config/deploy/staging.rb
# ...
set :branch, "staging"
set :rails_env, "staging"
# ...

我們團隊使用 GitHub Flow,常常會 deploy 非 master 的 branch 到 staging 上。照上面的 config 設定,要麻把 staging branch reset 到目前的 commit (很麻煩),不然就是把 set :branch 改成當前的 branch 名稱、但不 commit。

但即使如此,還是很麻煩,而且有時候會忘記改。

搜尋 & 嘗試了一下,最後我改成:

# config/deploy/staging.rb
# ...
set :branch, ENV["BRANCH"] || `git rev-parse --abbrev-ref HEAD`.chop
set :rails_env, "staging"
# ...

其中

`git rev-parse --abbrev-ref HEAD`.chop

可以丟到 rails console 執行看看,就是取得當前的 git branch name

這樣設定以後,只要在 terminal 下:

cap staging deploy

就會自動選擇當前的 branch 來 deploy 了(production 則當然保持 "master" 不改)。

另外,若有一些情況想要「在這個 branch 但 deploy 那個 branch」的話,可以:

BRANCH=other_branch cap staging deploy

這個技巧在 capistrano 2 跟 3 都適用。

2014-09-29 更新:Capistrano 不知道從何開始範例檔有以下的 code,與上面取得 branch 名稱的解法意思差不多,但使用 chomp 的確是比較好的習慣。

proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call