user2959941
user2959941

Reputation: 51

Capistrano 3 - Understand tasks

i'm trying to understand how capistrano 3.1 is working, but because of its lack of documentation (its capistrano, so...), im running below my understanding.

Let me explain.

Here's a snippet taken from capistrano/rails gem

namespace :deploy do

  desc 'Runs rake db:migrate if migrations are set'
  task :migrate => [:set_rails_env] do
    on primary fetch(:migration_role) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, "db:migrate"
        end
      end
    end
  end

  #[...]
end

when execute cap integration deploy:migrate, it sends the following command: cd /srv/app/releases/20131106101722 && ( RAILS_ENV=integration /tmp/app/rvm-auto.sh . rake assets:precompile )

I changed a little bit the (non-working) code provided for delayed_job into that

namespace :delayed_job do
  def args
    fetch(:delayed_job_args, '')
  end

  def delayed_job_roles
    fetch(:delayed_job_server_role, :app)
  end

  def delayed_job_bin
    fetch(:delayed_job_bin, :'bin/delayed_job')
  end

  desc 'Restart the delayed_job process'
  task :restart do
    on roles(delayed_job_roles) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute delayed_job_bin, 'restart', args
        end
      end
    end
  end
end

And i get the following command cd /srv/winddle/current && ( RAILS_ENV=integration bin/delayed_job restart )

Obviously, it misses the bundle exec command. I dive deeply into capistrano/bundler and capistrano/rails to look for some kind of hook that would add bundle exec automatically to any of these commands (or force the register of ssh kits commands) but couldnt find any.

The only solution i found is to use execute :bundle, :exec, delayed_job_bin, :start, args which is not acceptable of course.

Anyone proper solution / explanation is welcomed. Regards

Upvotes: 5

Views: 2814

Answers (2)

Jimeux
Jimeux

Reputation: 3026

I'm literally just starting out with Capistrano and also struggling against a lack of documentation, so sorry if this post misses the mark.

v3 relies a lot on sshkit, so reading the documentation for that should be a big help. The readme gives an example that may solve your problem.

SSHKit.config.command_map.prefix[:rake].push("bundle exec")
puts SSHKit.config.command_map[:rake]
# => bundle exec rake

I also found an alternative solution in a Semaphore blog post.

SSHKit.config.command_map[:rake]  = "bundle exec rake"
SSHKit.config.command_map[:rails] = "bundle exec rails"

Upvotes: 1

jzzocc
jzzocc

Reputation: 396

Add the following line in deploy.rb, then use the code provided by delayed_job other than changing script to bin, which I see you already did:

set :bundle_bins, fetch(:bundle_bins, []).push('bin/delayed_job')

For users of RVM, add this instead:

set :rvm_map_bins, fetch(:rvm_map_bins, []).push('bin/delayed_job')

Source: https://github.com/capistrano/bundler#usage.

Upvotes: 1

Related Questions