Heroku uses older Ruby version when running `bundle install` - ruby-on-rails

I'm trying to run a Rails app on Ruby 2.7.1 on Heroku. Everything worked fine, then I changed something in my Gemfile to use Ruby 2.7's numbered parameters, and now the deploy fails with this error message:
remote: -----> Build succeeded!
remote: -----> Ruby app detected
remote: -----> Installing bundler 2.0.2
remote: -----> Removing BUNDLED WITH version in the Gemfile.lock
remote: -----> Compiling Ruby/Rails
remote:
remote: !
remote: ! There was an error parsing your Gemfile, we cannot continue
remote: !
remote: ! [!] There was an error parsing `Gemfile`: Undefined local variable or method `_1' for Gemfile. Bundler cannot continue.
remote: !
remote: ! # from /tmp/build_6681cf5c/Gemfile:22
remote: ! # -------------------------------------------
remote: ! # dependencies.any? { _1.name == gem_name }
remote: ! # -------------------------------------------
remote: ! . Bundler cannot continue.
It works fine locally and I've been using the same code in a few other Rails apps and deployment was never a problem.
Due to the error Undefined local variable or method '_1' for Gemfile. I assume a Ruby version < 2.7 is used when running bundle install.
The app itself runs fine on Ruby 2.7.1 though:
$ heroku run "ruby -v"
Running ruby -v on ⬢ myapp... up, run.7979 (Free)
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
There are a few other similar questions here on SO, but they all deal with Heroku not respecting the Ruby version set in Gemfile or .ruby-version, which is not the problem for me, just during bundle install it seems to use a different Ruby version for some reason...
Is there any way to debug this further, or force Ruby 2.7 even during bundle install on deployment?

Related

Can't start brand new rails app on Heroku

Trying to start up a brand new rails project with heroku, followed the steps in https://devcenter.heroku.com/articles/getting-started-with-rails5 and https://devcenter.heroku.com/articles/getting-started-with-rails6. Both times when I try to push to heroku master, I get
remote: -----> Detecting rake tasks
remote:
remote: !
remote: ! Could not detect rake tasks
remote: ! ensure you can run `$ bundle exec rake -P` against your app
remote: ! and using the production group of your Gemfile.
remote: ! /tmp/build_4403463c/config/boot.rb:5:in `require': cannot load such file -- bootsnap/setup (LoadError)
remote: ! from /tmp/build_4403463c/config/boot.rb:5:in `<top (required)>'
remote: ! from /tmp/build_4403463c/bin/rake:7:in `require_relative'
remote: ! from /tmp/build_4403463c/bin/rake:7:in `<main>'
remote: !
I've tried to surround the bootsnap/setup with a rescue, and it still hits this block.
In my case, I have 3 bundler versions installed:
gem list bundler
*** LOCAL GEMS ***
bundler (2.2.5, default: 2.1.4, 1.17.3)
Though 2.1.4 being the default, it seems it is not what being used when I bundle install.
I run bundle _2.1.4_ install and then it updates my Gemfile.lock.
# git diff
BUNDLED WITH
- 2.2.5
+ 2.1.4
Then the problem was gone when I git push heroku main. I found these links helpful in troubleshooting my issue: Heroku Rails build failing due to Bootsnap and Rake issues and How to switch bundler version?.
Found a solution, In Gemfile.lock I switched RUBY VERSION to ruby 2.6.6p146 and BUNDLED WITH to 1.17.3

Pushing Rails to Heroku, can't find Rake taks

UPDATE: now using Ruby 2.5.5 and Bundler 2.0.2, still getting the error:
/app/tmp/buildpacks/<long hash>/lib/language_pack/helpers/rake_runner.rb:106:
in load_rake_tasks!':
Could not detect rake tasks (LanguagePack::Helpers::RakeRunner::CannotLoadRakefileError)`
I'm trying to git push heroku master a Rails app for the first time, and I'm getting this error:
remote: -----> Detecting rake tasks
remote:
remote: !
remote: ! Could not detect rake tasks
remote: ! ensure you can run `$ bundle exec rake -P` against your app
remote: ! and using the production group of your Gemfile.
remote: ! Activating bundler (2.0.1) failed:
remote: ! Could not find 'bundler' (2.0.1) required by your /tmp/build_cf9981ccbdc1fd4f0b82703a5ff40ecc/Gemfile.lock.
remote: ! To update to the latest version installed on your system, run `bundle update --bundler`.
remote: ! To install the missing version, run `gem install bundler:2.0.1`
remote: ! Checked in 'GEM_PATH=vendor/bundle/ruby/2.5.0', execute `gem env` for more information
remote: !
remote: ! To install the version of bundler this project requires, run `gem install bundler -v '2.0.1'`
remote: !
remote: /app/tmp/buildpacks/b7af5642714be4eddaa5f35e2b4c36176b839b4abcd9bfe57ee71c358d71152b4fd2cf925c5b6e6816adee359c4f0f966b663a7f8649b0729509d510091abc07/lib/language_pack/helpers/rake_runner.rb:106:in `load_rake_tasks!': Could not detect rake tasks (LanguagePack::Helpers::RakeRunner::CannotLoadRakefileError)
remote: ensure you can run `$ bundle exec rake -P` against your app
remote: and using the production group of your Gemfile.
remote: Activating bundler (2.0.1) failed:
remote: Could not find 'bundler' (2.0.1) required by your /tmp/build_cf9981ccbdc1fd4f0b82703a5ff40ecc/Gemfile.lock.
remote: To update to the latest version installed on your system, run `bundle update --bundler`.
remote: To install the missing version, run `gem install bundler:2.0.1`
remote: Checked in 'GEM_PATH=vendor/bundle/ruby/2.5.0', execute `gem env` for more information
remote:
remote: To install the version of bundler this project requires, run `gem install bundler -v '2.0.1'`
I have run gem install bundler:2.0.1 successfully in this app's root directory. My $GEM_PATH does not include vendor/bundle/ruby/2, and I don't know if altering it is the solution. If so, does that mean I need to alter it locally or remotely? If locally, is it done the same way as normal environment variables, or is there a special Rails setting I need to change?
I have tried the suggestion in the accepted answer here:
heroku push error: "Could not detect rake tasks"
but that made no difference.
My problem also seems to be similar to the (unanswered) question here:
Can't Push Rails Project to Heroku
Searching the Heroku Help Center didn't seem to yield any results, either.
Any guidance about what I should do?
This is a known issue with Bundler 2 on Heroku:
A Gemfile.lock that specifies bundler 2.0.2 does not work with bundler 2.0.1
If you attempt to deploy an app that uses bundler 2.0.2 onto the Heroku platform with bundler 2.0.1 you may get this error:
`find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
This is due to a bug in the Rubygems bundler version checking code. To avoid this issue, upgrade your Ruby version. It is fixed in 2.5.5+ and 2.6.3+. If you do not update, your Ruby version then every new release of Bundler 2.x will trigger this issue.
Upgrade Ruby to version 2.5.5+ or 2.6.3+ locally, update your Gemfile accordingly, and re-run bundle. Commit the changes to your Gemfile and Gemfile.lock, then deploy again.

