SlideShare a Scribd company logo
1 of 54
Download to read offline
食べログ流
Rails Upgrade Practices
@kamina_zzz
湊谷 海斗
湊谷 海斗
@kamina_zzz
2
食べログ
DevOps チーム 兼 データサイエンスチーム
● 各種バージョンアップ
● ライブラリ( gem など)の作成
● 機械学習のモデル構築
● 日本酒 🍶
● バンド 🎸
Minatoya Kaito
1. 食べログと Rails の歩み
2. バージョンアップ戦略
3. 得られた知見
3
食べログと Rails
4
5
RAILS_GEM_VERSION = '1.2.2'
Tabelog meets Rails
v1.2.2
6
README.md
lib
Application specific libraries. Basically,
any kind of custom code that doesn't
belong under controllers, models, or helpers.
This directory is in the load path.
https://rubygems.org/gems/rails/versions/1.2.2
食べログと Rails の歩み
7
サービスの成長
2007 2018201620132010
v2.0 v3.0 v4.0 v5.0 v6.0 ?Release
Rails も成長
Rails way との乖離 その1
8
サービスの成長
2007 2018201620132010
v2.0 v3.0 v4.0 v5.0 v6.0 ?Release
# 急成長するサービス & 急成長するフレームワーク
サービス成長 vs バージョンアップ
Rails way との乖離 その1
9
サービスの成長
2007 2018201620132010
v2.0 v3.0 v4.0 v5.0 v6.0 ?Release
サービス成長 vs バージョンアップ
⇓
将来への負債ということは理解した上で
戦略的に Rails へモンキーパッチ
# 急成長するサービス & 急成長するフレームワーク
Rails way との乖離 その2
10
サービスの成長
2007 2018201620132010
v2.0 v3.0 v4.0 v5.0 v6.0 ?Release
# 若いサービス & 若いフレームワーク
サービスの成長を加速したい
Rails way との乖離 その2
11
サービスの成長
2007 2018201620132010
v2.0 v3.0 v4.0 v5.0 v6.0 ?Release
# 若いサービス & 若いフレームワーク
サービスの成長を加速したい
⇓
自分たちが使いやすいように機能拡張
第二の ActiveSupport みたいな
Tabelog way
12
Rails Way ではなく Tabelog Way な Rails ができていく
⇓
Rails ちょっとわかる人が入ってくる
⇓
「Rails ちょっとできるのに Tabelog できない…」
⇓
Rails できるひとに活躍してもらえないのはまずい
そして Rails way へ…
13
本題
14
Rails バージョンアップ PJ
15
16
認証
社内管理
販売管理
メディア
アプリAPI
外部連携
店舗オーナー
Rails services
バッチジョブ
PJ の進み方
17
調査
キックオフ
アップグレード対応
リグレッションテスト
新バージョンへリプレース
調査
18
調査
キックオフ
アップグレード対応
リグレッションテスト
新バージョンへリプレース
- EOL スケジュールの確認
- 次バージョンの決定
- 想定される障壁
- “過去の宿題” の選定
- スケジュールの見積もり
キックオフ
19
調査
キックオフ
アップグレード対応
リグレッションテスト
新バージョンへリプレース
- PJ チームで決めたことを共有
- 次のバージョン
- スケジュール
- バージョン間の差異
アップグレード対応
20
調査
キックオフ
アップグレード対応
リグレッションテスト
新バージョンへリプレース
- 新バージョンの Gemfile
- テスト環境の整備
- ざっくりテスト&対応
- rspec のコケたところ対応
バージョン間差分に対する戦略
21
前提: Rails way にしていく
簡単にレールに乗せられないパターン
22
- grep できない
- 具体例は後述
- ヘビーユースしてる機能が次バージョンで廃止になる
- シンプルに対応コストがデカい
- 独自に実装していた機能が Rails に追加された
- が、思ってたんと違う
リグレッションテスト
23
調査
キックオフ
アップグレード対応
リグレッションテスト
新バージョンへリプレース
- サービス開発チーム総出
- ホワイトボックス
- 食べログのコードに対して
新バージョンへリプレース
24
調査
キックオフ
アップグレード対応
リグレッションテスト
新バージョンへリプレース
- 影響度低い順
- ある種のカナリー
キツかった話 1
25
escape_javascript
26
escape_javascript
def escape_javascript(javascript)
if javascript
result =
javascript.gsub(/(|</|rn|342200250|3422002
51|[nr"'])/u) { |match| JS_ESCAPE_MAP[match] }
javascript.html_safe? ? result.html_safe : result
else
""
end
end
27
JS のセグメントの
“nr” とかを
エスケープしてくれるやつ
patch
for
`escape_javascript`
def escape_javascript(javascript)
super(javascript.to_s)
end
28
String じゃなかったら
to_s する
⇓
Rails way にしよう
alias_method :j, :escape_javascript
29
grep できない!
30
Numeric
31
NumericExt
module NumericExt
def to_a
[self]
end
end
Numeric.__send__(:prepend, NumericExt)
32
Numeric の独自拡張
1.to_a
100_000.to_a
99.99.to_a
33
grep できない!
34
対応した
35
該当箇所を処理したらログに出すようにパッチを当てる
- 同じ箇所で何回もログに出さない
- ログ行数の上限
キツかった話 2
36
Dalli
37
昔話
38
session_store に memcached を使用
Rails デフォルトが Rack::Session::Memcache
昔話
39
Dalli がイケてるらしい
昔話
40
Dalli 導入
昔話
41
# 不満
- Marshal
- key
不満
42
- Rails のバージョンが変わる
- Marshal.dump ↔ Marshal.load に失敗
- Symbol でも String でも取得したい
Dalli へパッチ
# Dalli::Client#get
json = ActiveSupport::JSON.decode(raw)
json.keys.each do |key|
json[key] = json[key].with_indifferent_access
end
json
43
memcached から取得して
JSON デコードして
#with_indifferent_access
#with_indifferent_access
44
with_indifferent_access # activesupport/lib/active_support/hash_with_indifferent_access.rb
if value.is_a? Hash
if options[:for] == :to_hash
value.to_hash
else
value.nested_under_indifferent_access
end
elsif value.is_a?(Array)
if options[:for] != :assignment || value.frozen?
value = value.dup
end
value.map! { |e| convert_value(e, options) }
else
value
end
45
Hash, Array ぽかったら
ネストした中身まで
HWIA 化していく
session[:test] = {very: {'nested' => {symkey: 'hoge'}}}
session[:test].class
#=> ActiveSupport::HashWithIndifferentAccess
session[:test]['very'][:nested]['symkey']
#=> hoge
46
対応まだできてない
47
session の中身がどのように使われているかわからない
session で grep すると膨大なヒット
学び
48
気軽にパッチを当てるとすごいことが起きる
Ruby, Rails への理解はとても大切
ラクした話
49
警告を抑えたい
50
Deprecation Warning があまりに多い
→ 今は対応しないので一旦抑制したい
WarningSuppressor
51
def warn(message = nil, callstack = nil)
return if silenced
callstack ||= caller_locations(2)
deprecation_message(callstack, message).tap do |m|
behavior.each { |b| b.call(m, callstack) } unless WarningSuppressor.suppress?(m)
end
end
まとめ
52
まとめ
53
- Rails way ではない実装になっていないか?
- やりたいことに対して過剰な実装ではないか?
- Rails に限らずバージョンアップはずっと発生するイベント
- ラクしよう
- フレームワークのコードリーディングは非常に有用
We're hiring!
54
@kamina_zzz
reply or DM =>

More Related Content

Similar to 食べログ流 - Rails Upgrade Practices

日本で DevOps を ロケットスタートする方法
日本で DevOps を  ロケットスタートする方法日本で DevOps を  ロケットスタートする方法
日本で DevOps を ロケットスタートする方法Puppet
 
Ruby on Rails3 Tutorial Chapter1
Ruby on Rails3 Tutorial Chapter1Ruby on Rails3 Tutorial Chapter1
Ruby on Rails3 Tutorial Chapter1Sea Mountain
 
Rails composerでrails newを楽にしよう
Rails composerでrails newを楽にしようRails composerでrails newを楽にしよう
Rails composerでrails newを楽にしよう健太 田上
 
サーバーレスの今とこれから
サーバーレスの今とこれからサーバーレスの今とこれから
サーバーレスの今とこれから真吾 吉田
 
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選Koichi ITO
 
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -Yukihiko SAWANOBORI
 
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏Developers Summit
 
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~Rakuten Group, Inc.
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionGoh Matsumoto
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードKazuhiro Hara
 
Qlik Senseで無制限精度の数値演算 - Windows版Qlikエンジンのサーバーサイド拡張を実現する
Qlik Senseで無制限精度の数値演算 - Windows版Qlikエンジンのサーバーサイド拡張を実現するQlik Senseで無制限精度の数値演算 - Windows版Qlikエンジンのサーバーサイド拡張を実現する
Qlik Senseで無制限精度の数値演算 - Windows版Qlikエンジンのサーバーサイド拡張を実現するQlikPresalesJapan
 
ハイブリットクラウド環境におけるモダンアプリケーション開発
ハイブリットクラウド環境におけるモダンアプリケーション開発ハイブリットクラウド環境におけるモダンアプリケーション開発
ハイブリットクラウド環境におけるモダンアプリケーション開発政雄 金森
 
普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見zaru sakuraba
 
JavaScript And Keywords
JavaScript And KeywordsJavaScript And Keywords
JavaScript And Keywordsuupaa
 
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionRails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionSatomi Tsujita
 
LL2021 Java update
LL2021 Java updateLL2021 Java update
LL2021 Java updatetorutk
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞYoichi Toyota
 

Similar to 食べログ流 - Rails Upgrade Practices (20)

日本で DevOps を ロケットスタートする方法
日本で DevOps を  ロケットスタートする方法日本で DevOps を  ロケットスタートする方法
日本で DevOps を ロケットスタートする方法
 
Ruby on Rails3 Tutorial Chapter1
Ruby on Rails3 Tutorial Chapter1Ruby on Rails3 Tutorial Chapter1
Ruby on Rails3 Tutorial Chapter1
 
Rails composerでrails newを楽にしよう
Rails composerでrails newを楽にしようRails composerでrails newを楽にしよう
Rails composerでrails newを楽にしよう
 
サーバーレスの今とこれから
サーバーレスの今とこれからサーバーレスの今とこれから
サーバーレスの今とこれから
 
Amazon ECSとDevOps
Amazon ECSとDevOpsAmazon ECSとDevOps
Amazon ECSとDevOps
 
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選
 
Ruby In Wheezy
Ruby In WheezyRuby In Wheezy
Ruby In Wheezy
 
Rubykansai 81
Rubykansai 81Rubykansai 81
Rubykansai 81
 
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
 
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
 
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
三位一体の自動化で壊せ DevとOpsの壁~アラサーエンジニアの挑戦~
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
Qlik Senseで無制限精度の数値演算 - Windows版Qlikエンジンのサーバーサイド拡張を実現する
Qlik Senseで無制限精度の数値演算 - Windows版Qlikエンジンのサーバーサイド拡張を実現するQlik Senseで無制限精度の数値演算 - Windows版Qlikエンジンのサーバーサイド拡張を実現する
Qlik Senseで無制限精度の数値演算 - Windows版Qlikエンジンのサーバーサイド拡張を実現する
 
ハイブリットクラウド環境におけるモダンアプリケーション開発
ハイブリットクラウド環境におけるモダンアプリケーション開発ハイブリットクラウド環境におけるモダンアプリケーション開発
ハイブリットクラウド環境におけるモダンアプリケーション開発
 
普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見普通のRailsアプリをdockerで本番運用する知見
普通のRailsアプリをdockerで本番運用する知見
 
JavaScript And Keywords
JavaScript And KeywordsJavaScript And Keywords
JavaScript And Keywords
 
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionRails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2edition
 
LL2021 Java update
LL2021 Java updateLL2021 Java update
LL2021 Java update
 
Railsの開発環境作るぞ
Railsの開発環境作るぞRailsの開発環境作るぞ
Railsの開発環境作るぞ
 

Recently uploaded

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 

Recently uploaded (8)

デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 

食べログ流 - Rails Upgrade Practices