Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

33
Ruby 2.4 / Rails 5.0に上げた際のパッチ5選 Powered by Rabbit 2.1.9 Ruby 2.4 / Rails 5.0に上げ た際のパッチ5選 表参道.rb #19 Sansan株式会社 2017-02-02 (Thu) 伊藤 浩⼀ (@koic) (株)永和システムマネジメント

Transcript of Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Page 1: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選

表参道.rb�#19Sansan株式会社2017-02-02�(Thu)

伊藤�浩⼀�(@koic)(株)永和システムマネジメント

Page 2: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

わたし

Page 3: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

今⽇の話

アプリケーションコードは巨⼈の肩に乗った氷⼭の⼀角

"Gemfile.lock�に記されているコードはプロジェクトのコードとしてメンテナンス対象である"

Page 4: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

まとめ

アップグレードの道のりは1年前にははじまっている

Page 5: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

アップグレードへの症状例

分かりやすいのは、そもそも�

rails�server�が起動しない✓

自動テストをパスしない✓

アップグレードすれば噛み合わせの悪いライブラリは出てきたりする

Page 6: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

upstreamへの還元5選

bkeepers/dotenv#251✓

cowboyd/therubyracer#413✓

rsim/oracle-enhanced#1084

kubo/ruby-oci8#144✓

sferik/rails̲admin#2789✓

Page 7: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

2016年3⽉

https://github.com/bkeepers/dotenv/pull/251

Fix�a�failure�spec�in�ruby�

2.4.0dev✓

Page 8: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

diff

�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

����������

Page 9: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

期待する振る舞いが分からない

https://bugs.ruby-lang.org/issues/12121�で問い合わせ

Page 10: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

最⼩ケースの作成

��������������������������

�����������������������

�����������������

Page 11: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

結果

Ruby�2.3.0�...�p�

M2.constants�#�=>�[:B,�:A]✓

Ruby�2.4.0�...�p�

M2.constants�#�=>�[:A,�:B]✓

Page 12: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

回答から抜粋

これは、ドキュメントの問題だ と思い ま す 。Module#constantsの戻り順を保障したことはないし、これからも保障されないと思います。今回は⾼速化の⼀環として順序が変わりましたが、今後も同様のことは起き得ます。

Page 13: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

どういうことだったか?

値を割り当ててから実⾏という流れが、値を割り当てる前に実⾏になってエラー

Module#constants�の戻り値の順序が変わっていた

仕様�(⾼速化の⼀環で順序が変わったが、そもそも順序の保証はない)

Page 14: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

2016年5⽉

https://github.com/cowboyd/therubyracer/pull/413

Support�for�unified�Integer�class�in�Ruby�2.4+

Page 15: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

diff

����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

Page 16: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

どういうものだったか?

Ruby�2.4�では�Fixnum�=>�

Integer�となり、Integer�に対応する�module�がなくてエラー。

2017年1⽉にリリースされた。

Page 17: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

2016年12⽉

https://github.com/rsim/oracle-enhanced/pull/1084

Fix�ORA-00933�error�when�

executing�`rails�

db:schema:load`

Page 18: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

diff�(1)

���������������������������������������������������������������������������������������

Page 19: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

diff�(2)

�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

Page 20: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

どういうものだったか?`rails�db:migrate`�だと積み重ねただけのマイグレーションが実⾏されて遅い

db/schema.rb�を共有して、`rails�db:schema:load`�実⾏�

(テスト/CI環境)

Rails�5�で導⼊されたマルチインサート対応が必要で�`rails�

db:schema:load`�でエラー

Page 21: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

2016年12⽉

https://github.com/kubo/ruby-oci8/pull/144

Fix�invalid�value�for�BigDecimal�in�Ruby�2.4.0+

Page 22: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

diff

違いが分かりますか?

�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

������������������������������������������������������������

Page 23: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

どういうものだったか?

`rake�spec`�を実⾏してエラーになった?�(記憶がおぼろ)

Ruby�2.3�でパスしていた�1.E+00�という値が、Ruby�2.4�

だとパスしなかった

仕様が分からないので、ruby/decimal�に�ISSUE�を書いて回答をもらう

Page 24: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

2016年12⽉

https://github.com/sferik/rails̲admin/pull/2789

Fix�#encoding�error�by�

oracle̲enhanced✓

@ojiryメンバーによるパッチ✓

Page 25: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

diff

����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

Page 26: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

どういうものだったか?PostgreSQL�/�MySQL�/�SQLite�(?)�でない�RDBMS�は別途対応が必要だった

PR�を⾒てもらうサポートをする

リポジトリの所有者よりも最近マージボタンを押すような活動しているコミッターにメンションする

Page 27: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

まだ時間はありますね?

Page 28: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

Kaminari�1.0.0

https://github.com/sferik/rails̲admin/pull/2810

Loosen�the�dependency�

version�of�Kaminari�(1.0.0)✓

Page 29: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

diff

�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������

Page 30: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

どういうものだったか?

gemspec�での縛りを緩めて、CI�用に�Gemfile�での縛りを作るお仕事

Page 31: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

Conclusionkamipo名⾔�"困ってる⼈がいる問題が直るのではなく直す気のある⼈がいる問題が直る"

(汎用的なフレームワークは難しくても)�特化されたアプリケーション起点でのエラーなら分かりやすい

多⼈数が数年に渡って関わるようなアプリケーションでは特にアップグレード重要

Page 32: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

Values最新の安定版�Rails�に速く乗る✓

自信を持ってプロジェクト(への加⼊)を進められる

新しいバージョンを使うことで�EOL�に出会わずにすむ

"Ruby�はバージョンを上げるだけで速くなる"

No�hate✓

Page 33: Ruby 2.4 / Rails 5.0に上げた際のパッチ5選

Ruby�2.4�/�Rails�5.0に上げた際のパッチ5選 Powered�by�Rabbit�2.1.9

まとめ

アップグレードの道のりは1年前にははじまっている