使用capistrano从不同的git分支部署
我正在使用capistrano部署RoR应用程序。 代码库在git仓库中,分支被广泛用于开发。  Capistrano使用deploy.rb文件进行设置,其中一个是从中部署的分支。 
 我的问题是这样的:比方说,我从主创build一个新的分支A. 部署文件将引用master分支。 我编辑,所以可以部署到testing环境。 我完成了该function的工作,并将分支A合并到master中 。 由于来自A的deploy.rb文件是新鲜的,所以它被合并,现在主分支中的deploy.rb引用A。 时间再次编辑。 
这是很多看似不必要的手动编辑 – 参数应该始终与当前分支名称匹配。 最重要的是,很容易忘记每次编辑设置。
什么是自动化这个过程的最好方法?
编辑:原来有人已经做了我所需要的 :
今天早上我有机会将git仓库的一个分支部署到一个登台服务器上,但是却没有想到怎么做。 通过Capistrano源代码的快速search显示,我可以在我的部署脚本中使用set
:branch "branch_name"。 我试了一下,它的工作。 然后我想我需要在我所有的分支上做类似的改变。 当然,我是一个懒惰的草皮,并想知道是否没有更好的方法。如果你不熟悉git,那么git branch命令的输出就是一个分支列表,其中有一个星号标记了你的本地机器上当前签出的分支。 例如:
> git branch * drupal_authentication fragment_caching master所以,我想,如果我只是parsing输出,并search标记为当前的分支:
set :branch, $1 if `git branch` =~ /\* (\S+)\s/m现在,我可以从单个共享的部署脚本部署本地机器上的任何分支。
这适用于Capistrano> = 3.1:
将此行添加到config / deploy.rb:
 set :branch, ENV['BRANCH'] if ENV['BRANCH'] 
然后打电话给capistrano:
 cap production deploy BRANCH=master 
该解决scheme适用于Capistrano <3.1 :
 #call with cap -s env="<env>" branch="<branchname>" deploy set :branch, fetch(:branch, "master") set :env, fetch(:env, "production") 
使用Capistrano 3.1.0+,这些都没有为我工作了。 相反,根据他们的评论说明:
  ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp } 
 但是,你不想用ask ,否则会提示你。 相反,你应该使用set 。  HEAD是最顶级的分支。 所谓的“边缘”。 如果你想要一个不同的分支,用你的分支名称replaceHEAD ,例如: master , staging等。 
 以示例结束,在/config/deploy/production.rb ,可能包含以下行: 
  set :branch, proc { `git rev-parse --abbrev-ref master`.chomp } 
…要么
  set :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp } 
 顺便说一句, HEAD是默认设置,所以不需要在文件中真正地声明。 可能在/config/deploy/edge.rb使用得更好。 
 在/config/deploy/staging.rb ,可能包含以下行: 
  set :branch, proc { `git rev-parse --abbrev-ref staging`.chomp } 
…要么
  set :branch, proc { `git rev-parse --abbrev-ref test`.chomp } 
你明白了!
我希望这些例子可以帮助capistrano (^_^)的未来用户
有了多级,现在实际上是:
 cap production deploy -s branch=my-branch 
以前的文章语法在我的环境中不起作用
另一种方法是:
在deploy.rb / stage.rb中:
 set :branch, ENV['BRANCH'] || 'develop' 
在命令行上:
 cap deploy BRANCH=featurex 
这给你一个默认的分支(对于不同的环境可能是不同的),以及在你想要的时候改变分支的能力。
或者,你可以从命令行构build它,你有一个默认的分支和环境,你也可以传递参数给cap call,可以包括环境和分支。 这可能是一个显式传递的分支,或者你可以有一个参数,这个参数表示当前分支,如你所列出的链接所描述的。
 #call with cap -S env="<env>" branch="<branchname>" deploy ... # Prevents error if not parameter passed, assumes that default 'cap deploy' command # and should deploy the master branch to the production server set(:env, 'production') unless exists?(:env) set(:branch, 'master') unless exists?(:branch) if !env.nil? && env == "production" role :web, "production_ip_address" else # add more as needed role :web, "development_ip_address" end if !branch.nil? && branch == "current" set :branch, $1 if `git branch` =~ /\* (\S+)\s/m elsif !branch.nil? set :branch, branch else # add more as needed set :branch, "master" end ... 
代码示例从这里大量借用
如果你正在使用capistrano-multistage ,你只需要运行
 cap -s branch=$MY_BRANCH deploy 
要么
 cap -s branch=$MY_BRANCH production deploy 
 而无需对deploy.rb进行任何进一步的编辑。 
这个命令不会工作了:
 cap deploy -s branch=your_branch 
 在capistrano v3 +中删除了对-sS标志的支持。 
 在这里你可以阅读更多关于它: 链接 
 这是在几个答案中提到,但目前是不正确的。 
 什么对我有用: 
 在deploy.rb文件中添加 
 set :branch, ENV['BRANCH'] || :master 
然后运行:
 BRANCH=your_branch cap deploy 
另外请注意,为了成功运行这个命令,你需要在master分支上。
这个解决scheme应该适用于所有版本的Capistrano。
 def branch_name(default_branch) branch = ENV.fetch('BRANCH', default_branch) if branch == '.' # current branch `git rev-parse --abbrev-ref HEAD`.chomp else branch end end set :branch, branch_name('master') 
用法:
 BRANCH=. cap [staging] deploy # => deploy current branch BRANCH=master cap [staging] deploy # => deploy master branch cap [staging] deploy # => deploy default branch 
即时通讯使用版本3.3.5 ,我有这个工作:
 set :branch, 'develop' 
一般答案:
 如果您的设置文件的内容已经从环境修改为环境,则应该将该行作为“模板”(使用表示variables名称的string,例如@BRANCH_NAME@或@ENV_NAME@ )。 
 然后,您将有一个(版本化的)脚本能够读取您的configuration文件,并用您的部署过程所需的适当值replace“ @BRANCH_NAME@ ”variables。 
对于capistrano 3用户:
 desc "prompt for branch or tag" task :git_branch_or_tag do on roles(:all) do |host| run_locally do execute :git, 'tag' tag_prompt = "Enter a branch or tag name to deploy" ask(:branch_or_tag, tag_prompt) tag_branch_target = fetch(:branch_or_tag, 'master') set(:branch, tag_branch_target) end end end before 'deploy:updated', :git_branch_or_tag 
方法1:设置阶段特定分支(例如testing,生产)进行部署
 将branchconfiguration放在stage文件中而不是“deploy.rb”中,并设置该阶段的目标分支以从中进行部署。 
 对于具有关联分支名称test和production的两阶段应用,configuration将如下所示, 
 # app_root/config/deploy/test.rb ... set :branch, "test" ... # app_root/config/deploy/production.rb ... set :branch, "production" ... 
这种方法可以从特定阶段的分支部署。 所以,只需要额外的步骤就是合并或重新绑定来自基本分支的最新代码。
方法2:直接从任何分支部署(使用标签)
 另一种方法是使用标签进行部署。 为了使用标签进行部署,请设置branchconfiguration。 在'deploy.rb'中如下所示, 
 set :branch, `git describe --tags $(git rev-list --tags --max-count=1)`.chomp 
 并且,如果相关联的标签模式匹配(例如/.*-test$/ ),则将CIconfiguration为有条件地部署到不同阶段。 
现在,可以从任何分支进行部署,
- 
首先,从任何分支创build一个标签, git tag -a v0.1.0-test -m“Version 0.1.0-test” 
- 
而且,推 git push origin v0.1.0-test 
注:以上方法基于Capistrano 3。