Chen Yangjian's Blog

Carpe diem - Seize the day

项目发布、Ruby Gems、Bundler 与伟大的墙

| Comments

敝人在做的一个小项目,有一些些小改进,经过一番测试,于昨日开始上线。项目用的 Ruby on Rails,并依赖一系列 Ruby Gems,为了方便后续的 1.8 -> 1.9 转换,并保证两边不耽误,1.8 的紧急除虫之类的工作能够照常进行,又加了 RVM(Ruby Version Manager?)。在自己的机器、测试环境里头看看,一切正常,今天 cap production deploy 的时候,挂了无数次,回滚了无数次,到刚刚,可算是成了,现记录血泪史如下。

前几次失败,是自己 naive 了,忘了给产品环境安装 RVM,又忘了在 RVM 里头装需要的 Ruby 版本,以及它的 gemset,1.8.7@my-awesome-project。这导致项目里的 .rvmrc 执行出错了。贪图方便,我在项目里配置了 .rvmrc。生成它的方法很简单:

$ rvm --rvmrc --create 1.8.7@my-gemset

就可以了。不过这里有个 git 带来的问题。我全局开启了 cr 自动转成 crlf,结果 .rvmrc 在转掉之后,bash 执行出错了,不认得 ^M 字符。因为 bash 脚本实在不熟,只好含泪先把 crlf 关关掉,凑合用一下先。

再说回到产品环境的解决,自然就是安装 RVM,然后安装 bundler。在这个原以为柳暗花明的时候,伟大的墙出现了,gem install bundler -v 1.0.21 一直超时,等了半个早上都装不好。无奈之下,只好在本机翻墙出去,搞到了 bundler-1.0.21.gem,sftp 登到产品机器,放上去,再安装:

$ curl http://rubygems.org/downloads/bundler-1.0.21.gem
$ sftp foo@hawlscastle.com
$ > put Downloads/bundler-1.0.21.gem
$ ssh foo@hawlscastle.com
$ bundle install --local

原本呢,直接从 rubygems.org bundle install 肯定也是不行的;幸好之前做了 bundle package,把所有依赖的 gem 都写到了项目的 vender/cache 目录,如此,总算是在墙内完成了这些事情。

Comments