【问题标题】:whenever gem failing on deploy每当 gem 部署失败时
【发布时间】:2014-02-19 04:13:07
【问题描述】:

在终端执行 cap qa deploy 后,我在部署结束时收到以下错误:

failed: "sh -c 'cd [removed]/releases/[removed] && bundle exec whenever --update-crontab [removed] --set environment=production --roles db'" on [removed]

我首先感到困惑的是,当我使用 capistrano 和 deploy 时,为什么它在 db 角色上运行时命令?它不应该自动在应用角色上运行命令吗?

在服务器上: 捆绑器版本 1.3.5

gemfile:

gem 'whenever', require: false

schedule.rb:

env 'PATH', ENV['PATH']

set :output, "/log/cron.log"
set :stage, :environment_variable

every 5.minutes, :roles => [:app] do
  runner "[removed]"
end

every 1.day, :at => '0:01 am' do
    command "[removed]"
end

deploy.rb:

require 'capistrano/log_with_awesome'
require "bundler/capistrano"

set :application, "[REMOVED]"

set :scm, :git 

set :repository,  "[REMOVED]"

set :branch, "master"
set :deploy_via, :remote_cache 

set :user, "[REMOVED]"
set :password, "[REMOVED]"
set :deploy_to, "[REMOVED]"

set :keep_releases, 5

task :qa do

    set :domain, "[REMOVED]"
    role :web, "[REMOVED]", {:port => [REMOVED]} # Your HTTP server, Nginx
    role :app, "[REMOVED]", {:port => [REMOVED]} # This may be the same as your `Web` server
    set :env, "test"
end


task :production do

    set :domain, "[REMOVED]"
    role :web, "[REMOVED]", {:port => [REMOVED]} # Your HTTP server, Nginx
    role :app, "[REMOVED]", {:port => [REMOVED]} # This may be the same as your `Web` server
    set :env, "production"
end


set :use_sudo, false
default_run_options[:pty] = true


role :db, "[REMOVED]", {:port => [REMOVED], primary: true, :no_release => true}

after "deploy:setup", "deploy:chown"

namespace :bundle do 

    task :install, {:roles => :app} do
        run "cd #{release_path} && bundle install --deployment --without development test"
    end

end

before "deploy:assets:precompile" do

    transfer :up, "config/application.yml", "#{shared_path}/application.yml", :via => :scp

    run "ln -nfs #{shared_path}/application.yml #{release_path}/config/application.yml"

end

namespace :whenever do
  task :start, :roles => :app do
    run "cd #{release_path} && bundle exec whenever --update-crontab"
  end
end

namespace :deploy do 

    task :execute_migrations, :roles => :app do
        puts "RUNNING DB MIGRATIONS"
        run "cd #{current_path}; bundle exec rake RAILS_ENV=#{env} db:migrate"
    end

    task :chown do
        run "#{try_sudo} chown -R #{user} #{deploy_to}"
    end

    task :restart_nginx, {:roles => :web} do
        run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
    end

    before "deploy:restart_nginx", "deploy:execute_migrations"

    after :deploy, "deploy:restart_nginx"

    after "deploy:restart_nginx", "deploy:cleanup"

    after "deploy:update", "whenever:start"


end

当我 ssh 进入服务器并在那里运行命令时:

[REMOVED]@[REMOVED]/current$ bundle exec whenever --update-crontab
/var/lib/gems/1.9.1/gems/bundler-1.3.5/lib/bundler/runtime.rb:216: warning: Insecure world writable dir [REMOVED] in PATH, mode 040777
[write] crontab file updated

我通过运行:crontab -l 检查了 crontab 文件,这就是我在 crontab 中得到的:

[REMOVED]@[REMOVED]/current$ crontab -l
PATH=/[REMOVED]/releases/[REMOVED]/vendor/bundle/ruby/1.9.1/bin:/home/[REMOVED]/.rbenv/shims:/home/[REMOVED]/.rbenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

#Begin Whenever generated tasks for: /[REMOVED]/releases/[REMOVED]/config/schedule.rb
PATH=/[REMOVED]/releases/[REMOVED]/vendor/bundle/ruby/1.9.1/bin:/home/[REMOVED]/.rbenv/shims:/home/[REMOVED]/.rbenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/bash -l -c 'cd /[REMOVED]/releases/[REMOVED] && script/rails runner -e production '\''/[REMOVED]/current/script/[REMOVED].rb'\'''

1 0 * * * /bin/bash -l -c '/[REMOVED]/current/script/[REMOVED].rb'

#End Whenever generated tasks for: /[REMOVED]/releases/[REMOVED]/config/schedule.rb

然后由于第一个 cron 作业(通过电子邮件发送到我的工作电子邮件)而出现此错误:

/etc/profile.d/rvm.sh: line 67: __rvm_add_to_path: command not found
/home/[REMOVED]/.rbenv/versions/1.9.3-p448/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- bundler/setup (LoadError)
    from /home/[REMOVED]/.rbenv/versions/1.9.3-p448/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /[REMOVED]/releases/20140203065556/config/boot.rb:6:in `<top (required)>'
    from /home/[REMOVED]/.rbenv/versions/1.9.3-p448/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/[REMOVED]/.rbenv/versions/1.9.3-p448/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from script/rails:4:in `<main>'

【问题讨论】:

    标签: ruby-on-rails cron capistrano whenever


    【解决方案1】:

    要在使用您的方法时设置角色,请设置以下内容:

    set :whenever_roles,        ->{ :app }
    

    默认为:db

    其他可以设置的选项:

    set :whenever_roles,        ->{ :db }
    set :whenever_options,      ->{ {:roles => fetch(:whenever_roles)} }
    set :whenever_command,      ->{  }
    set :whenever_identifier,   ->{ fetch :application }
    set :whenever_environment,  ->{ fetch :rails_env, "production" }
    set :whenever_variables,    ->{ "environment=#{fetch :whenever_environment}" }
    set :whenever_update_flags, ->{ "--update-crontab #{fetch :whenever_identifier} --set #{fetch :whenever_variables}" }
    set :whenever_clear_flags,  ->{ "--clear-crontab #{fetch :whenever_identifier}" }
    

    https://github.com/javan/whenever/blob/master/lib/whenever/capistrano/v3/tasks/whenever.rake

    我倾向于创建如下自定义任务:

    namespace :whenever do
      task :start, :roles => :app do
        run "cd #{release_path} && bundle exec whenever --update-crontab"
      end
    end
    

    然后让 capistrano 在我想要的时候执行它:

    after "deploy:update", "whenever:start"
    

    通过这种方式,您可以随时使用以下内容重用/重新运行/测试:

    cap whenever:start
    

    【讨论】:

    • 谢谢!我会在 21 小时内将赏金奖励给你。它让我等待。
    • 您知道为什么会失败吗? 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /bin/bash -l -c 'cd /[REMOVED]/releases/[REMOVED] && script/ rails runner -e production '\''/[REMOVED]/current/script/[REMOVED].rb'\'''
    • 感谢您的回复。错误位于问题详细信息的底部
    • @PavanKatepalli 是 20140203065556 最新版本吗?我假设您使用的是whenever:start?尝试设置set :whenever_roles, -&gt;{ :app } 并告诉我...
    • @PavanKatepalli 发生这种情况有几个原因...如果您可以发布更新后的 deploy.rb,可能会有所帮助
    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 2015-09-22
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多