はじめまして。今年度、新卒で入社したエンジニアのうなすけ(id:yu_suke1994)です。RubyもRailsも触り始めたばかりなのですが、なんと入社早々にRailsのバージョンを上げるという大役を任されたので、それについて書いていこうと思います。
tmixの経緯
tmixの歴史について、社内esaをさかのぼって調べてみました。するとわかったことが、ローンチは2009年で、つまり今年で6年が経過することになります(僕が高専に入学する前からあるのか……!)。このブログの過去の記事にもありますが、deployが自動化されたのは去年2014年と、息の長いサービスだけに、現状とそぐわなくなってきている部分も多くなってきています。 僕が入社した頃のRailsは3.2.21で、この時点でRails4.0.0のリリースから2年が経過しています。さすがにもう……ということで、僕にその役目がまわってきました。
アップグレード作業
3.2 → 4.0と、メジャーバージョンが上がっているので一見アップグレードは難しそうに見えます。しかし、そもそもリリースから2年経過しているので、移行にあたっての注意点などはインターネットに記事が豊富にありました。(Rails 4 へのアップグレード時に遭遇した問題 - クックパッド開発者ブログ) そして何よりも、自動化ツールであるxinminlabs/synvertの登場によって、アップグレード作業の難易度がぐんと下がっています。
synvertによる自動変換
$ gem install synvert $ synvert --sync $ synvert --run rails/upgrade_3_2_to_4_0
これで、ガッとfind_by_id()
などがwhere(id:).first
に、before_filter
がbefore_action
に、match
がget
に変換されました。
職人の手による温かみのある変換
しかし、これだけで済むほどアップグレード作業は楽ではありません。例えばsynvertはconditions:
はデフォルトでは面倒を見てくれませんし、match
が全てget
に代わると、post
でもアクセスしていたページでエラーが発生します。他にも正規表現の行頭、行末を表す識別子についても変更が必要になりました。
# old syntax #has_many :products, conditions: ['product.status <> 1'] has_many :products, -> { where("product.status <> 1") }
# old syntax #match "contact_voice", :controller => 'root', :action => 'contact_voice' get "contact_voice", controller: 'root', action: 'contact_voice' post "contact_voice", controller: 'root', action: 'contact_voice'
# old syntax #validates_format_of :username1, :username2, :with => /^[ア-ン゛゜ァ-ォャ-ョー]+$/ validates_format_of :username1, :username2, with: /\A[ア-ン゛゜ァ-ォャ-ョー]+\z/
Gemのアップデート
手作業での変換作業が終わり、Gemのアップデートを行いました。単純に、Railsのバージョン、それに伴うrails-i18nやcoffee-railsなど各種Gemのバージョンの指定を行い、$ bundle update
を行いました。
テスト
そして、テストが通ることを確認しました。……とはいえ、過去記事(tmix今昔物語)にもある通り、地道にカバレッジを上げている状況なので、6歳のtmixの全てはカバーできていません。そこで、職人たちの目による温かみのあるテストを行いました(ここで言う「職人」とは、tmixのモダン化に貢献したasonasさん、普段からお客様からのtmixへの質問に対応しているサポートスタッフの皆様などを指します)。
リリース
職人たちの厳しいチェックをくぐり抜けた後の、本番へのdeployは自動化されているので安心感があります。そうは言っても緊張するもので、ずっとCIの様子を見たり、確認したはずなのにいろんなリンクにアクセスしてみたり、膝が震えたりしました。
ですが、何事もなくRails4系が動いてるみたいなので、社内でもincrementされました。
この調子で、Rubyも2.2.2に、またRails4.1や4.2へのアップデートもやっていきたいと思います!
アップグレードを振り返って
そもそも周りの就職した同級生が新人研修を終えていない中で、いきなり実戦投入され、Railsのアップグレードという大仕事を終えることができたという僕は、非常に幸運です(新人研修をしてないわけではないです)。というのも、この作業によってRailsへの知識が格段に増えたことと、tmixに貢献できたことで、「俺が関わってるんだ!」という意識をとても速く得られることができたからです。 また他にも、アップグレード作業の最中に、継続的デリバリーを4章まで読みました。サイクルタイムを早めるための、自動化されたテスト。それが必要なのに、今は職人たちの手と目に頼っている状況です。そんなわけで、僕の次の仕事はテストを充実させることに決まりました。何時の日か来たる次の大規模アップグレードでの、いや小規模な変更の安心感のためにも、テストの勉強を頑張りたいです。