15

I'm in the process of upgrading from Capistrano 2 to Capistrano 3. In Cap 2 I was using the following to take a command line argument as the branch name (otherwise default to master)

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

If I called cap deploy it would deploy the master branch. But it also let me do something like this:

cap deploy -S branch=foo

Which would deploy the foo branch.

Now, in Capistrano 3, if I try to run the above I get an error: invalid option: -S.

What's the proper way to pass an argument via the command line now?

jmromer
  • 2,212
  • 1
  • 12
  • 24
Brad Dwyer
  • 6,305
  • 8
  • 48
  • 68
  • I found [this discussion](https://groups.google.com/forum/#!topic/capistrano/-MWCt9faKz4) but no resolution that I could tell. – Brad Dwyer Jan 09 '14 at 18:31

3 Answers3

40

What I ended up doing was setting an ENV variable.

So now I can call

cap production deploy branch=mybranch

And it will deploy mybranch. If I run a simple cap production deploy it will deploy the default branch (master if you don't set one, but I've changed mine below to default to demonstrate)

This is the code I put in my deploy.rb file:

set :branch, "default"
if ENV['branch']
        set :branch, ENV['branch']
end
Brad Dwyer
  • 6,305
  • 8
  • 48
  • 68
10

Rake tasks (which cap is using) are supporting arguments.

namespace :test do
  desc "Test task"
  task :test, :arg1 do |t, args|
    arg1 = args[:arg1]
    puts arg1
  end
end

cap -T outputs:

cap yiic:test[arg1] # Test task

Example of invocation:

cap production yiic:test[test1]

Also, here is a helpful post

P.S.: you should use env vars for "global" settings. Like common values for multiple tasks.

senz
  • 1,980
  • 1
  • 16
  • 14
1

To give an updated and working solution for Capistrano 3 (as it took me a while to find and too many tests to make it works).

My files are like:

config/
    deploy/
        staging.rb
        production.rb
    deploy.rb
...
Capfile

In staging.rb I have:

server 'staging', roles: %w(db)

set :branch,    ENV.fetch('REVISION', 'master')
set :use_sudo,  false
set :user,      'toto'
set :deploy_to, '/var/www'

(In server 'staging', staging is a SSH connexion, defined in my .ssh/config)

Then, to deploy a specific revision, I just need to call:

cap staging deploy REVISION=3b2d9ab

Where 3b2d9ab is the Git commit hash (short or long version).

LaurentG
  • 474
  • 4
  • 16