部署EngineYard预发环境时遇NoMethodError错误求解决
解决EngineYard预发部署中
ecwid_api gem安装失败的问题 嘿,我之前在EngineYard部署Git源的gem时也碰到过一模一样的NoMethodError: undefined method 'spec' for nil:NilClass报错,结合你的场景,给你整理了几个亲测有效的排查和解决步骤:
1. 先在本地验证gem本身没问题
首先得排除是这个ecwid_api gem的spec文件有问题,毕竟它是来自私有Git仓库的特定版本:
- 先把仓库克隆到本地:
git clone https://github.com/ParthivPatel-BTC/ecwid_api.git - 切到你指定的那个revision:
git checkout 079b697157356612b993e42f1e71269024b7c376 - 尝试本地构建并安装:
gem build ecwid_api.gemspec && gem install ecwid_api-0.2.2.gem
如果这一步失败,那就是gem的spec文件有问题(比如依赖写错了、元数据缺失),得先修复仓库里的ecwid_api.gemspec;如果成功,那问题肯定出在EngineYard的部署流程或者缓存上。
2. 清理Bundler缓存和旧的Gemfile.lock
EngineYard的部署经常会复用缓存的gem,旧缓存很可能会干扰新gem的安装:
- 本地项目里先删掉
Gemfile.lock,重新跑bundle install生成全新的lock文件,确保它是基于当前gem状态的。 - 登录到预发服务器,先清理Bundler缓存:
bundle clean --force,再手动删掉RVM里这个gem的缓存目录:rm -rf /home/ey/.rvm/gems/ruby-2.2.3/cache/bundler/git/ecwid_api-* - 重新触发部署,或者手动在服务器项目目录下跑
bundle install测试能不能成功。
3. 调整Gemfile里的git源声明方式
有时候Bundler对特定revision的git源处理会抽风,试试给gem声明加上specs: true强制拉取spec:
原来的声明大概是这样:
gem 'ecwid_api', git: 'https://github.com/ParthivPatel-BTC/ecwid_api.git', ref: '079b697157356612b993e42f1e71269024b7c376'
改成:
gem 'ecwid_api', git: 'https://github.com/ParthivPatel-BTC/ecwid_api.git', ref: '079b697157356612b993e42f1e71269024b7c376', specs: true
然后重新生成Gemfile.lock再部署,这个参数能强制Bundler从Git仓库拉取完整的gem spec,避免找不到spec的问题。
4. 检查Bundler和EngineYard Serverside的版本兼容性
你的报错来自engineyard-serverside-2.6.14,而你用的是Ruby 2.2.3,这个组合可能有兼容性问题:
- 先在服务器上看当前Bundler版本:
bundle -v,Ruby 2.2.x不支持Bundler 2.x,所以如果是2.x版本,得降级到1.x的稳定版,比如gem install bundler -v 1.17.3 - 另外也可以试试升级EngineYard Serverside工具到和你的环境匹配的最新版本,旧版本的工具处理Git源gem经常会有bug。
5. 手动在服务器安装gem绕开部署脚本
如果上面的步骤都不行,那就手动在预发服务器上安装这个gem,看能不能绕开Chef脚本的问题:
- 先切换到项目目录:
cd /data/你的应用名/current - 切换到正确的Ruby版本:
rvm use ruby-2.2.3 - 先装
specific_install工具,然后直接从Git仓库安装指定revision的gem:gem install specific_install && gem specific_install -l https://github.com/ParthivPatel-BTC/ecwid_api.git -r 079b697157356612b993e42f1e71269024b7c376
如果这一步成功,那就是Chef Recipe或者EngineYard部署脚本的问题,可以调整Chef步骤,先手动安装这个gem再执行bundle install。
内容的提问来源于stack exchange,提问作者Amit Patel
相关产品推荐
相关产品推荐

