1

我使用 Capistrano 进行部署,使用 Sidekiq 进行队列。我需要加载用户 ID 以在 deploy.rb 文件中设置 :sidekiq_queues 变量以执行 sidekiq 队列。现在我使用以下代码

set :sidekiq_queues, ::User.all.map {|u| "-q parsing_user_#{u.id}"}.join(" ") + " -q parsing_user_0"

但它会引发以下错误

./config/deploy.rb:29:in `load': uninitialized constant User (NameError)

我试图将“rubygems”和“active_record”放入deploy.rb,但没有帮助。结果我应该有sidekiq_queues ==“-q parsing_user_1 -q parsing_user_2 -q parsing_user_3 -q parsing_user_4 -q parsing_user_5 -q parsing_user_0”。硬编码队列名称不是解决方案。

4

1 回答 1

1

Capistrano 在本地执行 deploy.rb,它不会在 deploy.rb 中加载 Rails 环境。

这可能比它的价值更麻烦。特别是如果您想在远程服务器上执行此操作,您可能会考虑改为执行 Rake 任务。rake 任务中的=> :environment确保您的 Rails 环境已加载。

# in deploy.rb
namespace :sidekiq do
  desc "Do something with queues"
  task :queues, :roles => :web  do
    run "cd #{current_path} ; RAILS_ENV=#{rails_env} bundle exec rake sidekiq:queues"
  end
end

# you'll need to decide when to execute this in your deployment process, 
# something like this:

after "deploy:update_code", "sidekiq:queues"



# in lib/tasks/sidekiq.rake
namespace :sidekiq do
  desc "Do something with queues"
  task :queues => :environment do
    queues = (User.scoped.pluck(:id) + [0]).map{|id| "-q parsing_user_#{id}"}.join(" ")
    # do what you need to do
  end
end
于 2012-11-23T13:41:38.143 回答