Elastic Beanstalk Ruby/Rails 需要安装 git,所以 bundle install 可以工作.. 但不是
Posted
技术标签:
【中文标题】Elastic Beanstalk Ruby/Rails 需要安装 git,所以 bundle install 可以工作.. 但不是【英文标题】:Elastic Beanstalk Ruby/Rails need to install git so bundle install works.. but is not 【发布时间】:2012-11-18 11:51:20 【问题描述】:我在部署我们的 Rails 应用程序时遇到问题。我创建了一个钩子,就像 AWS 博客 howto http://ruby.awsblog.com/post/Tx2AK2MFX0QHRIO/Deploying-Ruby-Applications-to-AWS-Elastic-Beanstalk-with-Git 上的示例一样:
packages:
yum:
git: []
即使我运行了一个捆绑包来创建供应商/缓存以将所有的 gem 放在那里......并且仍然得到:
git://github.com/refinery/refinerycms-search.git (at 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 到目前为止,我可以看到我需要的 gems 已安装.. 当我执行 bundle list 时,它们甚至都会显示错误所抱怨的那个.. 我确实注意到,当我执行一般 gem list 时 然后它不会显示...但它应该使用捆绑包。
【问题讨论】:
使用完整的错误堆栈跟踪更新您的问题。 好的,感谢您对此进行调查 您能确认一下您的 Ruby 版本吗? 是 AWS Elastic Beanstalk 1.9.3 选项 64 位 克里斯,你并不孤单,我也有同样的问题。如果我知道如何解决这个问题,我会告诉你的。 【参考方案1】:(请注意,仅当您必须将 Git 源用于依赖项时才应使用以下解决方法。如果可以避免,建议不要从外部 Git 存储库安装依赖项。请参阅下面详细了解为什么会这样。)
当在带有 Passenger 的 Gemfile 中使用 Git 支持的库时,您必须在安装中禁用共享 gem(除了在上面列出的挂钩中安装 Git)。您可以通过在现有的 .ebextensions/ruby.config
文件中设置 BUNDLE_DISABLE_SHARED_GEMS
Bundler 环境变量来做到这一点,如下所示:
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 3: Passenger can't find git gems installed by bundler
【讨论】:
那么钩子/EB 将为您安装所有内容到供应商/捆绑包?所以不需要我用 bundle package 命令发送一个钩子吧? hmm 很奇怪.. 我尝试按照你的方式去做,它确实创建了供应商/捆绑包,但我又回到了缺少 gem 的问题.. :-( 我无法重现这个。我使用refinerycms 和refinerycms-search gem 创建了一个全新的应用程序,它能够使用上述ebextension 加载它们。你试过新鲜的容器吗?此外,它仍然是失败的宝石吗? @LorenSegal 而不是捆绑共享的 gem,您可以获得相同的行为(不是在每次部署时重新安装所有 gem)无需通过将供应商/捆绑符号链接到稳定的来破坏 git gem位置,然后运行$ bundle --deployment
。请参阅部署您的应用程序下的 gembundler.com/v1.2/rationale.html。此外,从 git 捆绑有几个很好的理由;许多遇到这个问题的人正在从 git 捆绑不在 RubyGems 上的代码。
FWIW,在 puma(而不是乘客)中运行时,设置 BUNDLE_*
环境变量似乎没有必要。【参考方案2】:
另一种选择是直接将 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
【讨论】:
因为我使用的是 Puma 而不是Passenger,所以我决定走这条路线,而且效果很好。对于那些想知道的人(就像我一样),我只是在 Github 中舔了一下“以 zip 格式下载”,然后将整个文件夹粘贴到 /vendor/gems/#gem_name 中,它就起作用了。【参考方案3】: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。
【讨论】:
这个文件不做 db:create?什么时候发生? @DeBuGGeR 其他 Rails 部署系统,如 Capistrano 和 Heroku,通常也不运行rake db:create
。对于 Elastic Beanstalk,eb init
命令为您提供了创建 RDS 数据库的选项。我没有亲自尝试过,但这篇博文似乎是一个很好的起点:medium.com/ruby-on-rails/…
那么 db:create 什么时候发生? eb init 也没有运行 db:create 或 db:migrate 或 db:seed。我的应用程序显示 502,我迷路了,似乎没有人在任何地方解决或解释过这个问题。我也完成了 AWS 文档。
我相信您不需要运行rake db:create
,因为eb init
会为您创建RDS db。弹性豆茎自动运行rake db:migrate
。如果你想让rake db:seed
运行,我相信你必须将它添加到.ebextensions/
的配置中。
好吧,感谢您解决此问题,我直接连接到 Amazon RDS 并执行了此操作。但你是对的!谢谢!【参考方案4】:
在尝试接受的答案后,我发现更简单的 .ebextensions/ruby.config
是唯一有效的配置:
packages:
yum:
git: []
【讨论】:
对我来说也是如此,除了我必须将文件重命名为.ebextensions/00_packages.config
。否则 git 似乎安装得太晚了。文件名显然很关键
我实际上必须将文件命名为 ruby.config,如上所述。否则安装 git 太晚了,无法安装所需的 gem。【参考方案5】:
经过大量研究和测试,我认为这是相关的
亚马逊在乘客环境值方面存在一些问题......
我能够手动运行 rails s,然后它运行良好,所有 加载了宝石..但是如果我运行它并没有发现乘客,它并没有发现
捆绑包--全部
--all 所以它也打包了 git gems..
然后它会像魅力一样运行..
能够在亚马逊修复此问题的同时运行此程序 使用捆绑包我创建了一个钩子并在每次安装后强制它运行。 不是最好的方法,但有效。
注意:使用我看不到的钩子在 EB 更新上运行命令,所以我 git 添加了供应商/缓存,默认情况下它会全部上传。
【讨论】:
我正在尝试这个解决方案,出售所有 git gem。由于使用上一个答案中描述的方法,一旦启动新实例,它就无法从 git 安装所需的 gem以上是关于Elastic Beanstalk Ruby/Rails 需要安装 git,所以 bundle install 可以工作.. 但不是的主要内容,如果未能解决你的问题,请参考以下文章
在 AWS Elastic Beanstalk 和 EKS 上部署了一个 laravel 应用程序 相同的数据库 RDS 为啥在 Elastic Beanstalk 中获得快速响应
AWS Elastic Beanstalk CLI 安装错误