2015-05-02 2 views
2

Мое задание cron отлично работает на моей локальной машине после запуска whenever -w, после развертывания на моем VPS я получаю эту ошибку, release 20150415044915 doesn't exist. Есть идеи?Gemfile не найден при запуске задания Cron с Capistrano 3 и всякий раз, когда gem

Я посмотрел на кронтаб -е, путь также выглядит хорошо, где 20150502114703 правильный релиз:

0 1 * * 1 /bin/bash -l -c 'cd /home/hey_production/releases/20150502114703 && bin/rails runner .... 

Error Log:

/usr/local/rvm/gems/ruby-2.1.3/gems/bundler-1.7.3/lib/bundler/definition.rb:22:in `build': /home/hey_production/releases/20150415044915/Gemfile not found (Bundler::GemfileNotFound) 
    from /usr/local/rvm/gems/ruby-2.1.3/gems/bundler-1.7.3/lib/bundler.rb:154:in `definition' 
    from /usr/local/rvm/gems/ruby-2.1.3/gems/bundler-1.7.3/lib/bundler.rb:117:in `setup' 
    from /usr/local/rvm/gems/ruby-2.1.3/gems/bundler-1.7.3/lib/bundler/setup.rb:17:in `<top (required)>' 
    from /usr/local/rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:135:in `require' 
    from /usr/local/rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:135:in `rescue in require' 
    from /usr/local/rvm/rubies/ruby-2.1.3/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:144:in `require' 
    from bin/rails:14:in `<main>' 
+0

'Gemfile' будет найден в папке' current' пути выпуска. то есть в '/ home/hey_production/релизы/20150415044915/current/Gemfile' - не'/home/hey_production/релизы/20150415044915/Gemfile'. –

+0

Он должен указывать на '/ home/hey_production/current/Gemfile'. Release * 20150415044915 * может быть очищен в будущем. –

+0

Я не понимаю голоса. –

ответ

2

В основном переменная среды отсутствует, что рассказывает cron, где искать Gemfile. поэтому вам нужно добавить эту переменную в свою среду в то время, когда cron пытается ее запустить. Вы можете сделать это в вашем schedule.rb:

env BUNDLE_GEMFILE, ENV["/home/hey_production/current/Gemfile"] 

или непосредственно внутри кронтаб файл с помощью команды crontab -e (до записи хрон):

BUNDLE_GEMFILE="/home/hey_production/current/Gemfile" 

Надеется, что это помогает.

EDIT Забыли символ выше в schedule.rb

Линия в schedule.rb должна быть.

env :BUNDLE_GEMFILE, ENV["/#{path}/Gemfile"] 

или

env :BUNDLE_GEMFILE, ENV["/home/hey_production/current/Gemfile"] 
+0

Спасибо, вставьте BUNDLE_GEMFILE ="/home/hey_production/current/Gemfile "в crontab -e works и env BUNDLE_GEMFILE, ENV ["/home/hey_production/current/Gemfile "] не удалось установить BUNDLE_GEMFILE при развертывании с использованием Capistrano, любой идеи? – user1883793

+0

Да. Я не уверен в синтаксисе в файле расписания. Я вернусь к вам с правильным синтаксисом. –

+1

Я обновил ответ. см. редактирование –

0

Как следить за предыдущий ответ, установить переменную ENV в всякий раз, когда внутри schedule.rb до расписания блоков, таких как:

def production? 
    @environment == 'production' 
end 

set :output, {:error => '/home/current/log/cron_error.log', :standard => '/home/current/log/cron.log'} 

every 2.hour, roles: [:utility] do 
    runner "/home/current/lib/cron_jobs/launch_pending_emails.rb" 
end 

и внутри ваш deploy.rb конкретный файл для окружающей среды, то есть: staging.rb set env:

set :whenever_roles, [:utility] 
set :whenever_environment, defer { stage } 
set(:whenever_command) { "STAGE=#{stage} bundle exec whenever" } 
require 'whenever/capistrano' 
Смежные вопросы