rails项目升级(rails3->rails4)

拖延了很久的rails版本升级终于告一段落了,由于目前项目作为一个大的单体应用,在讨论了几次后还是确定把rails3升级到rails4版本,最终升级到rails5.

修复版本第一阶段:
rails3.2 - rails4.0.13

预备工作: 做好前期准备,比如人员分配(新功能迭代和升级工作的安排),升级中业务能不能间断等问题。确定升级方案。

最终我们采用了两版本同时跑生产环境,先给rails4版本少量流量,要保证单台服务器一旦遇到问题,随时停掉,然后追踪修复错误,逐步释放更多流量,循环执行直到项目正常运行。

具体升级步骤:

第一步:

补测试,可能很多项目由于开发周期原因,测试覆盖不足。这里建议请至少保证测试覆盖到公司的主业务,当然覆盖度越高越好。建议这个时候把持续集成给补上(如果没有的话)。

第二步:

仔细阅读升级文档:

升级文档
https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#upgrading-from-rails-3-2-to-rails-4-0

release文档:https://edgeguides.rubyonrails.org/4_0_release_notes.html

一些踩过坑的博客如:http://www.recursion.org/incremental-rails-upgrade/

第三步

动手,按照升级文档修改代码,升级gem,并确保测试通过。

第四步

部署到staging服务器(连接到复制的一个线上数据库实例),录制线上流量测试,参考:https://ruby-china.org/topics/37756

第五步

通过newrelic追踪staging错误,修复错误,重复第四步的测试。

<h5>升级过程中遇到的坑:</h5>

Assets编译:

在rails4中asset编译的摘要算法发生了变化,也就是在rails3和rails4中相同内容编译出来的文件名是不同的,所以我们采取了将不同版本的机器的assets文件统一放到共享目录下,保证不同机器可以准确访问到assets资源。

json的time格式兼容:

rails4中时间格式"2018-12-04T16:54:40.000+08:00"不兼容rails3格式"2018-12-04T16:54:40+08:00"
导致安卓客户端时间格式解析失败。参考源码:

#  https://github.com/rails/rails/blob/master/activesupport/lib/active_support/time_with_zone.rb#L157

class ActiveSupport::TimeWithZone
  #Changing the as_json method to remove the milliseconds from TimeWithZone to_json result (just like in Rails 3)
  def as_json(options = {})
    if ActiveSupport::JSON::Encoding.use_standard_json_time_format
      xmlschema
    else
      %(#{time.strftime("%Y/%m/%d %H:%M:%S")} #{formatted_offset(false)})
    end
  end
end

ActiveRecord查询结果类型问题:

rails3中.all方法返回的是Array,Rails4中返回的是ActiveRecord::Relation

unscoped行为不一致:
rails3中查询语句

"SELECT `offline_charges`.* FROM `offline_charges`  WHERE `offline_charges`.`chargeable_id` = 4357 AND `offline_charges`.`chargeable_type` = 'RegRace'"

rails4中查询语句丢失关联条件

"SELECT `offline_charges`.* FROM `offline_charges`"

序列化和反序列化问题:

在rails4中存入的是!ruby/hash:ActionController::Parameters
rails3中存入的是: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
serialize, Rails use YAML by default to convert the data, 异常捕捉:SerializationTypeMismatch

first方法的变化:
rails4中因为因为添加了order by条件可能会导致某些优化不太好的查询很慢。

# rails4中.first调用
Photo Load (14453.0ms)  SELECT `photos`.* FROM `photos` WHERE `photos`.`album_id` = 88281 ORDER BY `photos`.`id` ASC LIMIT 1

# rails3中.first调用
Photo Load (15.2ms)  SELECT `photos`.* FROM `photos` WHERE `photos`.`album_id` = 88281 LIMIT 1

Cache缓存问题:

经过尝试发现rails4中缓存的内容rails3可以正常访问,而rails3缓存的内容在rails4中乱码?
而在一个讨论中明确表示该功能不会做向前兼容😓,详见: https://github.com/rails/rails/issues/17923

处理该问题我们隔离了不同版本机器的缓存db,注意一些缓存数据可能需要持久化到数据库中,不然当两次相关的访问分发到了不同版本的机器上会出现问题(当然这个问题在后面有一个比较好的解决方法)。

strong_parameters问题:

rails4中引入了strong parameter, 所以如果保持rails3的mass assign写法不变并兼容rails4,可以通过在rails3中引入strong_parameters gem包,
否则会遇到类似YAML.parse时抛出no module ActionController::Parameters错误以及其他的一些问题.

Cookie问题:

Rails3中cookie仅仅做了Base64编码,但是在rails4中为了安全在编码的基础上又做了一次加密(encrypted),rails4中的加密操作就是通过配置secret_key_base实现的(该配置在rails4.1版本后会使用config/secrets.yml配置形式)。这里根据官方文档,由于我们还没有准备全部切换为rails4环境,我们暂不引入secret_key_base,
将两版本下的配置统一为:
Myapp::Application.config.secret_token = “the secret token”
请注意,你要等到100%的切换到rails4并且不需要切换回rails3时再配置secret_key_base,因为rails4中基于新的secret_key_base生成的cookie是不可逆的。如果有其它的application或则js你的程序依赖你的程序提供assigned session cookies(或一般的assigned cookies),在你将两部分功能解耦前不要配置secret_key_base。

详见:https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#config-secrets-yml#action-pack

flash问题:
由于flash也是基于session的,兼容解决方案如下:

Errors like “NoMethodError: undefined method `sweep' for #<Hash …” after downgrading to Rails 3 from Rails 4

使用: https://stackoverflow.com/questions/30916375/errors-like-nomethoderror-undefined-method-sweep-for-hash-after-downgra/31186843

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容