Rubyのサポート・ライフサイクルとEOL

運用のための Ruby ヴァージョンについて。

[2021-03] 現時点では, Ruby 2.7.2 以降で, ビルド時に configure --disable-jit-support するのがよさそう。Ruby 2.6 / 2.5 を並行でインストールする必要はない (メンテナンスの手間と割りにあわない)。

実験・テストは Ruby 3.0, Ruby 3.1 を使う。rbenv で選択。

[2021-01] 2020.12.25 にメジャーバージョンアップとなる Ruby v3.0.0 が出ました。プロと読み解く Ruby 3.0 NEWS - クックパッド開発者ブログ

2019年7月現在のお勧めは, v2.5系列.

ヴァージョン番号, EOL

Ruby

(2017.8.6 更新)
Rubyのバージョン番号は、1.8.z の頃は z がメジャーバージョン番号, 2.y.z 以降は yがメジャーバージョンを表す。新しいバージョンが出るたび、順次、古い方はセキュリティfixを含むすべてのメンテナンスが終了していく (EOL; End of Life)。

メジャーヴァージョン 安定版リリース日 EOL入り 備考
1.8.7 2014-07-31
2.0 2016-02-24
2.1 2017-03-31. Support of Ruby 2.1 has ended
2.2 2014-12-25 2018-03-31 (予定) On 2018-06-20, v2.2 has ended.
2.3 2015-12-25 ※下コメント参照. 2019-03-31, v2.3 series has ended.
2.4 2016-12-25 2020-04-05
2.5 2017-12-25
2.6 2018-12-25 2022-04-12 v2.6.10
2.7 2019-12-25 v2.7.2 以降を使うこと。CentOS Stream 9ではビルド不能。 ※下に対策を記載.
3.0 2020-12-25
3.1 2021-12-25

[2018.3.28] v2.2.10, v2.3.7, v2.4.4, v2.5.1 released.

[2019-01] いまだに CentOS 7 は ruby-2.0.0.648-34.el7_6.x86_64.rpm で、v2.0.0 で頑張っている。さすがに無理なので、自分で入れる必要がある。

[2021-05] CentOS 8 は, ruby-2.5.5, ruby-2.6.3, ruby-2.7.1 の3つをパッケージ。Ruby 2.7.2 以降を自分で入れるか。

[2022-03] Fedora 36 で OpenSSL 1.1 → 3.0 にスイッチ。Ruby 2.7 がビルドできなくなった。CentOS Stream 9 も OpenSSL 3.0 のみパッケージされている。自分で OpenSSL をビルドするしかないが、厳しい。 Ruby のほうに小さなパッチを当てればビルド可能 (後述).

Ruby on Rails

メジャーヴァージョン 安定版リリース 必要Rubyヴァージョン EOL入り
4.2 December 20, 2014 >= 1.9.3 v4.2.11.3 が May 15, 2020 リリース。すでに EOL.
5.0 June 30, 2016 >= 2.2.2 v5.2.6 が May 05, 2021 リリース。
6.0 August 16, 2019 >= 2.5.0
7.0 December 15, 2021 >= 2.7.0 Ruby 3.1.0 は Rails 7.0.1 以降.

Webpacker は, Rails 5.1 でオプション導入され、Rails 6.0 でデフォルト化、Rails7 で単に廃止された。Rails 4.x アプリや Rails 5.x で Webpacker 未使用のアプリは、Rails 6.x を skip して Rails 7.0 に上げよう。しばしば聞く「メジャーバージョンを一つづつ上げたほうがいいですよ」トークに耳を貸すべきではない。

[2021-05] 次の Rails 7 で required_ruby_version が 2.7 に上がる予定。なので、まだ Ruby 2.7 でよい。無理せずいこう。

各ヴァージョン

Ruby 3.1

[2021-12]

2021.12.25 に Ruby v3.1.0 が出ました。Ruby 3.1では, Shopify 社が開発した新しいプロセス内JITコンパイラであるYJIT がマージされました。いよいよ JIT を有効にできるか。

環境変数 RUBY_YJIT_ENABLE を定義するか, RUBYOPT=--enable-yjit で有効にできる。Web上の解説では, 前者は =1 にするような記述があるが、実際には定義するだけで有効になる。

有効か確認するには、次のようにすればよい。無効のときは nil.

$ ruby -e "p RubyVM::YJIT.runtime_stats"
{:inline_code_size=>67711, :outlined_code_size=>52343}

Rails 7.0.0 と Ruby 3.1.0 の組み合わせは、まだ動かない。Rails::Engine is abstract, you cannot instantiate it directly. (RuntimeError) Rails cashes with Ruby 3.1.0 release #43998

[/2021-12] ここまで

Rails 7.0.1 で Ruby 3.1.0 と組み合わせることができる。

Ruby 2.7

[2022-03] Fedora 36, CentOS Stream 9 が openssl 3.0 にスイッチしたため、コンパイルエラーになる。

ビルドを通せるよう、小さなパッチを作った。コンパイルエラーだけ潰す。ruby-2.7.5_openssl-3.0.patch

Ruby 2.6

Just-In-Time (JIT) コンパイルが導入された。インパクト大きい。

