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

时间:2009-10-06 08:06:01

标签: git capistrano

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

我的问题是这样的:假设我从 master 创建一个新分支 A 。部署文件将引用 master 分支。我编辑它,因此可以部署 A 来测试环境。我完成了该功能,并将分支 A 合并到 master 中。由于来自 A deploy.rb文件更新,它会被合并,现在分支中的deploy.rb引用 A 。是时候再次编辑了。

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

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

修改:结果someone already had done exactly what I needed

  

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

     

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

> git branch
* drupal_authentication
fragment_caching
master
     

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

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

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

13 个答案:

答案 0 :(得分:145)

这适用于Capistrano> = 3.1:

将此行添加到config/deploy.rb

set :branch, ENV['BRANCH'] if ENV['BRANCH']

然后用:

调用capistrano
cap production deploy BRANCH=master

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

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

set :branch, fetch(:branch, "master")
set :env, fetch(:env, "production")

答案 1 :(得分:30)

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

   ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

但是,您不想使用ask或它会提示您。相反,您应该使用setHEAD是最重要的分支;它被称为'边缘'。如果您想要其他分支,请将HEAD替换为您的分支名称,例如: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 }

btw,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用户(^ _ ^)

答案 2 :(得分:27)

多阶段,现在实际上是:

cap production deploy -s branch=my-branch

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

答案 3 :(得分:24)

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

在deploy.rb / stage.rb中:

set :branch, ENV['BRANCH'] || 'develop'

在命令行上:

cap deploy BRANCH=featurex

这为您提供了一个默认分支(对于不同的环境可能会有所不同),并且可以根据需要更改分支。

答案 4 :(得分: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
...

Code example borrowed heavily from here

答案 5 :(得分:10)

如果您使用capistrano-multistage,则只需运行

cap -s branch=$MY_BRANCH deploy

cap -s branch=$MY_BRANCH production deploy

无需进一步修改deploy.rb

答案 6 :(得分:7)

此命令不再适用:

cap deploy -s branch=your_branch

在capistrano v3 +中删除了对-sS标志的支持。
在这里,您可以阅读更多相关信息:link
在几个答案中提到了它,但目前不正确。

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

set :branch, ENV['BRANCH'] || :master

然后运行:

BRANCH=your_branch cap deploy

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

答案 7 :(得分:3)

此解决方案适用于所有版本的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

答案 8 :(得分:2)

我使用版本 3.3.5 ,我有这个工作:

set :branch, 'develop'

答案 9 :(得分:1)

对于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

答案 10 :(得分:1)

方法1:设置阶段特定分支(例如测试,生产)以进行部署

branch配置放在舞台文件中而不是'deploy.rb',并设置要从中部署的舞台的目标分支。

对于具有关联分支名称testproduction的两阶段应用,配置将如下所示,

# app_root/config/deploy/test.rb
...
set :branch, "test"
...

# app_root/config/deploy/production.rb
...
set :branch, "production"
...

此方法支持从阶段特定分支进行部署。因此,只需要合并或重新定义基本分支中的最新代码。

方法2:直接从任何分支部署(使用标记)

另一种方法是使用标记进行部署。要使用标记进行部署,请设置branch配置。在'deploy.rb'中,如下所示,

set :branch, `git describe --tags $(git rev-list --tags --max-count=1)`.chomp

并且,如果关联的标记模式匹配(例如/.*-test$/),则将CI配置为有条件地部署到不同的阶段。

现在,可以从任何分支进行部署,

  • 首先,从任何分支

    创建一个标签

    git tag -a v0.1.0-test -m“Version 0.1.0-test”

  • 并推送

    git push origin v0.1.0-test

注意:以上方法基于Capistrano 3。

答案 11 :(得分:0)

一般答案:

如果您的设置文件的内容已从环境修改为环境,则应将该行设为“模板”(使用表示变量名称的字符串,如@BRANCH_NAME@@ENV_NAME@)。< / p>

然后你会有一个(版本化的)脚本能够读取你的配置文件,并用你的部署过程所需的适当值替换“@BRANCH_NAME@”变量。

答案 12 :(得分:0)

git rev-parse --abbrev-ref HEAD

将返回您所在的当前分支。

我总是设置gpsh而不是git push -u origin branch_name

$ which gpsh
gpsh: aliased to git push -u origin `git rev-parse --abbrev-ref HEAD`