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

あなたとRails

Avatar for Yasuo Honda Yasuo Honda
October 21, 2022

 あなたとRails

Kaigi on Rails 2022 Oct 21, 2022

Avatar for Yasuo Honda

Yasuo Honda

October 21, 2022
Tweet

More Decks by Yasuo Honda

Other Decks in Programming

Transcript

  1. • Yasuo Honda @yahonda ◦ Active Record Oracle enhanced adapter

    maintainer ◦ Rails committer ◦ https://github.com/yahonda ◦ https://twitter.com/yahonda self
  2. • Railsのメンテナンスポリシーを理解する • アプリケーションのRailsバージョンを上げる ◦ 最新に上げる ◦ 最新stable branch(7-0-stable)にする ◦

    main branchで試す • Railsにpull requestを送る ◦ bug fixをする ◦ new featureを追加する • あたらしい取り組み 話すこと
  3. • The Rails communityが、どのようなメンテナンスをどのバージョンに対 して行うかを宣言したもの ◦ New Features: main branch

    (7.1.0.alpha) ◦ Bug Fixes: 7.0.Z ◦ Security Issues: 6.1.Z ◦ Severe Security Issues: 7.0.Z, 6.1.Z, 6.0.Z • サポートマトリクスではありません ◦ 静的な状態を示すものではありません Railsのメンテナンスポリシー
  4. 私の回答: Ruby 3.1リリース時点で、Rails 6.1.z は”Security issues”対応段階であるため、 Rails 6.1に”Bug fixes”は行いません(行う宣 言はしていません)

    Note: 動くかどうかではなく、動く状態を保つために行うメンテナンスという行動に主眼 が置かれています
  5. • Rails 6.1.5でRuby 3.1のdefaul gemであるpsych 4対応が入りました • 興味のある方は、”Ruby 3.1 on

    Rails”を参照ください ◦ https://gist.github.com/yahonda/2776d8d7b6ea7045359f38c 10449937b Rails 6.1とRuby 3.1の補足
  6. “Please note that the 6.0.x and 6.1.x release series are

    no longer supported for bug fixes. These releases are a best effort, so please upgrade as soon as possible.” Rails 7.0.4, 6.1.7, and 6.0.6 have been released!
  7. • Rails 6.0.zと6.1.zは”Severe Seciruty Issues”、”Security issues”対 応の段階です • 今回のRais 6.0.6と6.1.7は”Bug

    Fixes”範囲のメンテナンスです • “best effort”は、メンテナンスポリシーの範囲を超えるものです ◦ ベストエフォートより、例外対応に近い ◦ “best effort”に依存したり、期待したりしないでください • “Bug fixes”が行われるRails 7.0.4へのアップグレードを推奨します リリースアナウンスメントの解釈
  8. • メンテナンスポリシーはissueにも関連します ◦ https://github.com/rails/rails/issues • 今、Rails 6.1.z以下で期待しない動作が報告された場合 ◦ mainまたは7-0-stableブランチで、期待しない動作が発生するか の切り分けが期待されます

    ◦ Rails 6.1.zにアップグレードして、期待しない動作への変化が起きて も、それがsecurity issueでない限り、対応は6-1-stableには入り ません メンテナンスポリシーとissueの関連
  9. “If you can still reproduce this error on the 7-0-stable

    branch or on main, please reply with all of the information you have about it in order to keep the issue open.” rails-bot https://github.com/rails/rails/commit/3ccee2c6467220fac92b99dc21cbce 24df880566
  10. • メンテナンスポリシーはpull requestにも関連します • New features : `main`ブランチのみに入ります ◦ そのうち7.1.0としてリリースされます(厳密には正しくない表現)

    • Bug fixes:`7-0-stable`ブランチにバックポートされます ◦ いずれ7.0.5としてリリースされる予定 ◦ 通常、バックポートはcommit権限を持ったメンバーが行います ◦ まずmainにpull requestを送り、バックポート依頼してください ◦ 最初から7-0-stableブランチをターゲットにしたpull requestは送らな いでください メンテナンスポリシーとpull requestの関連
  11. • New contributorsへの最初の一手として利用されるラベル • Ruby on Railsではあまり活用されていません ◦ 比較的成熟したフレームワークであること ▪

    発生する問題が難しくなってきたこと ◦ low hanging fruitも少なくなりつつあること ▪ CIで、typoやwarningはCIがfailするようになりました ▪ Activeなcontributorによってすぐ修正されます “good first issue”
  12. • いずれリリースされるであろうRails 7.0.5に最も近い状態のブランチ • Bug fixesのみが含まれ、new featuresや意図したbreaking changesは 含みません •

    定期的にユニットテストやMigrationを実行してみましょう • Gemfile.lockも毎回更新する必要があります ◦ 7-0-stableブランチにはbackport commitsが入ります • Gemfile.lockのrevisionをログに残すことをおすすめします 7-0-stableとは
  13. Rails 7.0.4から7–0-stableへのdiff % git diff Gemfile -gem "rails", "~> 7.0.4"

    +gem "rails", github: "rails/rails", branch: "7-0-stable" % git diff Gemfile.lock +++ b/Gemfile.lock @@ -1,5 +1,7 @@ -GEM - remote: https://rubygems.org/ +GIT + remote: https://github.com/rails/rails.git + revision: 5bebef36ade9103b1e4ebcfdafcf0c7361f75c45 + branch: 7-0-stable
  14. • `git bisect`で、the first “bad” commitを特定します • そのcommitの元となったpull requestを特定します •

    可能であれば、Bug report templatesを使って再現コードを書き、新規 issueをオープンします • https://github.com/rails/rails/tree/7-0-stable/guides/bug_rep ort_templates • 少なくとも、Commitの元となったpull requestにコメントします • 何も問題が起きないのが一番です 7-0-stableを利用して問題が発生したら
  15. • Rails 6.1.5で報告されたregression • https://github.com/rails/rails/issues/43168 • 発生条件 ◦ SQLite adapter

    ◦ `ActiveRecord::Migration[6.0]` ◦ `reference`または`belongs_to`の`integer`が`bigint`として作 成される Patchバージョン間でのregression例
  16. • きっかけとなったbackport (Rails 6.1.4とRails 6.1.5の間) ◦ https://github.com/rails/rails/commit/df475877efdcf74d7 524f734ab8ad1d4704fd187 • これらのpull

    requestsで修正されました ◦ https://github.com/rails/rails/pull/43295 ◦ https://github.com/rails/rails/pull/42350 • regressionがないのが理想ですが、再現ケースつきのissueやpull requestによってcontribution可能という考え方もあります Patchバージョン間でのregression例
  17. • いずれリリースされるであろうRails 7.1.0に最も近い状態のブランチ • new features, deprecation warnings, breaking changesを含む

    • 以下の2点においてstableブランチに比べて不安定 ◦ CIがredになることもある(意図しない不安定さ) ▪ https://buildkite.com/rails/rails/builds?branch=main ◦ Breaking changeやrevertがある(意図した不安定さ) mainブランチとは
  18. Rails 7.0.4からmainへのdiff % git diff Gemfile -gem "rails", "~> 7.0.4"

    +gem "rails", github: "rails/rails", branch: "main" % git diff Gemfile.lock +++ b/Gemfile.lock @@ -1,5 +1,7 @@ -GEM - remote: https://rubygems.org/ +GIT + remote: https://github.com/rails/rails.git + revision: caf94136045f79b1d9103ebf17fc74b7ff7f8727 + branch: main
  19. • 3rd party gems対応 ◦ `bundle install`が通るまでが一つのハードル ◦ Railsのバージョンに上限を設けているgemもあります ◦

    Private APIやbreking changeに依存する場合は変更が必要 • Note: mainの利用を、みなさんに推奨するものではありません ◦ おそらくチームとしての体制が必要になります ◦ そのぶん、多くのcontributionやフィードバック機会が生まれたり、 mainブランチの新機能をいち早く利用できたりします main branchを試す
  20. • Rails 7.1.0リリース前に7.1.0.betaや7.1.0.rcが出るはずなので、ぜひ試し てください ◦ RC: Release Candidate • 通例通りなら、7-1-stableブランチが切られてrc1がでるはずです

    ◦ RCはbreaking change/unexpected behaviorをdeprecation warningなしでrevertできる最後の機会です ◦ “That ship has sailed.” RCや Betaを試す
  21. • 書かれているAPI : Public API ◦ メジャーバージョン、またはマイナーバージョン間でbreaking changeがある場合は、deprecation cycleが入ります ◦

    パッチバージョンで意図的なbreaking changeは入りません • 書かれていないAPI : Private API • Rubyのpublic, private, protectedとの関連 ◦ public methodでも :nodoc: があるとPrivate API ◦ private, protectedは全てPrivate API api.rubyonrails.org
  22. • https://github.com/rails/rails/pull/45156 ◦ whereの第一引数に空文字が入った時、`WHERE`のみが追加され た無効なSQLとなる • Rails committerになった直後にレビューしたpull request ◦

    最終的にマージせずにcloseしたこともあり印象深い ◦ #45156は、pull requestの説明、振る舞いの変化のきっかけとなっ た pull requestの調査など適切な説明内容でした Untested bahaviorsの例
  23. #45256で報告されたwhereの振る舞いの変化 - Rails 6.0.zまで -> whereの第一引数に空文字が入った時、 `WHERE`句のない全件検索と なる ``` puts

    User.where("", {}).to_sql # => SELECT "users".* FROM "users" ``` - Rails 6.1.0以降 -> whereの第一引数に空文字が入った時、 `WHERE`のみが追加された無 効なSQLとなる ``` puts User.where("", {}).to_sql # => SELECT "users".* FROM "users" WHERE ``` - 対応方法は User.all
  24. • この振る舞いの変更のきっかけ ◦ https://github.com/rails/rails/pull/39784 ◦ 2020年10月にmainにマージされ、Rails 6.1.0としてリリース ◦ Rails 6.0.zから6.1.0の間で発生したregressionとも言えます

    • #45156 オープン時点でのBug fixes対象はRails 7.0.z ◦ Rails 6.1.zがBug fix対象期間、同様の事象の報告はなし ◦ Rails 6.1.0からRails 7.0.3まで、この振る舞いとなっていました • #45256をマージすると、#39784に依存した未知のuntested behavior のregressionを起こす可能性がありました #45256の背景とcloseを選択した理由
  25. • Pull requestが自動的にクローズされなくなりました ◦ https://github.com/rails/rails/pulls ◦ Issueは一定期間変更がないと自動クローズされます • Contributors情報交換のためにRails Discord

    Serverができました ◦ #contributors チャンネル • https://discuss.rubyonrails.org も引き続き存在します あたらしい取り組みの例
  26. • Railsのpull requestに関して質問がある方は: • Rails / OSS パッチ会 ◦ 毎月1回

    午後5時から午後7時まで、次回は10月25日 • Asakusa.rb ◦ 毎週火曜日 午後7時30分から • 西日暮里.rb ◦ 毎月最終月曜日 午後8時から、次回は10月31日 Questions?