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

Tom*_*oss 120 git capistrano

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

我的问题是这样的:比方说,我创建了一个新的分支一个.部署文件将引用master分支.我编辑它,所以可以部署A来测试环境.我完成了该功能,并将分支A合并到主服务器中.由于deploy.rb从文件一个是新鲜的,它被合并了,现在deploy.rb分支引用一个.是时候再次编辑了.

这是很多看似不必要的手动编辑 - 参数应始终与当前分支名称匹配.最重要的是,每次都很容易忘记编辑设置.

什么是自动化这个过程的最佳方法?

编辑:结果已经完成了我所需要的人:

今天早上我有机会将一个git存储库的一个分支部署到一个临时服务器,但是没有最模糊的想法.通过capistrano源代码快速搜索显示我可以:branch "branch_name"在部署脚本中使用set .我尝试了它,它的工作原理.然后我想我需要对所有分支进行类似的更改.当然,我是一个懒惰的草皮,并想知道是否有更好的方法.

如果您不熟悉git,git branch命令的输出是一个带有星号的分支列表,标记当前在本地计算机上签出的星号.例如:

> git branch
* drupal_authentication
fragment_caching
master
Run Code Online (Sandbox Code Playgroud)

所以,我想,如果我只是解析输出并搜索标记为当前的分支:

set :branch, $1 if `git branch` =~ /\* (\S+)\s/m
Run Code Online (Sandbox Code Playgroud)

现在,我可以从单个共享的部署脚本部署本地计算机上当前的任何分支.

win*_*ons 148

这适用于Capistrano> = 3.1:

将此行添加到config/deploy.rb:

set :branch, ENV['BRANCH'] if ENV['BRANCH']
Run Code Online (Sandbox Code Playgroud)

然后调用capistrano:

cap production deploy BRANCH=master
Run Code Online (Sandbox Code Playgroud)

此解决方案适用于Capistrano <3.1:

# call with cap -s env="<env>" branch="<branchname>" deploy

set :branch, fetch(:branch, "master")
set :env, fetch(:env, "production")
Run Code Online (Sandbox Code Playgroud)

  • 如果使用mustistage扩展,则不需要设置`env`,但这对我来说只使用分支 (4认同)

Eri*_*hic 32

使用Capistrano 3.1.0+,这些都不再适用于我.相反,根据他们的评论说明:

   ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
Run Code Online (Sandbox Code Playgroud)

但是,你不想使用ask或它会提示你.相反,你应该使用set.HEAD是最顶级的分支; 它被称为'边缘'.如果你想要一个不同的分支,替换HEAD你的支行名称,如:master,staging等等.

在结束示例中/config/deploy/production.rb,您可以包含以下行:

   set :branch, proc { `git rev-parse --abbrev-ref master`.chomp }
Run Code Online (Sandbox Code Playgroud)

...要么

   set :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
Run Code Online (Sandbox Code Playgroud)

顺便说HEAD一下,是默认设置,所以不需要在文件中真正说明.可能会更好地用于/config/deploy/edge.rb.

/config/deploy/staging.rb,你可以包括这一行:

   set :branch, proc { `git rev-parse --abbrev-ref staging`.chomp }
Run Code Online (Sandbox Code Playgroud)

...要么

   set :branch, proc { `git rev-parse --abbrev-ref test`.chomp }
Run Code Online (Sandbox Code Playgroud)

你明白了!

我希望这些例子能够帮助未来的capistrano用户(^_^)

  • `git rev-parse --abbrev-ref HEAD`用于找出HEAD所在的分支.运行`git rev-parse --abbrev-ref staging`将(几乎)总是输出`staging`.你可以使用`set:branch,'staging'`. (4认同)

Dav*_*sey 27

有了多级,它现在实际上是:

cap production deploy -s branch=my-branch
Run Code Online (Sandbox Code Playgroud)

以前的帖子语法在我的环境中不起作用


Pau*_*eon 24

我可以确认以下内容仍然适用于第3.11.0章第13/10/18号以及第2章:

在deploy.rb/stage.rb中:

set :branch, ENV['BRANCH'] || 'develop'
Run Code Online (Sandbox Code Playgroud)

在命令行上:

cap deploy BRANCH=featurex
Run Code Online (Sandbox Code Playgroud)

这为您提供了一个默认分支(对于不同的环境可能会有所不同),以及在需要时更改分支的功能.


nav*_*n87 15

或者,您可以从具有默认分支和环境的命令行构建它,并且您还可以将参数传递给cap调用,该调用可以包括要使用的环境和分支.这可能是显式传递的分支,或者您可以使用一个参数来指示当前分支,如您列出的链接中所述.

#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
...
Run Code Online (Sandbox Code Playgroud)

代码示例从这里大量借用

  • 我需要使用小写的`-s`来获取指定的分支 (3认同)

asy*_*ric 10

如果你正在使用capistrano-multistage,你只需要运行

cap -s branch=$MY_BRANCH deploy
Run Code Online (Sandbox Code Playgroud)

要么

cap -s branch=$MY_BRANCH production deploy
Run Code Online (Sandbox Code Playgroud)

没有任何进一步编辑你的deploy.rb.

  • OptionParser :: AmbiguousOption:不明确的选项:-s (3认同)
  • 那应该是`branch =`,而不是`branch -`. (2认同)

小智 8

此命令将不再起作用:

cap deploy -s branch=your_branch
Run Code Online (Sandbox Code Playgroud)

-sS在capistrano v3 +中删除了对标志的支持.
在这里你可以阅读更多关于它:链接
它在几个答案中提到,但目前是不正确的.

什么对我有用:
deploy.rb文件添加

set :branch, ENV['BRANCH'] || :master
Run Code Online (Sandbox Code Playgroud)

然后运行:

BRANCH=your_branch cap deploy
Run Code Online (Sandbox Code Playgroud)

另请注意,为了成功运行此命令,您需要在master分支上.


Von*_*onC 1

一般回答:

如果您有一个设置文件,其内容在不同环境之间进行修改,则应该将该行作为“模板”(使用表示变量名称的字符串,例如@BRANCH_NAME@@ENV_NAME@)。

然后,您将拥有一个(版本控制的)脚本,该脚本能够读取您的配置文件,并将“ @BRANCH_NAME@”变量替换为部署过程所需的适当值。