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

令和に完全勝利するための Railsアップデート戦略 / Reiwa Rails Update

seiga
January 23, 2020

令和に完全勝利するための Railsアップデート戦略 / Reiwa Rails Update

seiga

January 23, 2020
Tweet

Other Decks in Programming

Transcript

  1. 自己紹介 • 名前: seiga / 林 星河 • twitter_id: seiga_hayashi

    • 所属: Classi 株式会社 • 平成5年生まれ
  2. Railsのバージョン管理スキーム Rails X.Y.Z • パッチZ ◦ バグ修正。セキュリティに関わる場合だけ API変更や機能追加の可能性もある • マイナーY

    ◦ 新機能が追加される。 APIの変更が含まれる場合もある。 ◦ 重大な変更の場合マイナーリリースまたはメジャーリリースで非推奨通知が行われる • メジャーX ◦ 新機能が追加される。多くの場合 API変更も含まれる。 ◦ マイナーリリースより変更の重大性が高い
  3. Bundler could not find compatible versions for gem "xxx" 1.

    bundlerエラーから根本原因となっているgemを見つけ、 https://rubygems.org/で新旧両方のRailsをサポートするgem バージョンを見つける 2. このgemのみを更新するための新しいブランチをmasterから 作成 3. Railsは旧バージョンのまま、そのgemの新しいバージョンを指 定してbundle update xxx
  4. bundle update --conservative xxx • 対象gemの依存先gemのアップデートを抑制する • gemのアップデート差分を最小にしたい時や、依存解決がうま く噛み合わない時に活用できる •

    最終的にはbundle update --conservative rails activemodel activerecord actionpack activesupport actionview railtiesみ たいになる これつけて厳密にやるかやらないかはアプリ規模次第
  5. rails:updateでアプリケーションの設定を更新 • Rails4まで ◦ bundle exec rake rails:update • Rails5以降

    ◦ bin/rails app:update Conflict に対するOverwrite y/nは一旦全部yで受け入れていい その後gitやIDEの機能で適切に合体させるのが効率いい
  6. rspec出力を保存することでアプデのお供に bundle exec rspec spec -o specresult.txt >& deprecation.txt いい感じにspec

    resultsとdeprecationsが分けて出力されるので アプデ作業のお供として便利(タスク化,grep,グルーピング)
  7. new_framework_defaults_x_x.rbをうまく使う 5.0以降から使える。自動的に前バージョンの挙動を守るような設 定が記述されているので、Stepを刻むのに役立つ テスト通過したら、一つずつ新バージョンのデフォルト設定にする と効率良い # Enable origin-checking CSRF mitigation.

    Previous versions had false. Rails.application .config.action_controller .forgery_protection_origin_check = false # Rails4.2 # Rails.application.config.action_controller.forgery_protection_origin_check = true # Rails5.0 config/initializers/new_framework_defaults.rb
  8. deprecation warningsのtraceが見たい! gemがdeprecations吐いちゃってる場合などに特定できる • ActiveSupport::Deprecation.debug = true ◦ バックトレースが見れる •

    ActiveSupport::Deprecation.behavior = :raise ◦ 例外を投げる • 標準エラー出力をジャックする方法もある ◦ https://nekogata.hatenablog.com/entry/2020/01/17/144831 ◦ ActiveSupport::Deprecationを使っていないタイプも通用するようになる
  9. Step by Step戦略のまとめ 1. Railsに依存するgemのバージョンを上げる 2. Railsのマイナーバージョンあげる 3. テスト通るようにする 4.

    deprecation warningを解消する 5. ステージングで検証してリリース これを目的のバージョンまで繰り返す 4.1to4.2, 4.2to5.0, 5.0to5.1….
  10. Rspecのrequest paramsの非推奨を一括置換 DEPRECATION WARNING: Using positional arguments in integration tests

    has been deprecated, in favor of keyword arguments, and will be removed in Rails 5.1. Deprecated style: get "/profile", { id: 1 }, { "X-Extra-Header" => "123" } New keyword style: get "/profile", params: { id: 1 }, headers: { "X-Extra-Header" => "123" } bundle exec rails5-spec-converter すると一括置換してくれる が大量に出るので、gem rails5-spec-converterを使用 4.2to5.0で利用。Rspecを使っていると