如果通过 Chef 安装,则无法为 ruby 应用捆绑 locate/execute gem
Bundle unable to locate/execute gems for ruby app if installed through Chef
我正在尝试通过 Chef 部署 ruby 应用程序。
我已经通过 rvm 安装了 ruby 和 rubygems。
当我在 shell 上手动执行捆绑安装 --deployment 时,我将所有捆绑包下载到 vendor/bundle 位置并且一切正常。
但是当我使用 bash 资源对 chef 执行相同操作时,我收到下面提到的错误消息。我觉得 PATH 或环境变量有问题。通过 chef 也可以下载所有的 gem,但是当我打开 shell 并检查时,我得到了错误。
请注意 - 厨师食谱执行时没有任何错误。
*bundle exec rake db:create RAILS_ENV=production
(in /home/xyz)
rake aborted!
undefined method `[]' for nil:NilClass
/home/xyz/Rakefile:4:in `require'
(See full trace by running task with --trace)*
# ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
# gem -v
1.8.1
bundle -v
Bundler version 1.0.15
# gem env
RubyGems Environment:
- RUBYGEMS VERSION: 1.8.1
- RUBY VERSION: 1.9.2 (2011-07-09 patchlevel 290) [x86_64-linux]
- INSTALLATION DIRECTORY: /usr/local/rvm/gems/ruby-1.9.2-p290
- RUBY EXECUTABLE: /usr/local/rvm/rubies/ruby-1.9.2-p290/bin/ruby
- EXECUTABLE DIRECTORY: /usr/local/rvm/gems/ruby-1.9.2-p290/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-linux
- GEM PATHS:
- /usr/local/rvm/gems/ruby-1.9.2-p290
- /usr/local/rvm/gems/ruby-1.9.2-p290@global
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :benchmark => false
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
- http://rubygems.org/
bash "bundle install" do
user "root"
cwd "/home/xyz/"
code <<-EOH
source /etc/profile.d/rvm.sh
rvm use 1.9.2-p290 --default
/usr/local/rvm/gems/ruby-1.9.2-p290/bin/bundle install --path vendor/bundle
/usr/local/rvm/gems/ruby-1.9.2-p290/bin/bundle exec rake db:create RAILS_ENV=production
EOH
end
这是我第一次部署任何 ruby 应用程序,我在谷歌上搜索了很多并尝试了很多解决方案,但我收到越来越多的错误但没有解决方案。
任何形式的帮助将不胜感激。
谢谢,
伊姆兰
所以我认为您在使用 RVM 安装的 ruby 时遇到一些问题的原因与 linux + shell 的性质有关。当 RVM
向您提供可以在您的系统上安装的 ruby 构建列表时,它掩盖了很多复杂性。简单的答案是 RVM(类似于 rbenv
)通过连接到您环境的 PATH
来工作......这是 Sam Stephenson 在这里提供的非常详细的解释:How do RVM and rbenv actually work? 但我离题了。我的猜测是您的 RVM 安装是为单个用户安装的,例如拥有主目录 /home/xyz/
的用户。在这一点上,我认为你的问题如下:
您通过单用户安装安装了 RVM(此处有详细信息:https://rvm.io/rvm/install)。当您安装 RVM 时,他们可能会让您在此处执行此步骤:echo "source $HOME/.rvm/scripts/rvm" >> ~/.bash_profile
。此步骤将命令添加到您的 .bash_profile
中,以便在每个新的 session/terminal window 上,您的用户(在本例中为用户 xyz
)读取有关如何 run/use RVM。 Chef 中的 bash 资源实际上并未使用您用于连接和 运行 命令的相同 shell。我的想法是,如果你 运行 是这样的:
bash 'install_ruby_stuff' do
cwd ::File.dirname(/home/xyz)
code <<-EOH
source /home/xyz/.rvm/scripts/rvm
bundle exec rake db:create RAILS_ENV=production
EOH
end
我觉得它可能会好一点。如果这不起作用,运行 which bundle
并找出 rvm 为 bundle 命令安装 bin 存根的确切位置,然后将上面的 bundle
替换为 /path/to/bundle
,这可能也有帮助。 Chef 中的每个 bash 资源调用本质上都被视为单独的 shell,因此您需要的任何 PATH
或 ENV
变量都需要在与bash 资源被调用。
希望对您有所帮助!
我正在尝试通过 Chef 部署 ruby 应用程序。 我已经通过 rvm 安装了 ruby 和 rubygems。
当我在 shell 上手动执行捆绑安装 --deployment 时,我将所有捆绑包下载到 vendor/bundle 位置并且一切正常。
但是当我使用 bash 资源对 chef 执行相同操作时,我收到下面提到的错误消息。我觉得 PATH 或环境变量有问题。通过 chef 也可以下载所有的 gem,但是当我打开 shell 并检查时,我得到了错误。 请注意 - 厨师食谱执行时没有任何错误。
*bundle exec rake db:create RAILS_ENV=production
(in /home/xyz)
rake aborted!
undefined method `[]' for nil:NilClass
/home/xyz/Rakefile:4:in `require'
(See full trace by running task with --trace)*
# ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
# gem -v
1.8.1
bundle -v
Bundler version 1.0.15
# gem env
RubyGems Environment:
- RUBYGEMS VERSION: 1.8.1
- RUBY VERSION: 1.9.2 (2011-07-09 patchlevel 290) [x86_64-linux]
- INSTALLATION DIRECTORY: /usr/local/rvm/gems/ruby-1.9.2-p290
- RUBY EXECUTABLE: /usr/local/rvm/rubies/ruby-1.9.2-p290/bin/ruby
- EXECUTABLE DIRECTORY: /usr/local/rvm/gems/ruby-1.9.2-p290/bin
- RUBYGEMS PLATFORMS:
- ruby
- x86_64-linux
- GEM PATHS:
- /usr/local/rvm/gems/ruby-1.9.2-p290
- /usr/local/rvm/gems/ruby-1.9.2-p290@global
- GEM CONFIGURATION:
- :update_sources => true
- :verbose => true
- :benchmark => false
- :backtrace => false
- :bulk_threshold => 1000
- REMOTE SOURCES:
- http://rubygems.org/
bash "bundle install" do
user "root"
cwd "/home/xyz/"
code <<-EOH
source /etc/profile.d/rvm.sh
rvm use 1.9.2-p290 --default
/usr/local/rvm/gems/ruby-1.9.2-p290/bin/bundle install --path vendor/bundle
/usr/local/rvm/gems/ruby-1.9.2-p290/bin/bundle exec rake db:create RAILS_ENV=production
EOH
end
这是我第一次部署任何 ruby 应用程序,我在谷歌上搜索了很多并尝试了很多解决方案,但我收到越来越多的错误但没有解决方案。 任何形式的帮助将不胜感激。
谢谢, 伊姆兰
所以我认为您在使用 RVM 安装的 ruby 时遇到一些问题的原因与 linux + shell 的性质有关。当 RVM
向您提供可以在您的系统上安装的 ruby 构建列表时,它掩盖了很多复杂性。简单的答案是 RVM(类似于 rbenv
)通过连接到您环境的 PATH
来工作......这是 Sam Stephenson 在这里提供的非常详细的解释:How do RVM and rbenv actually work? 但我离题了。我的猜测是您的 RVM 安装是为单个用户安装的,例如拥有主目录 /home/xyz/
的用户。在这一点上,我认为你的问题如下:
您通过单用户安装安装了 RVM(此处有详细信息:https://rvm.io/rvm/install)。当您安装 RVM 时,他们可能会让您在此处执行此步骤:echo "source $HOME/.rvm/scripts/rvm" >> ~/.bash_profile
。此步骤将命令添加到您的 .bash_profile
中,以便在每个新的 session/terminal window 上,您的用户(在本例中为用户 xyz
)读取有关如何 run/use RVM。 Chef 中的 bash 资源实际上并未使用您用于连接和 运行 命令的相同 shell。我的想法是,如果你 运行 是这样的:
bash 'install_ruby_stuff' do
cwd ::File.dirname(/home/xyz)
code <<-EOH
source /home/xyz/.rvm/scripts/rvm
bundle exec rake db:create RAILS_ENV=production
EOH
end
我觉得它可能会好一点。如果这不起作用,运行 which bundle
并找出 rvm 为 bundle 命令安装 bin 存根的确切位置,然后将上面的 bundle
替换为 /path/to/bundle
,这可能也有帮助。 Chef 中的每个 bash 资源调用本质上都被视为单独的 shell,因此您需要的任何 PATH
或 ENV
变量都需要在与bash 资源被调用。
希望对您有所帮助!