約束の地

キャロ組

Sidekiq-Cron で定期実行しようとしたら初回だけ実行されるが2回目以降が実行されずに4時間ハマった話

結論

gem のバージョンを以下のようにちゃんと指定しましょう。

gem 'sidekiq-cron', '~> 1.0.4'

具体的な状況

gem のインストールについて

バージョンを指定しないでインストールした場合

愚直に以下のように gem のバージョンを指定しないでインストールしたとします。

gem 'sidekiq-cron'

そうすると Gemfile.lock の中身は以下のようになります。refus-scheduler は依存関係において重要な役割を果たしています(いました)。

$ cat Gemfile.lock | grep sidekiq-cron
    sidekiq-cron (0.3.1)
  sidekiq-cron
$ cat Gemfile.lock| grep rufus-scheduler
    rufus-scheduler (3.5.2)
      rufus-scheduler (>= 2.0.24)

バージョンを指定してインストールした場合

次に、冒頭のようにバージョンを指定してインストールしたとします。そのときの Gemfile.lock の中身は次のようになります。rufus-scheduler はインストールされません。

$ cat Gemfile.lock | grep sidekiq-cron
    sidekiq-cron (1.0.4)
  sidekiq-cron (~> 1.0.4)

gem のインストール方法(バージョン指定方法)の違いによる結果について

バージョンを指定しないでインストールした場合

gem のバージョンを指定しないでインストールした場合、Sidekiq-Cron が発動すると以下のような Sidekiq のログが出力されます。初回は実行されているのですが、それ以降は日付の比較に失敗していて*1cron が実行されていません。

2018-11-16T08:43:07.183Z 49149 TID-ow8extigg Hoge::Fuga JID-39322727b03932d173e9152e INFO: start
2018-11-16T08:43:12.152Z 49149 TID-ow8extigg Hoge::Fuga JID-39322727b03932d173e9152e INFO: done: 4.969 sec
2018-11-16T08:43:17.186Z 49149 TID-ow8dvg0bk ERROR: CRON JOB: comparison of Time with EtOrbi::EoTime failed
2018-11-16T08:43:17.186Z 49149 TID-ow8dvg0bk ERROR: CRON JOB: /Users/FOOBAR/APPNAME/vendor/bundle/ruby/2.5.0/gems/sidekiq-cron-0.3.1/lib/sidekiq/cron/job.rb:434:in `<'
2018-11-16T08:43:27.192Z 49149 TID-ow8dvg0bk ERROR: CRON JOB: comparison of Time with EtOrbi::EoTime failed
2018-11-16T08:43:27.192Z 49149 TID-ow8dvg0bk ERROR: CRON JOB: /Users/FOOBAR/APPNAME/vendor/bundle/ruby/2.5.0/gems/sidekiq-cron-0.3.1/lib/sidekiq/cron/job.rb:434:in `<'
2018-11-16T08:43:37.200Z 49149 TID-ow8dvg0bk ERROR: CRON JOB: comparison of Time with EtOrbi::EoTime failed
2018-11-16T08:43:37.200Z 49149 TID-ow8dvg0bk ERROR: CRON JOB: /Users/FOOBAR/APPNAME/vendor/bundle/ruby/2.5.0/gems/sidekiq-cron-0.3.1/lib/sidekiq/cron/job.rb:434:in `<'
2018-11-16T08:43:47.204Z 49149 TID-ow8dvg0bk ERROR: CRON JOB: comparison of Time with EtOrbi::EoTime failed
2018-11-16T08:43:47.204Z 49149 TID-ow8dvg0bk ERROR: CRON JOB: /Users/FOOBAR/APPNAME/vendor/bundle/ruby/2.5.0/gems/sidekiq-cron-0.3.1/lib/sidekiq/cron/job.rb:434:in `<'

バージョンを指定してインストールした場合

gemのバージョン*2を指定した上でインストールすると、上記のエラーは出ず、綺麗な実行ログが繰り返されます。

2018-11-16T08:56:20.039Z 51094 TID-owlht7y1k Hoge::Fuga JID-84d069fed1a408fd168ec633 INFO: start
2018-11-16T08:56:20.115Z 51094 TID-owlht7y1k Hoge::Fuga JID-84d069fed1a408fd168ec633 INFO: done: 0.076 sec
2018-11-16T08:57:12.896Z 51094 TID-owlirrsd0 Hoge::Fuga JID-326062da619b680785bd302e INFO: start
2018-11-16T08:57:13.955Z 51094 TID-owlirrsd0 Hoge::Fuga JID-326062da619b680785bd302e INFO: done: 1.06 sec
2018-11-16T08:58:08.837Z 51094 TID-owlirrsj4 Hoge::Fuga JID-0b1042d5d2f21fd96b567cd4 INFO: start
2018-11-16T08:58:08.878Z 51094 TID-owlirrsj4 Hoge::Fuga JID-0b1042d5d2f21fd96b567cd4 INFO: done: 0.042 sec
2018-11-16T08:59:18.262Z 51094 TID-owlirrsj4 Hoge::Fuga JID-ac351176ab716181087cd982 INFO: start
2018-11-16T08:59:18.295Z 51094 TID-owlirrsj4 Hoge::Fuga JID-ac351176ab716181087cd982 INFO: done: 0.033 sec

備考

  • ちゃんと公式のドキュメントを読む(一通り目を通す)
    • Qiita や Stack Overflow だけをよりどころにしない
  • Issue や プルリク にもざっとでいいので目を通す
  • 上記はいい加減徹底したい
    • ハマる時間を短くすることができるのはもちろん、そのgemに関する様々な知見が得られる

環境

  • Ruby 2.5.3
  • Rails 5.2.1

*1:comparison of Time with EtOrbi::EoTime failed とあるように「型」が違うのが原因です

*2:'~> 1.0.4'

Powered by はてなブログ