使用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,生产)进行部署
将branch
configuration放在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:直接从任何分支部署(使用标签)
另一种方法是使用标签进行部署。 为了使用标签进行部署,请设置branch
configuration。 在'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。