【问题标题】:Load ActiveRecord's data to Capistrano's deploy.rb将 ActiveRecord 的数据加载到 Capistrano 的 deploy.rb
【发布时间】:2012-11-23 21:41:38
【问题描述】:

我使用 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)

我尝试在 deploy.rb 中加入“rubygems”和“active_record”,但没有帮助。 结果我应该有 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”。 硬编码队列名称不是解决方案。

【问题讨论】:

    标签: ruby-on-rails capistrano sidekiq


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多