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

あなたとRails

 あなたとRails

Kaigi on Rails 2022 Oct 21, 2022

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?