【问题标题】:Rails 4, capistrano 3, delayed_job - can't find bin/delayed_job on one of the serversRails 4、capistrano 3、delayed_job - 在其中一台服务器上找不到 bin/delayed_job
【发布时间】:2014-11-30 11:56:42
【问题描述】:

当我部署到pre 服务器时,一切正常。但是,如果我尝试部署到 staging 服务器,我会收到此错误:
bundler: command not found: bin/delayed_job

文件 - config/deploy/staging.rb

set :rails_env, 'staging'  
set :eager_load, :true  
set :unicorn_rack_env, 'staging'  
role :app, %w{deploy@x.x.x.x}  
role :web, %w{deploy@x.x.x.x}  
role :db, %w{deploy@x.x.x.x}  

set :rvm_type, :auto                    # Defaults to: :auto  
set :rvm_ruby_version, '2.1.2'  

set :rails_env, 'staging'  
set :eager_load, :true    
role :app, %w{deploy@x.x.x.}  
role :web, %w{deploy@x.x.x.}  
role :db, %w{deploy@x.x.x.}  
set :rvm_type, :auto                    # Defaults to: :auto  
set :rvm_ruby_version, '2.1.2'  
set :deploy_to, '/var/www/app'  
server 'x.x.x', user: 'deploy', roles: %w{web app} , port: 222  
set :unicorn_pid, ->{ "#{deploy_to}/shared/tmp/pids/unicorn.pid" }  
set :scm, :git  
set :ssh_options, { user: 'superman' }  
set :keep_releases, 5  

重新启动延迟的作业 -

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

  def delayed_job_roles  
    fetch(:delayed_job_server_role, :app)   
  end   

  desc 'Stop the delayed_job process'  
  task :stop do  
    on roles(delayed_job_roles) do  
      within release_path do  
        with rails_env: fetch(:rails_env) do  
          execute :bundle, :exec, :'bin/delayed_job', :stop  
        end  
      end  
    end   
  end  

  desc 'Start the delayed_job process'
  task :start do  
    on roles(delayed_job_roles) do  
      within release_path do  
        with rails_env: fetch(:rails_env) do  
          execute :bundle, :exec, :'bin/delayed_job', args, :start  
        end  
      end  
    end   
  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 :bundle, :exec, :'bin/delayed_job', args, :restart  
        end  
      end  
    end   
  end  
end 

你能帮我解决这个问题吗?提前致谢!

更新 1
有关此错误的更多信息:
lib/capistrano/tasks/delayed_job.rake:33 这是execute :bundle, :exec, :'bin/delayed_job', args, :restart

【问题讨论】:

    标签: ruby-on-rails-4 delayed-job capistrano3


    【解决方案1】:

    检查您是否可以在 #{deploy_to}/shared/bin/ 的暂存服务器上看到延迟作业

    如果不存在,请从项目的 bin 文件夹中复制它。

    【讨论】:

    • 两个地方都没有
    • 也可能是bin/delayed_job 没有可执行权限。请参阅this other question 可以通过在尝试启动/停止/重启等之前从当前版本目录运行chmod +x bin/delayed_job 来修复
    【解决方案2】:

    你应该在目标服务器上运行一次:

    bundle exec rails generate delayed_job
    

    这将在shared/bin中生成delayed_job可执行脚本

    【讨论】:

    • 您是否有任何理由不想在 dev 中生成 bin 并添加到源代码中?还是在每次部署时在服务器端运行 generate 更好?谢谢,
    • maxkaplan 您应该在开发中生成此文件并将 bin 文件检查到源代码管理中
    【解决方案3】:

    最好使用 Capistrano::DelayedJob Gem

    对 Capistrano 3.x 的延迟作业支持

    将此行添加到应用程序的Gemfile

    gem 'capistrano3-delayed-job', '~> 1.0'
    

    要求在 Capfile 中使用默认任务:

    require 'capistrano/delayed-job'
    

    将此添加到您的 deploy.rb 文件中

    after 'deploy:published', 'restart' do
        invoke 'delayed_job:restart'
    end
    

    更多可配置选项https://github.com/platanus/capistrano3-delayed-job

    【讨论】:

      【解决方案4】:

      除了由 Rider 回答的操作。如果 bin/delayed_job 在那里丢失,以下将在远程执行 'bundle exec rails generate delayed_job'。放到 config/deploy.rb 文件中。

      namespace :delayed_job do
      
        desc "Install Deployed Job executable if needed"
        task :install do
          on roles(delayed_job_roles) do |host|
            within release_path do
              # Only install if not already present
              unless test("[ -f #{release_path}/#{delayed_job_bin} ]")
                with rails_env: fetch(:rails_env) do
                  execute :bundle, :exec, :rails, :generate, :delayed_job
                end
              end
            end
          end
        end
      
        before :start, :install
        before :restart, :install
      
      end
      

      【讨论】:

        【解决方案5】:

        发生这种情况是因为服务器上缺少 delayed_job 可执行文件。它应该存在于bin 目录中。要解决此问题,您应该在开发机器上生成可执行文件并将其签入源代码管理。

        此命令将为您生成可执行文件:

        bundle exec rails generate delayed_job

        【讨论】:

          【解决方案6】:

          请检查您是否正确设置了 rails_env 系统变量。

          【讨论】:

            猜你喜欢
            • 2011-05-23
            • 2011-02-04
            • 2013-07-04
            • 2014-05-26
            • 1970-01-01
            • 2010-11-23
            • 2014-10-30
            • 2013-03-05
            • 2014-11-12
            相关资源
            最近更新 更多