結論
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:当該バージョンがインストールされていない