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

継続的Railsアップグレード / Continuous Rails Upgrade

Takumi Shotoku
September 15, 2021

継続的Railsアップグレード / Continuous Rails Upgrade

【iCARE Dev Meetup #25】 集えRubyist~著名Rubyistから学ぶ~2.0
https://icare.connpass.com/event/221922/

Takumi Shotoku

September 15, 2021
Tweet

More Decks by Takumi Shotoku

Other Decks in Technology

Transcript

  1. 自己紹介 • 名前: 神速 • 会社: メドピア株式会社 • 所属: CTO室SRE

    • GitHub: @sinsoku (画像右上) • Twitter: @sinsoku_listy (画像右下) 2
  2. 復習: Railsのアップグレードの手順1 1. (前準備) Rails以外のgemを最新にする 2. 新しいバージョンについて調べる 3. Railsのバージョンを上げる 4.

    CIでテストを流してみる 5. 失敗したテストを直す 1 2019-08 Rails6にいつ上げるか? Roppongi.rb - https://www.slideshare.net/sinsoku/rails6-159723148 3
  3. gemfiles/rails61.gemfile eval_gemfile File.expand_path('../Gemfile', __dir__) { 'rails' => { github: 'rails/rails',

    tag: 'v6.1.4.1' }, 'enumerize' => { github: 'brainspec/enumerize', tag: 'v2.4.0' }, 'switch_point' => nil }.each do |name, opts| dependencies.delete_if { |d| d.name == name } gem(name, **opts) if opts end 13
  4. CircleCIの設定の例4 jobs: rspec-rails61: executor: rails environment: BUNDLE_GEMFILE: gemfiles/rails_61.gemfile BUNDLE_PATH_RELATIVE_TO_CWD: true

    steps: - checkout - run: cp Gemfile.lock gemfiles/rails_61.gemfile.lock # ͋ͱ͸ bundle-install ͯ͠ɺςετΛ࣮ߦ͢Ε͹ྑ͍ 4 BUNDLE_PATH_RELATIVE_TO_CWDは#{Rails.root}/vendor/bundleのキャッシュを活用するため 16
  5. ! 失敗するCIが実行されるのを減らしたい • 深夜ビルドにする5 • 一時的にテストをスキップする comment = 'v6.1ରԠ͢Δ·ͰҰ୴εΩοϓ' if

    Rails::VERSION::STRING.start_with?('6.1') RSPec.describe Foo, type: :model, skip: comment do # ςετίʔυ end 5 CIでRailsのmasterブランチを使ってテストを実行する 参考: https://sinsoku.hatenablog.com/entry/2020/10/31/100000 17
  6. 19

  7. v6.0で警告の出るコード例 SourceAnnotationExtractor::Annotation .register_extensions("scss", "sass", "less", "js") { |tag| /\/\/\s*(#{tag}):?\s*(.*)$/ }

    #=> DEPRECATION WARNING: SourceAnnotationExtractor is deprecated! \ # Use Rails::SourceAnnotationExtractor instead. v5.2では Rails::SourceAnnotationExtractor は存在しません。 23
  8. バックポート # lib/rails60_backporting.rb if Rails::VERSION::MAJOR != 5 warn('Remove this patch

    after Rails v6.0') return end # refs: https://github.com/rails/rails/pull/32065 Rails::SourceAnnotationExtractor = ::SourceAnnotationExtractor 25
  9. バックポート # lib/rails60_backporting.rb if Rails::VERSION::MAJOR != 5 warn('Remove this patch

    after Rails v6.0') return end # refs: https://github.com/rails/rails/pull/32065 Rails::SourceAnnotationExtractor = ::SourceAnnotationExtractor # refs: https://github.com/rails/rails/pull/34051 Module.alias_method(:module_parent_name, :parent_name) require 'rails60_backporting/inspection_filter' require 'rails60_backporting/active_record_methods' require 'rails60_backporting/content_disposition' 26
  10. バックポート # lib/rails60_backporting/active_record_methods module Rails60Backporting module ActiveRecordMethods extend ActiveSupport::Concern class_methods

    do # refs: https://github.com/rails/rails/pull/31941 def pick(*column_names) limit(1).pluck(*column_names).first end # refs: https://github.com/rails/rails/pull/31989 def create_or_find_by(attributes, &block); end # ུ def create_or_find_by!(attributes, &block); end # ུ end end end ActiveSupport.on_load(:active_record) do ActiveRecord::Base.include(Rails60Backporting::ActiveRecordMethods) end 27
  11. AM::Error の変更に伴う修正 これはRailsバージョンの分岐で対応できます。 def foo # CSVͷॲཧ rescue CSV::MalformedCSVError =>

    e - errors.add(:file, " foramt is invalid. #{e.message}") + obj = errors.add(:file, " foramt is invalid. #{e.message}") + Rails::VERSION::STRING.start_with?('6.1') ? errors.messages_for(:file) : obj end 30
  12. おまけ: 7.0.0.rc1 を試そう • RC が出たらCIで動かしてみよう • gemfiles/rails_70.gemfile を作ろう •

    OSSのコントリビュートチャンス • gemの7.0.0対応、Railsへのバグ報告7 7 Rails の issue を解決するまでの手順とOSS初心者でもできること https://sinsoku.hatenablog.com/entry/2019/10/17/013415 32