Capistrano で Rails をデプロイする際に bundle:install で Bundler が実行できないとき

結論

Gemfile.lock に書いてある Bundler のバージョンと、Capistrano が実行しようとする Bundler のバージョンが一致しない*1から。

前提条件

  • rbenv を使っていて Ruby は正しくインストールされている
  • 上記のバージョンの Ruby にて Bundler もインストールされている
  • sudo や root にて Ruby や Bundler をインストールしていない
  • デプロイするユーザにて、直接シェルから rbenv exec bundle -v と実行した場合は正常に実行できる
  • Capistrano によってデプロイ時に実行される $HOME/.rbenv/bin/rbenv exec bundle install --path ... にてエラーが出る

エラーメッセージの例

00:09 bundler:install
      01 /home/FOOBAR/.rbenv/bin/rbenv exec bundle install --path /home/FOOBAR…
      01 /home/FOOBAR/.rbenv/versions/2.5.3/lib/ruby/2.5.0/rubygems.rb:289:in `find…
      01 :
      01 can't find gem bundler (>= 0.a) with executable bundle
      01  (
      01 Gem::GemNotFoundException
      01 )

どうするか

解決方法はいくつかあると思いますし、それぞれにメリット・デメリットがあると思います。おそらく一番単純なのは、Gemfile.lock に書いてある Bundler のバージョンをデプロイ先にインストールすることです。例えば 1.17.1 を入れたければ以下のようにすればよいです。

$ gem install bundler -v '1.17.1'

そうすれば指定したバージョンの Bundler が入り、Capistrano はそれを見つけて使用してくれます。gem list した場合はたとえば以下のようになって複数のバージョンの Bundler が入っていることがわかります。

$ gem list

*** LOCAL GEMS ***

bigdecimal (default: 1.3.4)
bundler (2.0.1, 1.17.1)
cmath (default: 1.0.0)
(以下省略)

なぜ気づいたか

デプロイするユーザで直接シェルに入り、Gemfile.lock を削除してから bundle install したら成功したので気づきました。

補足

Capistrano うんぬんというよりかは、Gemfile.lock に関わる問題ですね。

超余談

Ruby 2.6.0 ではデフォルトで Bundler がインストールされてますね。

*1:当該バージョンがインストールされていない

Powered by はてなブログ