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
file for it's settings, one of them being the branch to deploy from.
My problem is this: let's say I create a new branch A from master. The deploy file will reference master branch. I edit that, so A can be deployed to test environment. I finish working on the feature, and merge branch A into master. Since the deploy.rb
file from A is fresher, it gets merged in and now the deploy.rb
in master branch references A. Time to edit again.
That's a lot of seemingly unnecessary manual editing - the parameter should always match current branch name. On top of that, it is easy to forget to edit the settings each and every time.
What would be the best way to automate this process?
Edit: Turns out someone already had done exactly what I needed:
This morning I had occasion to deploy a branch of a git repository to a staging server but hadn’t the foggiest idea how. A quick search through the capistrano source code revealed that I could use set
:branch "branch_name"
in my deploy script. I tried it and it worked. I then figured I would need to make a similar change across all my branches. Of course, I’m a lazy sod and wondered if there wasn’t a better way.If you’re not familiar with git, the output of the git branch command is a list of branches with an asterisk marking the one currently checked out on your local machine. For example:
> git branch * drupal_authentication fragment_caching master
So, I figured, what if I just parsed the output and searched for the branch marked as current:
set :branch, $1 if `git branch` =~ /\* (\S+)\s/m
Now I’m able to deploy whatever branch is current on my local machine from a single, shared, deploy script.
This command won't work anymore:
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 addthen run:
Also please notice that, in order to successfully run this command, you need to be on master branch.
Im using version 3.3.5 and i have this working:
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.
Code example borrowed heavily from here
I can confirm that the below still works in Cap 3.11.0 13/10/18 as well as Cap 2:
In deploy.rb / stage.rb:
On the command line:
This gives you a default branch (which could be different for different environments), and the ability to change branches when you want.
This solution should work with all versions of Capistrano.
Usage:
Using Capistrano 3.1.0+, none of these were working for me anymore. Instead, according to their commented instructions:
But, you don't want to use
ask
or it will prompt you. Instead you should useset
.HEAD
is the top most branch; 'edge' as it's called. If you want a different branch, replaceHEAD
with your branch name, eg:master
,staging
, etc.To conclude with examples, in
/config/deploy/production.rb
, you might include this line:...or
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:...or
You get the idea!
I hope these examples help future users of capistrano (^_^)