HerokuへPushする際に「Failed to install gems via Bundler.」が出た時の対処法

こんなところでこんなにハマるとは思いませんでした。と言うわけで今回はHerokuへPushする際に「Failed to install gems via Bundler.」が出た時の対処法についてまとめておきたいと思います。

HerokuへPushする際に「Failed to install gems via Bundler.」が出た時の対処法

結論

bundlerのバーションを2.2.5→2.1.4へ下げた。

言い方をかえるとHeroku環境のbundlerのversionとローカル環境のbundlerのversionを一致させた。今回の場合は、Herokuのbundlerが2.1.4だったけど、ローカルでは2.2.5だったため、Herokuにpushした際にエラーが発生した。

※Ruby 3.0.0、Rails 6.1.1というこの当時の最新版のRubyとRailsを使用。

解決手順

エラー遭遇

まずは手順通りに進めていって、$git push heroku (ブランチ名):master を実行したところ、以下のようにFailed to install gems via Bundler.のエラーが発生。

コード
Enumerating objects: 106, done.
Counting objects: 100% (106/106), done.
Delta compression using up to 8 threads
Compressing objects: 100% (87/87), done.
Writing objects: 100% (106/106), 150.68 KiB | 5.79 MiB/s, done.
Total 106 (delta 3), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Building on the Heroku-20 stack
remote:  !     Warning: Multiple default buildpacks reported the ability to handle this app. The first buildpack in the list below will be used.
remote: Detected buildpacks: Ruby,Node.js
remote: See https://devcenter.heroku.com/articles/buildpacks#buildpack-detect-order
remote: -----> Ruby app detected
remote: -----> Installing bundler 2.1.4
remote: -----> Removing BUNDLED WITH version in the Gemfile.lock
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-3.0.0
remote: -----> Installing dependencies using bundler 2.1.4
remote:        Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 bundle install -j4
remote:        Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform
remote:        is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote:        --add-platform x86_64-linux` and try again.
remote:        Bundler Output: Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform
remote:        is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote:        --add-platform x86_64-linux` and try again.
remote: 
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: ! Push rejected to vast-shelf-00779.
remote: 
To https://git.heroku.com/vast-shelf-00779.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/vast-shelf-00779.git'

調べた対処法が効かない。

色々調べた結果、以下の内容で対応できるみたいな感じだったので試してみることに。

コード
$ bundle install --without production
$ git commit -a -m "Update gemfile.lock for heroku"
$ git push heroku master

それでも同じエラーから抜け出せない。

結局database.ymlとかいじる問題ではなく、あくまでもbundlerの問題なので、そこを解消しなくてはいけないと言うことが後からわかった。

解決手順

よくよくエラーを眺めていると、Herokuではbundlerが2.1.4をインストールしていることがわかる。

エラーコード
省略...
remote: -----> Ruby app detected
remote: -----> Installing bundler 2.1.4
remote: -----> Removing BUNDLED WITH version in the Gemfile.lock
省略...

我輩のローカルのbundlerのversionは、bundler -vにて調べた結果、2.2.5。ローカルの方が新しい。これかもと思って、以下の手順を実行。

  1. 今のローカルにあるbundlerをアンインストール。
  2. Herokuに合わせたbundlerのversionをインストール。
  3. Gemfile.lockを一度削除。
  4. bundle _2.1.4_ install –without productionでGemfile.lockを再度生成。
  5. HerokuへPushをトライ

以下コマンドです。

コード
% gem uninstall bundler #ローカルのbundlerをアンインストール
Gem bundler-2.2.3 cannot be uninstalled because it is a default gem
Successfully uninstalled bundler-2.2.5

% gem install bundler --version '2.1.4' #デプロイ先のHerokuと同じversionのbundlerをローカルにインストール
Fetching bundler-2.1.4.gem
Successfully installed bundler-2.1.4
1 gem installed

% bundler -v #bundlerのversion確認
Bundler version 2.2.3 #意図してたバージョンと違うやん!

% gem list bundler #ローカルにインストールされているbundlerのversionリストを表示
*** LOCAL GEMS ***
bundler (default: 2.2.3, 2.1.4) #version2.1.4が、きちんとインストールされている

% rm gemfile.lock #Gemfile.lockを削除 → なぜなら以前のローカルに保存されてたbundlerのversion(2.2.5)でGemfile.lockが作られているため。これをbundlerのversion2.1.4で作り替える。

% bundle _2.1.4_ install #version指定してbundle install

The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies....
Using rake 13.0.3

省略...

Bundle complete! 18 Gemfile dependencies, 75 gems now installed.
Gems in the group production were not installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

% git diff #どれくらい差分があるんだろうと確認。bundler2.2.5と2.1.4ではどれだけ内容が違うのかなと思ったので。

diff --git a/Gemfile.lock b/Gemfile.lock
index 8fcac01..00de18c 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -99,10 +99,12 @@ GEM
     method_source (1.0.0)
     mimemagic (0.3.5)
     mini_mime (1.0.2)
+    mini_portile2 (2.5.0)
     minitest (5.14.3)
     msgpack (1.3.3)
     nio4r (2.5.4)
-    nokogiri (1.11.1-x86_64-darwin)
+    nokogiri (1.11.1)
+      mini_portile2 (~> 2.5.0)
       racc (~> 1.4)
     pg (1.2.3)
     public_suffix (4.0.6)
@@ -200,7 +202,7 @@ GEM
     zeitwerk (2.4.2)
 PLATFORMS
-  x86_64-darwin-20
+  ruby
 DEPENDENCIES
   bootsnap (>= 1.4.4)
@@ -226,4 +228,4 @@ RUBY VERSION
    ruby 3.0.0p0
 BUNDLED WITH
-   2.2.5
+   2.1.4 # 結構差分があるなぁ。

% git add -A
% git commit -m 'Bundlerのversionを2.2.5->2.1.4へ変更'
 1 file changed, 5 insertions(+), 3 deletions(-)

% bundle _2.1.4_ install --without production # そういえばwithout productionつけるの忘れてたと思い、再度実行

[DEPRECATED] The `--without` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set without 'production'`, and stop using this flag

The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.

省略...

Bundle complete! 18 Gemfile dependencies, 75 gems now installed.
Gems in the group production were not installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

% git push heroku (ブランチ名):master # Herokuへのデプロイ成功 

こんな感じでうまくできました。いやーよかった。苦しかったです。では。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA