読者です 読者をやめる 読者になる 読者になる

スパイスな人生

素敵な人生をおくるためのスパイスを届けていきたい、そんな想いで仕事をするspice lifeメンバーブログ

新卒エンジニアが入社早々tmixのRailsメジャーバージョンアップをした話

はじめまして。今年度、新卒で入社したエンジニアのうなすけ(id:yu_suke1994)です。RubyRailsも触り始めたばかりなのですが、なんと入社早々に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_filterbefore_actionに、matchgetに変換されました。

職人の手による温かみのある変換

しかし、これだけで済むほどアップグレード作業は楽ではありません。例えば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されました。 f:id:yu_suke1994:20150420180543p:plain この調子で、Rubyも2.2.2に、またRails4.1や4.2へのアップデートもやっていきたいと思います!

アップグレードを振り返って

そもそも周りの就職した同級生が新人研修を終えていない中で、いきなり実戦投入され、Railsのアップグレードという大仕事を終えることができたという僕は、非常に幸運です(新人研修をしてないわけではないです)。というのも、この作業によってRailsへの知識が格段に増えたことと、tmixに貢献できたことで、「俺が関わってるんだ!」という意識をとても速く得られることができたからです。 また他にも、アップグレード作業の最中に、継続的デリバリーを4章まで読みました。サイクルタイムを早めるための、自動化されたテスト。それが必要なのに、今は職人たちの手と目に頼っている状況です。そんなわけで、僕の次の仕事はテストを充実させることに決まりました。何時の日か来たる次の大規模アップグレードでの、いや小規模な変更の安心感のためにも、テストの勉強を頑張りたいです。