5

我试图了解 capistrano 3.1 是如何工作的,但由于它缺乏文档(它的 capistrano,所以......),我的理解低于我的理解。

让我解释。

这是从 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

执行时cap integration deploy:migrate,它发送以下命令: cd /srv/app/releases/20131106101722 && ( RAILS_ENV=integration /tmp/app/rvm-auto.sh . rake assets:precompile )

我将为delayed_job 提供的(非工作)代码稍微更改为

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

我得到以下命令cd /srv/winddle/current && ( RAILS_ENV=integration bin/delayed_job restart )

显然,它错过了bundle exec命令。我深入研究 capistrano/bundler 和 capistrano/rails 来寻找某种钩子,它可以自动将 bundle exec 添加到这些命令中的任何一个(或强制注册 ssh kits 命令)但找不到任何。

我发现的唯一解决方案是使用 execute :bundle, :exec, delayed_job_bin, :start, args这当然是不可接受的。

欢迎任何适当的解决方案/解释。问候

4

2 回答 2

1

从字面上看,我只是从 Capistrano 开始,并且还在为缺乏文档而苦苦挣扎,如果这篇文章错过了标记,我深表歉意。

v3 很大程度上依赖于sshkit,因此阅读相关文档应该会有很大帮助。自述文件提供了一个可以解决您的问题的示例。

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

我还在Semaphore 博客文章中找到了替代解决方案。

SSHKit.config.command_map[:rake]  = "bundle exec rake"
SSHKit.config.command_map[:rails] = "bundle exec rails"
于 2014-01-05T12:33:24.060 回答
1

在 中添加以下行deploy.rb,然后使用delay_job 提供的代码,而不是更改scriptbin,我看到您已经这样做了:

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

对于 RVM 的用户,请添加以下内容:

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

来源:https ://github.com/capistrano/bundler#usage 。

于 2013-12-11T18:19:23.840 回答