Slide 1

Slide 1 text

銀座Rails#29 Jan 29, 2021 Yasuo Honda @yahonda Ruby 3.0とRails 6.1の "サポート"マトリクス

Slide 2

Slide 2 text

● Railsのメンテナンスポリシー ● Rubyのメンテナンスポリシー ● Railsが必要とするRubyバージョン ● RailsのRuby 3対応例 ● Railsメンテナンスポリシーの実例 話すこと

Slide 3

Slide 3 text

● Maintenance Policy for Ruby on Rails ● New Features / 新機能 ○ mainブランチで追加される(現在は6.2.0.alpha) ● Bug Fixes / 不具合修正 ○ 6.1.Z ● Security Issues / セキュリティ問題の修正 ○ 6.1.Z, 6.0.Z, 5.2.Z ● Severe Security issues / 重大なセキュリティ ○ 6.1.Z, 6.0.Z, 5.2.Z Railsのメンテナンスポリシー

Slide 4

Slide 4 text

● リリースの日付は決まっていない ● メンテナンスレベルの変更は、新しいメジャー、またはマイナーバージョン のリリースによって行われる ● いつメンテナンスレベルが変わるかも事前にはわからない Railsのメンテナンスポリシー(続)

Slide 5

Slide 5 text

● Ruby Maintenance Branches ● Ruby 3.0, Ruby 2.7, Ruby 2.6 ○ normal maintenance ● Ruby 2.5 ○ security maintenance ○ EOL date: 2021-03-31 ● メジャー、マイナーバージョンのリリース日が決まっている ● EOLの日付も事前に決まっている Rubyのメンテナンスポリシー

Slide 6

Slide 6 text

● RubyとRailsそれぞれ独立したメンテナンスポリシーをもっている ● メンテナンスポリシーで主に定められていること ○ どのバージョンをメンテナンスするのか ○ どの期間メンテナンスするのか ○ どの範囲でメンテナンスするか(不具合修正/セキュリティ修正) ● Ruby on Railsとして利用するということは ○ RubyとRails両方のメンテナンスポリシーを考慮する必要がある RubyとRailsのメンテナンスポリシー

Slide 7

Slide 7 text

● Rails 6.Y.Z ○ Ruby 2.5.0以上(required_ruby_version) ○ Require Ruby 2.5 for Rails 6. #34754 ○ 上限は定められていない ● required_ruby_versionが変更されるのは ○ すくなくともRails5以降は、Railsのメジャーバージョンアップ時のみ (X. Y. Zのうち、Xが上がるときのみ) Railsが必要とするRubyバージョン

Slide 8

Slide 8 text

● Railsが必要とするRubyバージョンで動作するためにしていること ● リリースされたRuby (2.5, 2.6, 2.7, 3.0) ○ https://hub.docker.com/_/ruby でリリースされたら、自動的にCI に追加される ○ パッチバージョンは指定されていないので、結果的に最新パッチバー ジョンが利用される Railsが必要とするRubyバージョン(続)

Slide 9

Slide 9 text

● 開発中のRuby (現在は3.1.0dev) ○ https://hub.docker.com/r/rubylang/ruby の rubylang/ruby:master-nightly-bionicでテストされる ○ FailしてもCI自体はgreen ○ 開発中Rubyによる非互換性はこの段階で発見され、RailsかRubyで 修正される ■ 「再現ケース」の必要性とその難しさ 参照 ○ Rubyの非互換をもたらす変更が「いつ」入るかによって、どのRails から新しいRubyで動作するようになるかが変わる Railsが必要とするRubyバージョン(続)

Slide 10

Slide 10 text

RailsのRuby 3対応例

Slide 11

Slide 11 text

● Ruby 3で、block内でblockを指定せずDir.chdirするとエラーになるよう に計画されていたが、2.7とほぼ同様に警告になるように戻った ○ RailsにからRubyへのフィードバックの結果 ● dir.c: chdir conflict should raise only when called in different thread #3990 ○ Rubyに修正が入ったのが2020年12月24日 ● この修正がないとRails 6.1で`rails app:update`が動かなかった ○ railsコマンドの`inline: true`が必要としていた ○ Avoid shelling out for generator `generate` action #37516 Bug #15661: Disallow concurrent Dir.chdir with block - Ruby master

Slide 12

Slide 12 text

● Fully separate positional arguments and keyword arguments #2794 ○ 2020年1月3日にRuby 3.0.0-devにマージされる ○ Ruby 2.7のwarning段階で多くは修正されていた ● Railsの対応は ○ 当時はmasterブランチでRails 6.1.0.alphaが開発中 ○ New FeaturesかBug Fixといえる、Security Issuesではない ○ masterブランチ修正後、6-0-stableにバックポートされ、Rails 6.0.3としてリリース Feature #14183: "Real" keyword argument - Ruby master

Slide 13

Slide 13 text

● キーワード引数分離対応への私見 ○ New Features(master as 6.1.0.alpha)とはいえる ○ Bug Fix? ■ Rails 6.0.Z(6−0−stable)にバックポートされると思っていなかっ た ○ Security Issuesとはいえない ■ Rails 5.2対応をしていない ■ Ruby 2.7 と Rails 6.0 / Rails 5.2 への展望と懸念 参照 Feature #14183: "Real" keyword argument - Ruby master

Slide 14

Slide 14 text

● Make Module#prepend affect the iclasses of the module #3181 ○ 2020年7月19日にRuby 3.0.0-devにマージされる ● Railsの対応 ○ 2020年7月22日にRailsのmasterブランチに修正され、 6-0-stableブランチにbackportされる ○ 2020年5月6日にRuby 2.7のキーワード引数対応警告に対応した Rails 6.0.3をリリースした後 ● 12月25日にリリースされる Ruby 3.0 に備えよう! 参照 Use ActiveSupport::ToJsonWithActiveSupport Encoder#to_json for Ruby 2.8.0 #39697

Slide 15

Slide 15 text

Railsメンテナンスポリシーの実例

Slide 16

Slide 16 text

● Rafael (Rails core team memberのひとり)の回答 ● Rubyバージョンの上限が示されていない理由 ○ Railsからは、Railsに非互換性をもたらすRubyの変更がどのバー ジョンで入るかはわからない ○ 上限を設定したら、非互換性がないとわかった時点で、毎回その上 限を変更したRailsをリリースすることになってしまう ● Rails 5.2でRuby 3.0が対応されない理由 ○ Ruby 3.0.0がリリースされた時点でRails 5.2のメンテナンスレベル はsecurity issue,severe security issueのみ Rails 5.2 doesn't work with Ruby 3.0 · Issue #40938 · rails/rails

Slide 17

Slide 17 text

● Rails 6.Y.ZとRuby 2.5.0の組み合わせで`rails new`が`NameError: uninitialized constant URI::Generic` ● Ruby 2.5.1以上でこのエラーは回避されたとのこと ● required_ruby_versionは2.5.0のままの理由 by Rafael ○ プラットフォーム依存のようだ(真相は不明) ○ 2.5.0で問題なく動作している人に強制的にアップグレードをさせたく ない ● ユーザーとしては新しいパッチバージョンを使った方がいい Following the guides and create a new project with ruby 2.5.0 fails · Issue #38649 · rails/rails

Slide 18

Slide 18 text

Thank you