我正在使用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
现在,我可以在本地计算机上部署当前的任何分支 来自单个共享的部署脚本。
答案 0 :(得分:145)
这适用于Capistrano> = 3.1:
将此行添加到config/deploy.rb
:
set :branch, ENV['BRANCH'] if ENV['BRANCH']
然后用:
调用capistranocap 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
或它会提示您。相反,您应该使用set
。 HEAD
是最重要的分支;它被称为'边缘'。如果您想要其他分支,请将HEAD
替换为您的分支名称,例如: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 }
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
...
答案 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)
将branch
配置放在舞台文件中而不是'deploy.rb',并设置要从中部署的舞台的目标分支。
对于具有关联分支名称test
和production
的两阶段应用,配置将如下所示,
# app_root/config/deploy/test.rb
...
set :branch, "test"
...
# app_root/config/deploy/production.rb
...
set :branch, "production"
...
此方法支持从阶段特定分支进行部署。因此,只需要合并或重新定义基本分支中的最新代码。
另一种方法是使用标记进行部署。要使用标记进行部署,请设置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`