Pushing Rails to Heroku, can't find Rake taks - ruby-on-rails

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.

Related

Why does the Ruby on Rails Azure Web App Tutorial fail to deploy to the remote?

I am trying to deploy the Ruby on Rails tutorial to Microsoft Azure and keep running into the same error when pushing to the remote:
remote: Bundle install with no 'without' options
remote: Defaulting gem installation directory to /tmp/bundle
remote: Defaulting site config directory to /home/site/config
remote: Using ruby version 2.6.2
remote: /home/site/wwwroot
remote: Found gemfile
remote: ~/site/wwwroot ~/site/repository
remote: Setting ruby version
remote: Running bundle clean
remote: /usr/local/.rbenv/versions/2.6.2/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.0.2) required by your /home/site/wwwroot/Gemfile.lock. (Gem::GemNotFoundException)
remote: Running bundle install
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.2`
remote: from /usr/local/.rbenv/versions/2.6.2/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
remote: from /usr/local/.rbenv/versions/2.6.2/bin/bundle:23:in `<main>'
remote: /usr/local/.rbenv/versions/2.6.2/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.0.2) required by your /home/site/wwwroot/Gemfile.lock. (Gem::GemNotFoundException)
Attempted Fixes:
Made sure that my Ruby version matches the Azure web app's (2.6.2)
Tried multiple versions of Bundler (1.17.3, 2.0.2, and 2.2.15)
Made sure my Gemfile and Gemfile.lock Bundler versions match
Tried using Azure's Kudu Bash interaction to manually update and install gems (no such command)
Is there a specific version of Bundler that the Azure Web App is requesting? Is there any way to find out which Bundler version I should be using for development?
I was able to find a solution to deployment by downgrading my Bundler version to the default version on my installation (1.17.2). After updating my Gemfile.lock to reflect the current (default) version the push to the remote was successful.

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

Heroku uses older Ruby version when running `bundle install`

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?

Heroku Rails deployment/build error: Could not find 'bundler' (version) required by your Gemfile.lock

I have a Ruby on Rails and Redux/React app I have already pushed dozens of times to heroku via "git push heroku master" and it builds correctly. I recently tried to create a staging environment. After setting the remote, I run
git push staging master
And the webpack portion builds correctly, but once Heroku tries to build the Rails portion I get this error.
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_687b8b1cf6d6cbb297288640ccb0d405/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'`
To create the staging environment, I ran
heroku create --remote staging
in the root folder of the project.
I also have tried updating the bundler.
bundle update --bundler
&
gem install bundler:2.0.1
I tried precompiling assets as well, but nothing.
RAILS_ENV=production bundle exec rake assets:precompile
I ran
bundle exec rake -P
as suggested, but that did not fix it as well.
Another thing is when I push successfully, in the logs it shows I am using a different ruby version
Using Ruby version: ruby-2.3.4
remote: -----> Installing dependencies using bundler 2.0.2
In the staging logs it shows
Using Ruby version: ruby-2.5.5
remote: -----> Installing dependencies using bundler 2.0.2
Not sure if that helps. But any possible solutions can help!
Thanks!
The solution to issues like these it to ensure all environments (development, staging, production, CI) share the same Ruby version. This will make development and testing much more predictable.
Specify your Ruby version in the Gemfile (this build worked with Ruby 2.3.4, so that's what we'll use):
# Gemfile
ruby '2.3.4'

Ruby 2.6.1 and Bundler 2.0.1 to Heroku : should I write a Procfile?

I'm facing errors I can't handle while trying to deploy an app to Heroku (it's my first time).
# ERROR when I try to `git push heroku master`
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_e569680f858939ef8f1f8ef3e8902eff/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=/tmp/build_e569680f858939ef8f1f8ef3e8902eff/vendor/bundle/ruby/2.6.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'
# heroku buildpacks
=== staging-det-music Buildpack URLs
1. heroku/nodejs
2. heroku/ruby
# Gemfile.lock
RUBY VERSION
ruby 2.6.1p33
BUNDLED WITH
2.0.1
I've tried several solutions, like:
running RAILS_ENV=production bundle exec rake assets:precompile (see here)
adding the RAILS_SERVE_STATIC_FILES key (same)
upgrade Ruby to 2.6.3 (see here, can't find 2.6.3 with rbenv nor rvm)
I believe it might be due to this issue. Am I concerned by this point ?
2) When using binstubs to run a command instead of bundle exec the wrong
version of Bundler can get activated when using Ruby 2.6.x. This bug
is reported to Ruby Core and will be fixed when Ruby 2.6.3 is
released.
In the short term, the workaround is to ensure all commands in the
Procfile and app.json are prefaced with bundle exec. For example:
web: bundle exec bin/rails server -p $PORT -e $RAILS_ENV
worker: bundle exec sidekiq -C config/sidekiq.yml
As a newbie I feel really lost, could anyone help me on this ?
Thanks for your time
SOLUTION: found here removing BUNDLED WITH and the following line in Gemfile.lock
There are known issues with Bundler 2 on Heroku, including this one:
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 at least version 2.6.3 locally, update the ruby version in your Gemfile, bundle install, commit the changes, and redeploy.

Resources