Rails 4、capistrano 3和delayed_job - 无法在其中一台服务器上找到bin/delayed_job

6

当我部署到 pre 服务器时,一切都很顺利。但是如果我尝试部署到staging服务器,我会遇到以下错误:
bundler:找不到命令: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

6个回答

9

您需要在目标服务器上运行一次:

bundle exec rails generate delayed_job

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

你是否有任何原因不想在开发阶段生成bins并将其添加到源代码中?还是说每次部署时在服务器端运行生成更好?谢谢。 - max kaplan
maxkaplan,你应该在开发过程中生成它,并将bin文件检入源代码控制。 - JamieD

2

检查一下在你的staging服务器上是否可以看到#{deploy_to}/shared/bin/路径下的delayed_job文件。

如果没有,请从你项目的bin文件夹中复制过去。


它在两个地方都缺失。 - Elmor
2
也有可能是 bin/delayed_job 没有可执行权限。请参考这个问题,可以通过在当前发布目录下运行 chmod +x bin/delayed_job 来解决,然后再尝试启动/停止/重启等操作。 - Jay Killeen

2
除了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

1
这是由于服务器上缺少delayed_job可执行文件。它应该存在于bin目录中。要解决这个问题,您应该在开发机器上生成可执行文件并将其检入源代码控制。此命令将为您生成可执行文件:bundle exec rails generate delayed_job

0
最好使用 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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接