Upgrade to Pro — share decks privately, control downloads, hide ads and more …

メインAPIのRailsバージョンを4.2から6.0に上げた話

Keisuke
July 05, 2021
340

 メインAPIのRailsバージョンを4.2から6.0に上げた話

Keisuke

July 05, 2021
Tweet

Transcript

  1. 2 自己紹介 鈴木 景介 (すずき けいすけ) 経歴: 公務員 → フリーター → 2019年1月ス

    ペースマーケットにバックエンドエンジニ アとしてジョイン (最近はインフラも少し) 趣味: 読書、筋トレ、サウナ
  2. 11 メインAPIのRailsバージョンを4.2 → 6.0に上げました Rails バージョン一覧
 
     4.0 → 4.1

    → 4.2 
     ↓
     5.0 → 5.1 → 5.2
     ↓ 
     6.0 → 6.1

  3. 12 • Rails 6 に上げるために必要な Syntax的変更(一部) ◦ modelのuniqueness に case_sensitive

    追加 ◦ ActiveRecord::AttributeMethod::Dirtyのメソッド名変更への対応 ▪ attribute_changed? → saved_change_to_attribute? ▪ attribute_was → attribute_before_last_save • マルチDB接続方法を変更 ◦ octopus -> Rails 6 標準のマルチDB接続へ • 技術的負債の返済 ◦ SQLiteに残っていたデータを MySQLに移行 ◦ 古いgemのバージョンアップ メインAPIのRailsバージョンを4.2 →6.0に上げました 主な対応内容
  4. 15 セキュリティリスクへの対応 • Rails のメンテナンスポリシーは、新機能 (New feature)、バグ修正 (bug fixes)、セキュリティ問題 (security

    issues)、重大なセキュリティ問題 (severe security issue) の4つに分割されている • 上記の4つのうち、Rails4.2は「セキュリティ問題」と「重大なセキュリティ問 題」のサポートが切れていた ◦ Rails自体にセキュリティ問題が発覚しても自力で修正する必要があると いう状態だった😨
  5. 21 基本方針 • Railsのバージョンは4.2 → 6.0まで上げる ◦ 本来なら4.2 → 5.0、5.0

    → 5.2、5.2 → 6.0と段階的に上げるのがよ かったのかもしれないが、以下の理由から一気に上げることとした ▪ 他APIですでに4系から6系に上げた実績があったため • Rails 4 → 5 は大変であるが、5 → 6は楽にあげることができ た ▪ 同じ工程(修正→テスト→リリース)を3度行うより工数が少なく済み そうなため • 事前に影響範囲を減らすために断捨離しておく
  6. 35 大変だったこと • DatabaseSelectorを利用した ◦ HTTPリクエストがGET/HEADの場合はreadingロールを使う ◦ GET/HEAD以外の場合はwritingロールを使う • controllerのshowメソッド(GET)内にwrite処理が含まれている場合に

    ReadOnlyエラーが発生して しまう ◦ 該当箇所を全てActiveRecord::Base.connected_to(role: :writing) do ~ end ブロックで囲む 必要があった マルチDB接続におけるread処理とwrite処理の適切な振り分け
  7. 36 まとめ • メインAPIのRailsのバージョンを4.2から6.0に上げた ◦ セキュリティリスクの低減 ◦ 開発効率の向上 ◦ Railsのメジャーバージョンを2つ上げるのは大変だった

    • 事前の断捨離のおかげで影響範囲を縮小でき、結果的に技術的負債を返済 しつつ、トータルの工数を減らすことができた • バージョンアップは計画的に…😇