-
Notifications
You must be signed in to change notification settings - Fork 1.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
v216: Bundler not loaded? #1025
Comments
Relatedly (I think), my Heroku CI test setup failed out of nowhere last night saying that the newest version of the json gem conflicted with another gem, but my bundle had json 1.8.6 installed—not the newest version. After some digging, I realized that the buildpack was running tldr; Seems like something changed where rake tasks are no longer called from bundler? |
I think this is related to #1005. But it might not be as it's a different error. Can you open a support ticket help.heroku.com search "bundler not loaded". Once you've done that give me the ticket number so I can access your application. |
I opened a Heroku support ticket. They’re rolling back the release and fixing it. 👍 |
Thanks for the quick action! 👍 As for a support ticket, it seems I'm not eligible to create one. Let me know however, if there is anything that I can help. |
I don't see any "bundler not loaded" tickets right now. I might have responded by accidentally grouped it in with another failure mode. If anyone has a support ticket number please let me know on this thread, please. @sato11 I can make one for you can you send me your email address that you use for Heroku? You can find my email on my github profile. I'll create a ticket for you that you can attach an app and grant access from there. |
@schneems Thank you very much. I've emailed to you. |
It took longer than I would like but I've created the ticket, you should get an email from our system. Also i've rolled out a fix for #1005 i've included instructions at the bottom to determine if an issue still exists. If you all can run the commands and let me know if it fixes your issue then it will let me know if there's still a problem that needs to be worked on or if i've fixed your issue. |
@schneems |
I'm not sure if everyone on the ticket is seeing the same problem or not, but this is what I think is happening right now. Here's two different rake binstubs on the platform of a 2.4.x app:
Versus
You can see that in The problem is this: Rubygems has no concept of a "git" gem. The concept of using "git" as a source for a gem comes from Bundler. So in this case i'm guessing that there is one or more gem in the project that is using a "git" gem that cannot be found when Again, there might be multiple issues here, but that's the behavior/problem that some are seeing. Ways that it can be mitigated: If you're using Rails then you can generate and check in binstubs:
In terms of moving forwards with this specific bug/regression, i'm not sure. It's interesting that even with v215, running it might work at build time but will fail at runtime as runtime puts |
It looks like this is the same failure mode but with slightly different behavior: When using
When running
It fails since Existing behaviorExisting Build behavior: This behavior is problematic. It's confusing that the behavior in runtime does not match build-time behavior. Ideally, we would consolidate so that the same Staged behaviorHere's the new behavior that's staged on the main branch: Staged Build behavior: This behavior is consistent, but it is a change from prior behavior. Here's the two cases we're trying to accommodate: Use cases
Next stepsHere's what I think I want to do: I can detect if you've added a I think I can accommodate existing expected behavior while fixing problems (different binstub used in runtime and build time) and not break anyone's existing application. I'll work on some experiments now and get back to yall when I have more to share. |
Thanks for the investigation. It seems it's becoming more complicated than I've initially expected. |
After v216 was released there were several failures reported in #1029 and #1005 these are both related to `bin/` being put first on the path consistently in build and run time. After investigation it was uncovered that `bin/rake` was a file we're putting in that location if the customer does not check in a `bin/rake` binstub. This file is generated by compiling a Ruby binary: ``` $ curl -O https://heroku-buildpack-ruby.s3.amazonaws.com/heroku-18/ruby-2.7.1.tgz $ tar -xzf ruby-2.7.1.tgz bin/ $ cat bin/rake #!/bin/sh # -*- ruby -*- # This file was generated by RubyGems. # # The application 'rake' is installed as part of a gem, and # this file is here to facilitate running it. # _=_\ =begin bindir="${0%/*}" exec "$bindir/ruby" "-x" "$0" "$@" =end #!/usr/bin/env ruby require 'rubygems' version = ">= 0.a" str = ARGV.first if str str = str.b[/\A_(.*)_\z/, 1] if str and Gem::Version.correct?(str) version = str ARGV.shift end end if Gem.respond_to?(:activate_bin_path) load Gem.activate_bin_path('rake', 'rake', version) else gem "rake", version load Gem.bin_path("rake", "rake", version) end ``` v216 release caused two related issues due to having `bin/rake first on the PATH. ## Bad shebang lines Issue #1005 is related to having bad shebang lines: ``` $ cat bin/rake | head -n 1 #!/app/vendor/ruby-2.3.8/bin/ruby ``` This was fixed by modifying our compilation code in: heroku/docker-heroku-ruby-builder#5 ## Bundler not loaded Issue #1029 occurs because the code in `bin/rake` that is generated from compiling Ruby is not bundler aware. It does not load bundler. As a result: - Git based gems do not work with the Ruby compiled `bin/rake` - Referencing code from bundler like `Bundler.setup` does not work because it's not yet required This behavior is described in detail in this comment: #1025 (comment) The short version is: Without putting `bin/` first on the path at build time then the binstub generated by bundler in the location `vendor/bundle/bin/` takes precedence and this code (since it is generated by bundler) is bundler aware. When `bin/` was moved to be first in the path, this behavior broke. ## Fix implementation This fix for #1029 works by not putting the Ruby compiled `bin/rake` on in the customer's `bin/` folder. We keep `bin/` first in the path so if a customer is checking in a binstub their binstub will be used. If they are not checking in a binstub then the bundler generated version of `vendor/bundle/bin/` will be used. This fix also would have superseded the work to fix #1005 and not required re-compiling dozens of binaries, but this bug was found and diagnosed after #1005 was reported. ## Known risks The one risk with this approach is that anyone relying on running `rake assets:precompile` at build time but they're not using Rake in their Gemfile will no longer work. I believe this is not a common case, and it's best practice to have a specific version of Rake in the Gemfile.lock.
After v216 was released there were several failures reported in #1029 and #1005 these are both related to `bin/` being put first on the path consistently in build and run time. After investigation it was uncovered that `bin/rake` was a file we're putting in that location if the customer does not check in a `bin/rake` binstub. This file is generated by compiling a Ruby binary: ``` $ curl -O https://heroku-buildpack-ruby.s3.amazonaws.com/heroku-18/ruby-2.7.1.tgz $ tar -xzf ruby-2.7.1.tgz bin/ $ cat bin/rake #!/bin/sh # -*- ruby -*- # This file was generated by RubyGems. # # The application 'rake' is installed as part of a gem, and # this file is here to facilitate running it. # _=_\ =begin bindir="${0%/*}" exec "$bindir/ruby" "-x" "$0" "$@" =end #!/usr/bin/env ruby require 'rubygems' version = ">= 0.a" str = ARGV.first if str str = str.b[/\A_(.*)_\z/, 1] if str and Gem::Version.correct?(str) version = str ARGV.shift end end if Gem.respond_to?(:activate_bin_path) load Gem.activate_bin_path('rake', 'rake', version) else gem "rake", version load Gem.bin_path("rake", "rake", version) end ``` v216 release caused two related issues due to having `bin/rake first on the PATH. ## Bad shebang lines Issue #1005 is related to having bad shebang lines: ``` $ cat bin/rake | head -n 1 #!/app/vendor/ruby-2.3.8/bin/ruby ``` This was fixed by modifying our compilation code in: heroku/docker-heroku-ruby-builder#5 ## Bundler not loaded Issue #1029 occurs because the code in `bin/rake` that is generated from compiling Ruby is not bundler aware. It does not load bundler. As a result: - Git based gems do not work with the Ruby compiled `bin/rake` - Referencing code from bundler like `Bundler.setup` does not work because it's not yet required This behavior is described in detail in this comment: #1025 (comment) The short version is: Without putting `bin/` first on the path at build time then the binstub generated by bundler in the location `vendor/bundle/bin/` takes precedence and this code (since it is generated by bundler) is bundler aware. When `bin/` was moved to be first in the path, this behavior broke. ## Fix implementation This fix for #1029 works by not putting the Ruby compiled `bin/rake` on in the customer's `bin/` folder. We keep `bin/` first in the path so if a customer is checking in a binstub their binstub will be used. If they are not checking in a binstub then the bundler generated version of `vendor/bundle/bin/` will be used. This fix also would have superseded the work to fix #1005 and not required re-compiling dozens of binaries, but this bug was found and diagnosed after #1005 was reported. ## Known risks The one risk with this approach is that anyone relying on running `rake assets:precompile` at build time but they're not using Rake in their Gemfile will no longer work. I believe this is not a common case, and it's best practice to have a specific version of Rake in the Gemfile.lock.
The fix has been merged and deployed let me know if you're still seeing the same failure |
Deploying my Hanami app started to fail today, and I have found switching to v215 fixes it.
The error took place during
rake assets:precompile
, sayinguninitialized constant Bundler
,which this line is invoking: https://github.com/hanami/hanami/blob/v1.3.3/lib/hanami/environment.rb#L409
My environment is:
Thanks for the maintenance, and I hope this report helps somehow.
The text was updated successfully, but these errors were encountered: