I am using capistrano to deploy a RoR application. The codebase is in a git repository, and branching is widely used in development. Capistrano uses deploy.rb
f
With multistage, it's actually now:
cap production deploy -s branch=my-branch
The previous post syntax does not work in my environment
This command won't work anymore:
cap deploy -s branch=your_branch
Support for -sS
flags was removed in capistrano v3+.
Here you can read more about it: link
It was mentioned in couple of answers, but currently is not correct.
What works for me:
in deploy.rb
file add
set :branch, ENV['BRANCH'] || :master
then run:
BRANCH=your_branch cap deploy
Also please notice that, in order to successfully run this command, you need to be on master branch.
Alternatively you could structure it from the command line where you have a default branch and environment and also you are able to pass parameters to the cap call which could include the environment and the branch to use. This could be a branch that is explicitly passed or you could have a parameter which would indicate current branch as described in the link you listed.
#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
Using Capistrano 3.1.0+, none of these were working for me anymore. Instead, according to their commented instructions:
ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
But, you don't want to use ask
or it will prompt you. Instead you should use set
. HEAD
is the top most branch; 'edge' as it's called. If you want a different branch, replace HEAD
with your branch name, eg: master
, staging
, etc.
To conclude with examples, in /config/deploy/production.rb
, you might include this line:
set :branch, proc { `git rev-parse --abbrev-ref master`.chomp }
...or
set :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }
btw, HEAD
is the default setting, so no need to really state that in file. Might be used better in a /config/deploy/edge.rb
.
In /config/deploy/staging.rb
, you might include this line:
set :branch, proc { `git rev-parse --abbrev-ref staging`.chomp }
...or
set :branch, proc { `git rev-parse --abbrev-ref test`.chomp }
You get the idea!
I hope these examples help future users of capistrano (^_^)
For capistrano 3 users:
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
Im using version 3.3.5 and i have this working:
set :branch, 'develop'