42

我在部署我们的 Rails 应用程序时遇到问题。我创建了一个类似于 AWS 博客 howto http://ruby.awsblog.com/post/Tx2AK2MFX0QHRIO/Deploying-Ruby-Applications-to-AWS-Elastic-上的示例的钩子Beanstalk-with-Git像:

packages:
  yum:
    git: []

即使我运行一个捆绑包来创建供应商/缓存以将所有宝石都放在那里......并且仍然得到:git://github.com/refinery/refinerycms-search.git(在2-0-stable)没有被检查出去。请运行bundle install(Bundler::GitError)

任何帮助都会很好,我们试图将我们所有的应用程序转移到 EB。但看到 git 没有安装或发生了什么事。我需要它创建的 EB ec2 实例上的 git。

堆栈跟踪:

Error message:
git://github.com/refinery/refinerycms-search.git (at 2-0-stable) is not checked out.         Please run `bundle install` (Bundler::GitError)
Exception class:
PhusionPassenger::UnknownError
Application root:
/var/app/current
Backtrace:
#   File    Line    Location
0   /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/source.rb 801 in        `rescue in load_spec_files'
1   /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/source.rb 799 in   `load_spec_files'
2   /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/source.rb 381 in `local_specs'
3   /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/source.rb 774 in `specs'
4   /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/definition.rb 174 in `block in resolve'
5   /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/definition.rb 172 in `each'
6   /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/definition.rb 172 in `resolve' 
7   /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/definition.rb 113 in `specs'
8   /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/definition.rb 158 in `specs_for'
9   /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/definition.rb 147 in `requested_specs'
10  /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/environment.rb    23  in `requested_specs'
11  /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler/runtime.rb    11   in `setup'
12  /usr/share/ruby/1.9/gems/1.9.1/gems/bundler-1.2.1/lib/bundler.rb    116 in `setup'
13  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/utils.rb    326 in `prepare_app_process'
14  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/rack/application_spawner.rb 156 in `block in initialize_server'
15  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/utils.rb    563 in `report_app_init_status'
16  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/rack/application_spawner.rb 154 in `initialize_server'
17  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-  1002/support/lib/phusion_passenger/abstract_server.rb    204 in `start_synchronously'
18  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/abstract_server.rb  180 in `start'
19  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/rack/application_spawner.rb 129 in `start'
20  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/spawn_manager_orig.rb   253 in `block (2 levels) in spawn_rack_application'
21  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/abstract_server_collection.rb   132 in `lookup_or_add'
22  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/spawn_manager_orig.rb   246 in `block in spawn_rack_application'
23  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/abstract_server_collection.rb   82  in `block in synchronize'
24      prelude>    10:in `synchronize'
25  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/abstract_server_collection.rb   79  in `synchronize'
26  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/spawn_manager_orig.rb   244 in `spawn_rack_application'
27  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/spawn_manager_orig.rb   137 in `spawn_application'
28  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/spawn_manager.rb    16  in `spawn_application_with_env'
29  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/spawn_manager_orig.rb   275 in `handle_spawn_application'
30  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/abstract_server.rb  357 in `server_main_loop'
31  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/lib/phusion_passenger/abstract_server.rb  206 in `start_synchronously'
32  /var/lib/passenger-standalone/3.0.17-x86_64-ruby1.9.3-linux-gcc4.4.6-1002/support/helper-scripts/passenger-spawn-server

更新更多信息:我决定使用 ec2-user 登录实例,并注意到安装了 git 到目前为止我可以看到我需要的 gem抱怨..我确实注意到,当我做一个一般的宝石列表时,它不会出现......但它应该使用捆绑包。

4

5 回答 5

57

(请注意,只有在必须将 Git 源用于依赖项时才应使用以下解决方法。如果可以避免,建议不要从外部 Git 存储库安装依赖项。有关原因的详细信息,请参见下文。

在带有 Passenger 的 Gemfile 中使用 Git 支持的库时,您必须在安装中禁用共享 gem(除了在上面列出的挂钩中安装 Git)。您可以通过在现有文件中设置BUNDLE_DISABLE_SHARED_GEMSBundler 环境变量来执行此操作,如下所示:.ebextensions/ruby.config

option_settings:
  - option_name: BUNDLE_DISABLE_SHARED_GEMS
    value: "1"
  - option_name: BUNDLE_PATH
    value: "vendor/bundle"

packages:
  yum:
    git: []

禁用共享 gem 将强制所有依赖项按照变量vendor/bundle指定的方式供应到您的应用程序中BUNDLE_PATH

请注意,只要有可能,您应该避免在您的应用程序中安装来自 Git 源的公共库。将 Git 用于库位置会给部署安装带来另一个故障点,因为 Git 存储库可能暂时不可用,甚至永久移动。另请记住,在部署中强制安装供应商会导致您的 Elastic Beanstalk 部署在具有相同依赖项的应用程序的后续部署中慢得多。这是因为库将在每次部署时重新安装,而不是利用 Elastic Beanstalk 让 Bundler 默认执行的系统范围安装。

简而言之,如果有相关库的官方 RubyGem 版本,您应该改用该版本;如果没有,您应该向库作者建议提供正式的 RubyGem 版本。

仅供参考,以前曾问过有关此 Git 问题与常规乘客/Rails 部署的类似问题:Rails 3:Passenger can't find git gems installed by bundler

于 2012-12-01T07:41:39.270 回答
14

另一种选择是将 gem 源直接打包到您的应用程序中,然后将 bundler 指向那里。

将 gem 源复制到 vendor/gems/mygem

然后,在您的 Gemfile 中:

gem 'mygem', path: File.join(File.dirname(__FILE__), 'vendor', 'gems', 'mygem')

在此处查看更多信息:http: //viget.com/extend/bundler-best-practices

于 2013-12-18T22:11:47.283 回答
6

Amazon 的 Elastic Beanstalk Ruby AMI 需要稍作调整,以允许您在不牺牲部署速度的情况下从 git 捆绑 gem,这是您使用 Capistrano 和 Heroku 开箱即用的行为。

幸运的是,Elastic Beanstalk 配置 API 可以进行必要的调整,而无需您维护自定义 AMI。

这是我用来通过 Amazon 自己的 AMI 获得所需的常规 Ruby 部署行为的 Elastic Beanstalk 配置:https ://github.com/gkop/elastic-beanstalk-ruby 。

于 2013-06-01T22:52:08.870 回答
5

尝试接受的答案后,我发现更简单.ebextensions/ruby.config的配置是唯一有效的配置:

packages:
  yum:
    git: []
于 2017-09-14T16:33:14.283 回答
2
  • 好的,经过大量研究和测试,我认为这与亚马逊在乘客环境值方面存在一些问题有关......
  • 我能够手动运行 rails s 然后它工作正常并且所有宝石都加载了..但是如果我运行它并没有发现乘客

    捆绑包--全部

  • --all所以它也打包了 git gems..

  • 然后它会像魅力一样运行..

  • 为了能够在亚马逊使用捆绑包修复此问题的同时运行此问题,我创建了一个钩子并强制它在每次安装后运行。不是最好的方法,但有效。

注意:使用我看不到的钩子在 EB 更新上运行命令,所以我 git 添加了供应商/缓存,默认情况下它会全部上传。

于 2012-12-01T05:40:07.070 回答