heroku Rails部署失败,并显示`Unable to load application:LoadError:无法加载该文件-- fiber`

lkaoscv7  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(202)

**TLDR;**我正在Heroku上运行Rails应用程序。我有舞台和生产环境,设置为管道中的2个应用程序。由于heroku堆栈heroku-18已经达到EOL,我正在将应用程序升级到heroku-22。升级分段运行得非常好,但在生产环境中,我收到以下错误:Unable to load application: LoadError: cannot load such file -- fiber

请注意,我的应用程序设置了两个进程:

  • web.1:使用puma运行rails的web服务器
  • worker.1:运行sidekiq的worker

每次尝试部署时,这两个进程都会崩溃。web.1:

heroku[web.1]: Starting process with command `bundle exec puma -p 11167`
app[web.1]: [2] Puma starting in cluster mode...
app[web.1]: [2] * Puma version: 6.2.2 (ruby 3.2.2-p53) ("Speaking of Now")
app[web.1]: [2] *  Min threads: 5
app[web.1]: [2] *  Max threads: 5
app[web.1]: [2] *  Environment: production
app[web.1]: [2] *   Master PID: 2
app[web.1]: [2] *      Workers: 2
app[web.1]: [2] *     Restarts: (✔) hot (✖) phased
app[web.1]: [2] * Preloading application
app[web.1]: [2] ! Unable to load application: LoadError: cannot load such file -- fiber
app[web.1]: bundler: failed to load command: puma (/app/vendor/bundle/ruby/3.2.0/bin/puma)
app[web.1]: <internal:/app/vendor/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require': cannot load such file -- fiber (LoadError)
app[web.1]: from <internal:/app/vendor/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
app[web.1]: from /app/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:38:in `require'
app[web.1]: from /app/vendor/bundle/ruby/3.2.0/gems/actionview-7.0.4.3/lib/action_view/renderer/streaming_template_renderer.rb:3:in `<top (required)>'
...

和工人。1:

heroku[worker.1]: Starting process with command `bundle exec sidekiq`
heroku[worker.1]: State changed from starting to up
app[worker.1]: 2 TID-398 INFO: Booting Sidekiq 4.0.2 with redis options {:url=>"REDACTED", :ssl_params=>{:verify_mode=>0}}
app[worker.1]: bundler: failed to load command: sidekiq (/app/vendor/bundle/ruby/3.2.0/bin/sidekiq)
app[worker.1]: <internal:/app/vendor/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require': cannot load such file -- fiber (LoadError)
app[worker.1]: from <internal:/app/vendor/ruby-3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
app[worker.1]: from /app/vendor/bundle/ruby/3.2.0/gems/zeitwerk-2.6.8/lib/zeitwerk/kernel.rb:38:in `require'
app[worker.1]: from /app/vendor/bundle/ruby/3.2.0/gems/actionview-7.0.4.3/lib/action_view/renderer/streaming_template_renderer.rb:3:in `<top (required)>'
...

环境详情:

  • ruby 3.2.2
  • rails 7.0.4.3
  • puma 6.2.2
  • sidekiq 4.0.2(还没有升级这个,但应该不会影响web.1)
  • 试运行和生产环境非常相似。它们使用相同的gem,除了newrelic_rpm(仅用于生产),它不在崩溃堆栈跟踪中。在heroku中,它们在dynos和db类型等方面拥有几乎相同的资源。

这两个进程都崩溃的事实让我认为有什么问题与puma或sidekiq配置无关。事实上,这两个运行良好的分期让我感到困惑。
我首先使用heroku CLI升级staging环境,将堆栈设置为heroku-22,然后部署最新版本的代码库(包括新的ruby版本,新的rails版本,以及其他gem和代码更新)。然后,我尝试了以下方法(在每次部署尝试以崩溃告终后回滚到最后一个工作版本):

  • 将staging应用提升到生产环境(heroku管道功能)。
  • 从CLI升级生产堆栈,然后手动部署(不使用管道)。
  • 联系Heroku客户支持。
  • 设置HEROKU_DEBUG_RAILS_RUNNER=1(由Heroku CS建议),这不会产生任何其他消息。
  • 在部署失败后立即重新启动dynos。
  • 将dynos扩展到0,然后部署,然后再向上扩展。
ds97pgxw

ds97pgxw1#

部分答案写这个问题帮助我意识到newrelax_rpm gem只在生产环境中安装。我最初并不怀疑它会与崩溃有关,但我尝试在我的Gemfile中注解它,现在应用程序可以正确部署到生产环境!

这不是一个完整的答案,因为我不知道为什么newrelic_rpm崩溃(我已经审查了newrelic.yml配置文件,它几乎匹配推荐的一个)。但至少它给了我一条继续调试的路径。
我计划将当前版本部署到生产环境中(不使用newreligy),并部署到一个使用newreligy的版本,看看我是否可以在那里重现崩溃并继续测试。
今天的教训:让你的环境尽可能的相似。

aydmsdu9

aydmsdu92#

崩溃是由于使用了newrelic_rpm gem的9.2.2版本。将Gemfile更新为gem 'newrelic_rpm', '< 9.0'将导致安装v8.16.0,并且应用程序正确加载(并且NewRelic集成按预期工作)。
目前还不清楚为什么v9.2.2会崩溃。我已经记录了一个问题here,并可能发布一个新版本的这个问题,是特定于崩溃的情况。

相关问题