使用capistrano从不同的git分支部署

我正在使用capistrano部署RoR应用程序。 代码库在git仓库中,分支被广泛用于开发。 Capistrano使用deploy.rb文件进行设置,其中一个是从中部署的分支。

我的问题是这样的:比方说,我从创build一个新的分支A. 部署文件将引用master分支。 我编辑,所以可以部署到testing环境。 我完成了该function的工作,并将分支A合并到master中 。 由于来自Adeploy.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 ,否则会提示你。 相反,你应该使用setHEAD是最顶级的分支。 所谓的“边缘”。 如果你想要一个不同的分支,用你的分支名称replaceHEAD ,例如: masterstaging等。

以示例结束,在/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”中,并设置该阶段的目标分支以从中进行部署。

对于具有关联分支名称testproduction的两阶段应用,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。