部署 部署到 Heroku 的时候要注意 Ruby 版本

jasl · 发布于 2013年5月03日 · 最后由 linsk 回复于 2013年5月16日 · 4675 次阅读
1107

rt,下午花了大约十分钟为http://railsgirlschina.herokuapp.com/完成从微博微活动导出的CSV文件导入参与者信息的功能,本地测试完全正常,睡前准备在heroku的生产环境下测试,返回500,日志记录为“ArgumentError (invalid byte sequence in UTF-8):”,便怀疑Heroku上的上传的文件被按照ISO-8859或者其他单字节编码解了,尝试了很多方法都无效,google上也找不到合适的解答。

没有思路的时候,发现heroku上的ruby版本为1.9.2-p290,查文档升级到1.9.3-p392和开发环境一致,问题解决。

另,前几天部署第一版到Heroku的时候,在precompile assets时卡住,原因为没有配置环境变量,但报错的信息里也丝毫没有提到环境变量的问题,最后查文档解决

PAAS的预制环境虽然减少部署时候的工作量,但是容易忽视环境差异而造成的坑。所以, 在部署到PAAS前要注意了解下环境,出现线上线下表现不一致时优先考虑可能是因为软硬环境造成的 ,生产环境和开发环境一致这一原则在部署在PAAS的项目上依旧适用。

共收到 30 条回复
2880
luikore · #1 · 2013年5月03日

噗噗, 代码解决:

unless RUBY_VERSION >= '1.9.3'
  $stderr.puts "ruby version should be >= 1.9.3, but got #{RUBY_VERSION}"
  exit 1
end
1107
jasl · #2 · 2013年5月03日

#1楼 @luikore 在Gemfile里加入ruby '1.9.3` 然后Heroku部署的时候就能detect到,使用正确的ruby版本啦。昨天才发现Heroku还带bash,定制性越强坑越多啊...

67
_samqiu · #3 · 2013年5月03日

asset_precompile出错的问题可以看这里 https://devcenter.heroku.com/articles/rails-asset-pipeline#troubleshooting

Rails 3 的应用可以加上这句 config.assets.initialize_on_precompile = false

1107
jasl · #4 · 2013年5月03日

#3楼 @_samqiu 解决掉了,heroku的文档里还有更奇葩的方式解决——设置环境变量

67
_samqiu · #5 · 2013年5月03日

#4楼 @jasl 环境变量可以用这个。。。https://github.com/laserlemon/figaro

1107
jasl · #6 · 2013年5月03日

#5楼 @_samqiu 用这个 heroku config PATH=bin:vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin就可以 但你能想到么。。。我是不能- -

1970
xazaj · #7 · 2013年5月06日

heroku最近几天push一直无响应,你们可以?

1153
mobiwolf · #8 · 2013年5月06日

如果百度也出类似heroku一样的服务会怎么样?

1107
jasl · #9 · 2013年5月06日

#7楼 @xazaj 翻墙

1107
jasl · #10 · 2013年5月06日

#8楼 @mobiwolf 百度还是不要再多费电的好...

1153
mobiwolf · #11 · 2013年5月06日

#10楼 @jasl 呵呵,可以详细说一下理由吗?我很想听....

1970
xazaj · #12 · 2013年5月06日

@jasl Mac下用vpn翻墙,貌似不行,stackoverflow上有人也提了,貌似答案就说取消vpn没说其它方法呢。

$ git push heroku master #ssh: connect to host heroku.com port 22: Operation timed out #fatal: The remote end hung up unexpectedly

1107
jasl · #13 · 2013年5月06日

#11楼 @mobiwolf 百度的本职工作搜索做的都不行,我还是觉得百度再有心做其他业务的时候把核心业务搞好

另外 其他观点同陈皓http://coolshell.cn/articles/9308.html

1107
jasl · #14 · 2013年5月06日

#12楼 @xazaj 挂了VPN 一路畅通无阻...其他啥原因我也就懒得研究了 - -

1970
xazaj · #15 · 2013年5月06日

@jasl 嗯,多谢,应该是我用vpn ssh被封了。

1107
jasl · #16 · 2013年5月06日

#11楼 @mobiwolf 不用百度的产品似乎已经成为是否是优秀程序员的标准之一了,这或许不是百度技术的错,而是经过多次事件的洗礼,百度的品牌形象出现很大的问题了。 另外一方面,懂得使用PaaS的,大多数都是不用百度的程序员,这就成了矛盾...