Heroku doesn't respect my ruby directive in my Gemfile

At the top of my Gemfile, I have the following two lines:
source 'https://rubygems.org'
ruby '2.5.0'
However, run I run git push heroku master, I get the following message:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.3.4
remote: -----> Installing dependencies using bundler 1.15.2
Heroku doesn't let me specify ruby 2.5.0.
How can I go about telling Heroku that I want to use ruby 2.5.0?

Heroku version not set despite following guide

I am trying to push a rails 5 app to Heroku and I believe that I followed the instructions on the Heroku page:
https://devcenter.heroku.com/articles/ruby-versions
$ ruby --version
ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu]
$ cat Gemfile
.....
ruby "2.3.1"
$ heroku run bash
$ env | grep PATH
PATH=/app/bin:/usr/local/bin:/usr/bin:/bin
$ git push heroku master
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.2.4
which terminates with the error:
remote: -----> Preparing app for Rails asset pipeline
remote: Running: rake assets:precompile
remote: rake aborted!
remote: NoMethodError: undefined method `symbolize_keys' for # <String:0x007fac0655feb0>
remote: /tmp/build_39bfaebc9acd5a6bcb91a69f2b13c171/vendor/bundle/ruby/2.2.0/gems /railties-5.0.0.1/lib/rails/application.rb:393:in `secrets'
Which I guess it is because it is using 2.2 and not 2.3.
The version in /bin is 1.9.3 so in case it would not find any, it should use 1.9.3 and not 2.2.4.
The error message above was fixed with the help of spickermann. Removing the secret.yml file from git tracking allowed the app to be deployed without errors.
Still, the wrong Ruby version persists and Heroku even returns a warning at the end:
remote: ###### WARNING:
remote: You have not declared a Ruby version in your Gemfile.
remote: To set your Ruby version add this line to your Gemfile:
remote: ruby '2.2.4'
remote: # See https://devcenter.heroku.com/articles/ruby- versions for more information.
Any advice about what else can be done?
Thank you!
Your deployment fails because your config/secret.yml is not in the expected format. It expects a nested hash like this in production environment:
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
Your config/secrets.yml returns a string for the key production. Therefore the deployment fails and you were never able to deploy you new version.

Changed all configs, but why is Heroku continuing to use Ruby- 2.0.0?

I have added Ruby 2.1.5 to my gem file, and after that failed, also added e ruby version to the config vars.
But when deploying, it continues to show that we are using 2.0.0
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.0.0
remote: -----> Installing dependencies using 1.7.12
Then it fails because of modware:
remote: Gem::InstallError: modware requires Ruby version >= 2.1.0.
Here is my Gemfile:
Gemfile
source 'https://rubygems.org'
ruby "2.1.5"
Type this in your terminal :
heroku config -s | grep PATH
Then, if you get something like
PATH=vendor/bundle/ruby/2.1.5/bin:/usr/local/bin:/usr/bin:/bin
You need to add "bin:" before "vendor" in the PATH, with this command line :
heroku config:set PATH=bin:vendor/bundle/ruby/2.1.5/bin:/usr/local/bin:/usr/bin:/bin
Source : https://devcenter.heroku.com/articles/ruby-versions#troubleshooting

Resources