OneDay

40歳からプログラマとして生活しています。

Capistano デプロイ時に rbenvが見つからない時の対処方法

rails4.2.1 ruby 2.1.0 サーバーubuntu14.04
Capistranoでproduction環境のデプロイ実施。

Running ~/.rbenv/bin/rbenv exec bundle install --path (後略)
Command: cd /var/www/app/releases/20151002161222 && ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.0 ~/.rbenv/bin/rbenv exec bundle install --path /var/www/app/shared/bundle --without development test --deployment --quiet )
zsh:1: no such file or directory: /home/app/.rbenv/bin/rbenv

まさかrbenvが無いということはないだろうとサーバーに入って確認してみると、~/.rbenvには shims/ version versions/しか入っていなかった。
stagingでのデプロイ時にはこんなエラー出なかったので、stagingとproductionの設定の変化点を振り返る。
Capfileでrequire 'capistrano/rbenv'を有効にしていた。


ローカルのMacを改めて確認。えっ、こちらもshims/ version versions/のみ。
冷静になって、開発時の仮想マシンvagrant(Ubuntu)の~/.rbenvを確認してみた。
bin/ completions/ libexec/ LICENSE plugins/ rbenv.d/ README.md shims/ src/ test/ version versions/


Macとサーバー、vagrant のrbenvのバージョンを調べた。
Mac, サーバー:0.4.0
vagrant: 0.4.0-148-g5b9e4f0


このあたりでrbenvが異なるバージョンが入っている原因が見えてきた。インスール方法である。
Mac, サーバーはHomebrew/Linuxbrewを用いて、vagrantはgit cloneでインストールした。


暫く経って、rbenvについての素晴らしい記事を見つけた。
事前にこの記事を読んでいたら、対処方法は変わっていた。

[http://takatoshiono.hatenablog.com
sstephenson/rbenv · GitHub
を見るとちゃんと書いてあったりする。



capistrano/rbenv · GitHubを読むとしっかりrbenvをカスタム設定している場合は、:rbenv_custom_pathを使いなさいとある。

If your rbenv is located in some custom path, you can use rbenv_custom_path to set it.


deploy.rbにこう記載して試せば良かった。

set :rbenv_custom_path, '/usr/local/rbenv'

参考:
Rails Capistrano with wrong rbenv path? - Stack Overflow



数週間前の私は、ここまで至らずにドキドキしながら、
UbuntuサーバーのLinuxbrewでインストールしたrbenvを削除して、gitから再インストールした。

brew uninstall rbenv
rm -rf ~/.rbenv
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
rbenv install 2.1.0
rbenv global 2.1.0
rbenv rehash
gem install rails --version="4.2.1"

サーバーの~/.rbenvにも
bin/ completions/ libexec/ LICENSE plugins/ rbenv.d/ README.md shims/ src/ test/ version versions/が入り、

bin/bundle exec cap production deploy

が結果的に上手く行ったが、このやり方はリスクあるかもしれない。
rbenvのインストール方による違いを確認して、brewインストールの場合はrbenv_custom_pathの設定をして下さい。
同様のエラーで困っている人がいるかもしれないので参考として残しておきます。