我正在使用厨师配置一个流浪盒,然后使用capistrano部署我的应用程序。
我的主厨装配件如下:
include_recipe "rbenv"
include_recipe "rbenv::ruby_build"
rbenv_ruby node[:rbenv][:ruby] do
global true
end
rbenv_gem "bundler" do
ruby_version node[:rbenv][:ruby]
end
当我尝试使用带有capistrano的bundle
时,我发现已执行的捆绑包是预装在包装盒上的捆绑包,而不是由厨师安装的捆绑包。
问题在于:
$ which bundle
/opt/rbenv/shims/bundle
$ sudo which bundle
/usr/bin/bundle
$ sudo su -
root# which bundle
/opt/rbenv/shims/bundle
基本上看起来Capistrano使用第二种形式运行命令,如果它使用/usr/bin/bundle
。
我试过跑:
$ sudo bundle
/usr/lib/ruby/vendor_ruby/bundler/rubygems_ext.rb:8:in `require': no such file to load -- rubygems (LoadError)
from /usr/lib/ruby/vendor_ruby/bundler/rubygems_ext.rb:8
from /usr/lib/ruby/vendor_ruby/bundler.rb:11:in `require'
from /usr/lib/ruby/vendor_ruby/bundler.rb:11
from /usr/bin/bundle:4:in `require'
from /usr/bin/bundle:4
我获得了与Capistrano相同的异常。
如果我手动卸载bundler
,那么这就是我获得的内容:
$ bundle
Bundler::GemfileNotFound
$ sudo bundle
sudo: bundle: command not found
$ sudo su -
root# bundle
Bundler::GemfileNotFound
更新
我认为整个ruby版本不适用于sudoers:
$ ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]
$ sudo ruby -v
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
更麻烦的是。
你能帮帮我吗?
感谢。
答案 0 :(得分:3)
问题不在于rbenv
- 托管的Ruby不适用于sudoers。问题是默认使用系统Ruby,除非被其他东西覆盖 - 通常是.bashrc
或/etc/profile.d/*
等。
由于capistrano
不提供任何这些文件,因此它使用系统Ruby。
您应该通过添加以下内容告诉cap
在系统之前使用rbenv
bin路径:
set :default_environment, {
'PATH' => "/opt/rbenv/shims:/opt/rbenv/bin:$PATH"
}
到您的deploy.rb
文件。
在Capistrano v3中,:default_environment
已重命名为:default_env
。
答案 1 :(得分:0)
显然可以使用default_env
调整,但不是首选方法。
as:
set :default_environment, {
'PATH' => "/opt/rbenv/shims:/opt/rbenv/bin:$PATH"
}
不是由capistrano维护,甚至可能是危险的。
首选方法是查看要运行的程序以找到解决此问题的方法。
特别是我的问题:RVM需要在shell启动时初始化,任何RVM安装工具都会包含你的.bashrc,并在文件末尾调用正确的init脚本。同样在.bashrc的开头,有一个命令在非交互式shell上调用时退出脚本。
意外地,Capistrano在非交互式shell上运行脚本,因此当它调用RVM命令时,它们不会在非交互式shell中初始化。
我的解决方案是编辑chef中的.bashrc文件,以便在退出之前调用RVM init脚本。