[2020-04] v2.5 に留まるか, スキップして v2.7 にするか。もうしばらく v2.5 で様子を見る。

v2.6 はスキップで v2.7.2 以降に上げるのがよい。

Ruby 2.4関係

2016年12月25日に Ruby 2.4.0 がリリースされています。その変更点について: サンプルコードでわかる!Ruby 2.4の新機能と変更点 - Qiita

私 (堀川) のところでは、Fixnum / Bignumクラスの廃止によりネイティブ拡張が壊れる問題の影響が見えないので、当面は様子見 (見送り) にしています。

(2017.8.19) ruby 2.4に移行しました。下の「Ruby 2.3関係」をご覧ください。

Ruby 2.3関係

(2017.8.19)
Ruby 2.3.4 は、最新の Fedora 26 Linux 上でビルドできない。(opensslが通らない.)

Fedora 26 には openssl 1.1.0f と 1.0.2j が用意されている。CentOS 7 は 1.0.1e. openssl v1.1.0 で構造体が不透明 (opaque) になったことで、コンパイルエラーになっている。

Ruby の configure スクリプトで 1.0.x を強制するか、付属のopensslライブラリを修正する必要がある。後者の方がよく, Ruby 2.4 ではすでに対策されているが, Ruby 2.3 にバックポートされていない。修正すべき箇所が多く、地味に面倒くさい。

ということで, Ruby 2.3 は, そろそろ, メンテナンスされてないと言える。Ruby 2.4.x 一択になっている。だいぶ勘弁してほしい。

(2017.8.19 ここまで)

Ruby 2.0

Ruby 1.8.7 と Ruby 2.0 との間には, 外部から入力された文字列まわりや, いくつかの組込みクラス/メソッドが削除されたり、意味もなく名称変更されていたりと, 注意を要する非互換がいくつもあります。いくつかの部分は書き直しになります。

パッチ

(2017.2) Ruby 2.3.3 を既存のインストール先に上書きインストールしようとすると、エラーになる。どうやら, /usr/local/bin/rake が存在する (またはより新しいバージョン?) の場合に失敗するようだ。

installing extension headers: /usr/local/include/ruby-2.3.0/ruby
installing default gems:      /usr/local/lib/ruby/gems/2.3.0 (build_info, cache, doc, extensions, gems, specifications)
                              bigdecimal 1.2.8
                              io-console 0.4.5
                              json 1.8.3
                              psych 2.1.0
                              rdoc 4.2.1
installing bundle gems:       /usr/local/lib/ruby/gems/2.3.0 (build_info, cache, doc, extensions, gems, specifications)
                              power_assert 0.2.6
                              did_you_mean 1.0.0
                              rake 10.4.2
/home/hori/Downloads/ruby-2.3.3/lib/rubygems/installer.rb:233:in `check_executable_overwrite': no implicit conversion of nil into String (TypeError)
        from /home/hori/Downloads/ruby-2.3.3/lib/rubygems/installer.rb:474:in `block in generate_bin'
        from /home/hori/Downloads/ruby-2.3.3/lib/rubygems/installer.rb:461:in `each'
        from /home/hori/Downloads/ruby-2.3.3/lib/rubygems/installer.rb:461:in `generate_bin'
        from /home/hori/Downloads/ruby-2.3.3/lib/rubygems/installer.rb:301:in `install'
        from ../ruby-2.3.3/tool/rbinstall.rb:686:in `call'
        from ../ruby-2.3.3/tool/rbinstall.rb:686:in `block in '
        from ../ruby-2.3.3/tool/rbinstall.rb:754:in `block (2 levels) in 
' from /home/hori/Downloads/ruby-2.3.3/lib/rubygems/specification.rb:821:in `block in each_spec' from /home/hori/Downloads/ruby-2.3.3/lib/rubygems/specification.rb:743:in `block (2 levels) in each_gemspec' from /home/hori/Downloads/ruby-2.3.3/lib/rubygems/specification.rb:742:in `each' from /home/hori/Downloads/ruby-2.3.3/lib/rubygems/specification.rb:742:in `block in each_gemspec' from /home/hori/Downloads/ruby-2.3.3/lib/rubygems/specification.rb:741:in `each' from /home/hori/Downloads/ruby-2.3.3/lib/rubygems/specification.rb:741:in `each_gemspec' from /home/hori/Downloads/ruby-2.3.3/lib/rubygems/specification.rb:819:in `each_spec' from ../ruby-2.3.3/tool/rbinstall.rb:751:in `block in
' from ../ruby-2.3.3/tool/rbinstall.rb:801:in `block in
' from ../ruby-2.3.3/tool/rbinstall.rb:798:in `each' from ../ruby-2.3.3/tool/rbinstall.rb:798:in `
' uncommon.mk:260: ターゲット 'do-install-all' のレシピで失敗しました make: *** [do-install-all] エラー 1

ruby_2_3 ブランチではまだ直っていなかったので、パッチをつくりました。単に ruby_2_4 ブランチの修正を適用するだけ。

ruby-2.3.3-fix-rubygems-installer.diff

関連するチケットはこれ; Bug #12186: /snapshot/lib/rubygems/installer.rb:233 - Ruby trunk - Ruby Issue Tracking System

(2017.2 ここまで)