Cron (whenever) vs. bundler

Cron-joby generowane przez Whenever mają następującą postać:

* * * * * /u/apps/myapp/releases/20100318100534/script/runner -e production "Model.do_something"

Niestety Bundler oczekuje gemfile’a w katalogu, z którego odpalany jest dowolny skrypt ładujący środowisko aplikacji.
Co trochę ciężko w przypadku cronjobów spełnić, bo nie będę zaśmiecał katalogów serwera Gemfile’ami.

Oczywiście odpalenie zlecenia w formie

cd /u/apps/myapp/releases/20100318100534; script/runner -e production "Model.do_something"

działa wzorowo.

Pytanie: da się jakoś wymusić na whenever takie właśnie generowanie zleceń w crontabie, czy muszę forkować?

Issue na githubie: http://github.com/javan/whenever/issues/issue/48

OK, czyżbym musiał nadpisać tę klasę: http://github.com/javan/whenever/blob/master/lib/whenever/job_types/runner.rb?

Tak :smiley:

U nas jest to tak zrobione:
Dodajesz do lib/whenewer/job_types plik runner_with_chdir.rb

[code]module Whenever
module Job
class RunnerWithChdir < Whenever::Job::Default

  def output
    path_required
    %Q(cd #{@path}; #{File.join('script', 'runner')} -e #{@environment} #{task.inspect})
  end

end

end
class JobList
def runner_with_chdir(task, options = {})
options.reverse_merge!(:environment => @environment, :path => @path)
options[:class] = Whenever::Job::RunnerWithChdir
command(task, options)
end
end
end[/code]
a w config/schedule.rb
ustawiasz zmienną path

set :path, RAILS_ROOT

Dodaj do preinitializera, przed Bundler.setup:

ENV['BUNDLE_GEMFILE'] = File.expand_path(RAILS_ROOT) + "/Gemfile"

RAILS_ROOT jest przestarzałe, powinniśmy używać Rails.root

[quote=seeweer]Tak :smiley:

U nas jest to tak zrobione:[/quote]
Dostać odpowiedź od kolegi z pracy, pracującego nad tym samym projektem, siedzącego dwa biurka dalej, na ogólnopolskim forum – bezcenne :smiley:

Jednym słowem macie zajebistą komunikację wewnątrz firmy. :smiley:

Tomash, sprawdź jeszcze to co ja zaproponowałem, chyba, że wolisz monkey patchować liby niż załatwiać sprawę 1 linijką ;-). U mnie w każdym razie działa (też miałem problem z bundlerem jeśli task nie odpalił się z katalogu railsów).

OK, sprawdzę, chociaż prawdę mówiąc rozszerzenie whenever o jedną metodę (BTW, nieinwazyjne rozszerzenie o metodę to NIE JEST monkeypatching) w zupełności zaradziło problemowi (i już było w kodzie projektu tak naprawdę).

Dla mnie grzebanie w cudzym kodzie jest monkey patchingiem (co z tego że dodajesz metodę, skoro w następnej wersji tej biblioteki ta klasa może w ogóle wylecieć).

mam problem z zadaniem dla crona wygenerowanym przez whenever, wyglada ono tak:

[quote]PATH=/home/smart/www/.python/bin:/usr/local/python2.6/bin:/home/smart/www/.ruby/gems/1.8/bin/:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/usr/lib/ruby/gems/1.8/bin/
0,10,20,30,40,50 * * * * cd /home/smart/www/projects/aplikacja-development && RAILS_ENV=development /usr/bin/env rake RAILS_ENV=development my:mailing:send_results_access[/quote]
Kiedy wklejam samą komende do konsoli to rake ładnie się odpala ale cron sam z siebie juz nie. Gdzie moge szukać jakiś logów od rake czy crona zeby sprawdzić co jest grane ?

Poradziłem sobie, moze komuś sie przyda, przekierowanie loga http://wiki.github.com/javan/whenever/setting-variables-on-the-fly okazało się że brakuje gem path http://www.megiteam.pl/pomoc/www/cron
Wie ktoś jak zrobić żeby whenewer dodawał tą gem path, bo narazie ręcznie wpisałem ?

Ech, kolejny upgrade bundlera (0.9.26) znowu zepsuł whenever. Robię rollback.
Ja wiem że whenever jest kijowo napisany i pamiętam co Yehuda mówił na ten temat na Euruko, ale to już jest trochę męczące. Czy Javan nie mógłby się ogarnąć wreszcie?

EDIT: Disregard, whenever od 0.5.0 już jest strawny i nie wymaga opisanych wyżej hacków. Proponuję zablokować lub usunąć temat :slight_smile: