[SOLVED] Whenever bundler: command not found: script/runner


#1

Witam!
Mam problem z Whenever oraz Cronem na serwerze produkcyjnym.
Apke wysyłam poprzez Capistriano. Na serwerze używam RVM.

Whenever genreuję mi CRON-a który zwraca
bundler: command not found: script/runner

# frozen_string_literal: true
env :PATH, ENV['PATH']
env :GEM_PATH, ENV['GEM_PATH']
set :output, '/home/deploy/cron.log'
every 1.day, at: ['9:55 pm'] do
runner 'ReminderService.new.perform'
end

Cron na serwerze wyglada tak:

# Begin Whenever generated tasks for: invoice_organizer_production at: 2019-01-16 21:58:21 +0100

PATH=/home/deploy/invoice_organizer/shared/bundle/ruby/2.5.0/bin:/home/deploy/.rvm/gems/ruby-2.5.3/bin:/home/deploy/.rvm/gems/ruby-2.5.3@global/bin:/home/deploy/.rvm/rubies/ruby-2.5.3/bin:/home/deploy/.rvm/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

GEM_PATH=""

58 21 * * * /bin/bash -l -c 'cd /home/deploy/invoice_organizer/releases/20190116205456 && bundle exec script/runner -e production '\''ReminderService.new.perform'\'' >> /home/deploy/cron.log 2>&1'

# End Whenever generated tasks for: invoice_organizer_production at: 2019-01-16 21:55:21 +0100

Odpalenie z CLI niestety przynosi ten sam error

Capistriano 3.11
Whenever 0.10.0
W deploy.rb mam też linie
set :whenever_identifier, -> { "#{fetch(:application)}_#{fetch(:stage)}" }

Capfile zawiera

require 'capistrano/deploy'
require 'capistrano/bundler'
require 'capistrano/rvm'
require 'capistrano/rails/assets' # for asset handling add
require 'capistrano/rails/migrations' # for running migrations
require 'capistrano/puma'
require 'whenever/capistrano'

#2
bundle exec script/runner ...

popraw na

bundle exec rails runner ...

#3

Dzięki za odpowiedz!
Poprawiłem ale teraz w logu mam informacje o rails jak po komendzie rails -h
Usage:
rails new APP_PATH [options]

Może brakuje w repo gemset,


#4

offtopic: jeżeli produkcyjnie na VM maszy tylko 1 apkę to nie potrzebujesz gemset-u

odpowiedź jaką dostałeś sugeruje 2 rzeczy:

… w miejscu wywołania polecenia rails runner

  1. jest widziana jakaś lista gemów w tym railsy
  2. nie ma aplikacji rails i polecenie rails widzi że może taką utworzyć

może testowo zamiast runnera uruchom w jobie ls… zeby zobaczyć listę plików i pwd żeby zobaczyć gdzie wylądowałeć

no i

which rails

żeby zobaczyć skąd bieżesz railsy bo jakieś działają


#5

jeśli zamiast rails runner wrzucę ls dostaje zawartość katalogu aplikacji z capistrano
pwd daje mi ścieżkę do apki /home/deploy/invoice_organizer/releases/20190116205456
A jeśli dodam which rails dostaje
/home/deploy/invoice_organizer/shared/bundle/ruby/2.5.0/bin/rails


#6

A czy ten release istnieje serwerze?

Zamiast /home/deploy/invoice_organizer/releases/20190116205456 lepiej dać /home/deploy/invoice_organizer/current


#7

Tak istnieje to jest właśnie ten aktualny, wygląda na to że cap production deploy zmienia go podczas wrzucenia nowej wersji


#8

Na pocieszenie powiem że na moim rbenv whenever odpalił dummy task z małymi zmianami zamiast notacji xhtml & poprostu & i zamiast > poprostu >

Skoro składnia działa a coś zawodzi (rvm, capistrano, whenever) … whatever… na placu boju zostaje tylko integracja cron z rvm https://rvm.io/deployment/cron

cytując stronę:

RVM allows few easy ways to integrate with cron

moim zdaniem samo istnienie strony o integracji rvm z cron wyklucza easy ways ale może jestem jedynym

to co powinno zadziałać z cron to skrypt na dole strony (dedykowany cron procesom które nic nie wiedzą o istnieniu ruby w systemie)

Tworzysz sobie cron job pod skrypt bash z plikiem dajmy na to inoice_organizer_job sh

i cron job z poziomu whenever to poprostu wywołanie skryptu bash - całą magię związaną z RVM, bundler etc. wstawisz do skryptu

W skrypcie kluczowa sprawa to załadowanie właściwego rvm z właściwej ścieżki dla apki

przykładowe ładowanie RVM masz w skrypcie na dole strony

możesz wymusić środowisko pracy

export RAILS_ENV=production

lub uruchamiać zadanie przez

RAILS_ENV=production bundle exec ...

alternatywa to pogłębienie testów co tak naprawdę widzi cron job

odpalasz na dev - zakładamy że wszystko działa po poprawieniu xhtml

a na prod zamiast bundle exec... sprawdzasz szereg zmiennych

echo $USER
echo $GEM_PATH
echo $GEM_HOME
echo $BUNDLE_PATH

te same echa dla dev coś powinno się różnić lub brakować

echa możesz wstawić też do skryptu bash by mieć pewność że wszystko jest ok po załadowaniu RVM


p.s.

Które to railsy bo whenever początkowo generował script/runner tak jakby widział pozostałości po starszej apce

Jak żaden z 4 sposobów integracji rvm/cron nie zadziała proponuje 5ty sposób - przejść na rbenv :wink:


#9

@DarkCoin bardzo dziękuję za pomoc. Podążając wskazanym przez Ciebie tokiem myślenia doszedłem do rozwiązania. Znalazłem kogoś kto miał podobny problem https://github.com/javan/whenever/issues/588.
Okazuje się że wystarczyło usunąć bin z linked_dirs w pliku deploy.rb

-set :linked_rs, %w{ bin log tmp/pids tmp/cache tmp/sockets
+set :linked_dirs, %w{ log tmp/pids tmp/cache tmp/sockets

Po tej operacji whenever generuje wszystko jak należy

Begin Whenever generated tasks for: invoice_organizer_production at: 2019-01-21 10:08:13 +0100

15 10 * * * /bin/bash -l -c ‘cd /home/deploy/invoice_organizer/releases/20190121090701 && bundle exec bin/rails runner -e production ‘’‘ReminderService.new.perform’’’ >> /home/deploy/cron.log 2>&1’

End Whenever generated tasks for: invoice_organizer_production at: 2019-01-21 10:08:13 +0100

Pozdrawiam i jeszcze raz dziękuje.


#10

Nahh… byłem precyzyjny jak Wróźbita Maciej