1153
mobiwolf · #17 · 2013年5月06日

@jasl 看来百度是不是该考虑把整个开放平台拿出来做了,单独成立一个公司来运营这块。百度开放平台还是挺有价值的,最近也在思考要不要打出差异化牌。ruby就是一个挺好的切入点~

1107
jasl · #18 · 2013年5月06日

#17楼 @mobiwolf 看来你是百度的人哈? Ruby程序员恰好也不在百度的用户群当中,搞品牌差异化有助于产品推广,但是国内rubyist的基数...另外我作为开发者来说,更倾向用heroku,openshift,成熟、强大。

据我所知 SAE的Ruby支持已经黄掉了,所以国内应该没有支持RUby的paas,所以或许有戏

1153
mobiwolf · #19 · 2013年5月06日

#18楼 @jasl 呵呵,我只是一个小小的产品经理,喜欢逛各种技术社区。 1)ruby使用人群较少这个是一个事实,其根本原因在于整个链条的不成熟。起码连一个靠谱的部署环境都没有,我觉得如果有的话,还是会有不少人会用的。不会因为ruby而用百度云,但是可能会因为在百度云中绑定完善的Baas而用百度云。 2)heroku很强大,但是有座墙。速度跟不上,国内企业大规模应用还不成熟。

3)sae的ruby支持黄掉了,我觉得sae本身就应该黄掉......百度还目前支持Node.js,但是我觉得不如支持ruby有效果。node玩意更少用吧

4)百度可能会捆绑移动互联网整体解决方案来出。Baas,Push,图片处理,视频处理,搜索接口,百度风云榜,也就是业界最近流行啥,百度云就出啥后端服务,让开发者尽量关注逻辑和前端。

5)在4的基础上,推出Ruby支持,帮助更多的创业者快速开发,部署;也推出Ruby的自动化测试中心,web测试和mobile测试。

以上只是一个构想。

1107
jasl · #20 · 2013年5月06日

#19楼 @mobiwolf 翻墙是基本功...但是国内应该有一个提供Ruby支持的PaaS服务 其他的,似乎Amazon已经准备把他们的云服务搬到中国了,等着让市场检验吧

1153
mobiwolf · #21 · 2013年5月06日

#20楼 @jasl 恩,我也认为国内应该有一个支持Ruby的PaaS服务。 不怕狼一样的对手,就怕猪一样的队友。 竞争对手越多,说明这个事情越靠谱......

2973
small_fish__ · #22 · 2013年5月06日

评论从头看到尾,很有意思,~~sae刚一出来的时候,还有听说,可现在呢?heroku用着很爽~~

2973
small_fish__ · #23 · 2013年5月06日

#20楼 @jasl 请问下rails 4.0beta版本,heroku部署能通过吗?我没有指定ruby版本

1107
jasl · #24 · 2013年5月06日

#23楼 @small_fish__ 没试验过...不过heroku都可以选择ruby 2.0了

458
pobing · #25 · 2013年5月07日

#24楼 @jasl 你好,不知道你最近有没有遇到下面的错误,前几天还是可以的,最近push 代码老是超时

ssh: connect to host heroku.com port 22: Connection timed out
fatal: The remote end hung up unexpectedly

1107
jasl · #26 · 2013年5月07日

#25楼 @pobing 翻墙即可

96
linsk · #27 · 2013年5月15日

#26楼 @jasl 话说挂了PPTP L2TP SSH ShadownSocks都被墙~ 现在的VPN都像透明的一样

1107
jasl · #28 · 2013年5月15日

#27楼 @linsk 我现在用cisco ipsec 比较稳定,当然我感觉和vpn的服务质量有关

1173
xmonkeycn · #29 · 2013年5月16日

这个问题我在部署到heroku上也碰到过,后来强制加的encoding

CSV.new(params[:file].tempfile, :headers => true, encoding:"UTF-8").each do |row|'
   groupname=row[2]
   name = groupname.force_encoding('UTF-8')
96
linsk · #30 · 2013年5月16日

#28楼 @jasl 谢谢,非常悲剧。实际上是我忘记VPN创建以后要去设置中勾选「通过VPN连接发送所有流量」几年前就踩过Mac上这个坑了,没想到又深深的踩了一次。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册