kachick / times_kachick

`#times_kachick channel in chat` as a public repository. Personal Note and TODOs
https://github.com/kachick/times_kachick/issues?q=is%3Aissue+is%3Aclosed
6 stars 0 forks source link

2022-07-15 - [非推奨] openssl 1.1.1q で CRuby が build 出来無いので、次の 1.1系リリースが出るまで openssl3 + Ruby 3.1 only で凌ぐ => ruby-build が対応してくれたので asdf-ruby に乗り換えた #180

Closed kachick closed 2 years ago

kachick commented 2 years ago

https://github.com/kachick/times_kachick/issues/174 で少し触り出した Pop! OS が Ubuntu 22.04 ベースだった。 WSL で使ってるイメージが 20系 のままだったなと思って Zenn の記事とか見ながら上げてみた。それ自体はサクッと行ったんだけど、しばらくしてから bundle install 時に https 接続しようとしてか OpenSSL エラーが出るのに気づいた。 まぁ入れ直せば良いんだろぐらいに思ってたけどうまくいかない。 chruby + ruby-install からそろそろ asdf-ruby に乗り換えようかなーと思ったけど、こちらは そもそも build 時にコケる(扱いの違いがよくわかってない)

どうやらつい最近上がった openssl@1.1.1q にバグが合ったのか、結構幅広くコケてるみたい。asdf-ruby も中で ruby-build 使ってた気がするから同じ問題なのかな

Ubuntu 22.04 では openssl@1.1 系列が標準で入らないようなのだけど、全部 brew なりで突っ込んでたから自分の環境では特に問題にならないのかな。でも Ruby 3.0未満はこれだとビルド出来ないのかー。 ruby-install は brew 使ってる時に openssl@1.1 系を固定で使うみたい。

自分は mac も linux も brew に寄せてた上にぽんぽん upgrade してたので踏んだ感。

アクティブな ruby-build 側にはもう動きが出ているのでしばらく待てば解消しそうだけど、ローカルで動かせる Ruby が皆無だと困ってしまう。とりあえず Ruby 3.1+ だけ使えれば後は必要に応じて Docker 起動なりで凌げるかなーと、 ruby-install で openssl3 の path 指定して入れ直してしまった。 openssl3 系まで brew で入れる必要あったのかよくわかってない・・・pathがわかんなくなってるだけでどっかにシステム由来のがある筈?。

❯ bundle install

Could not load OpenSSL.
You must recompile Ruby with OpenSSL support or change the sources in your Gemfile from 'https' to 'http'. Instructions
for compiling with OpenSSL using RVM are available at https://rvm.io/packages/openssl.

❯ openssl version
OpenSSL 1.1.1q  5 Jul 2022

❯ la $(which openssl)
lrwxrwxrwx 1 kachick kachick 40 Jul  9 13:18 /home/linuxbrew/.linuxbrew/bin/openssl -> ../Cellar/openssl@1.1/1.1.1q/bin/openssl

❯ brew install openssl@3
==> Summary
🍺  /home/linuxbrew/.linuxbrew/Cellar/openssl@3/3.0.5: 6,775 files, 36.2MB
==> Running `brew cleanup openssl@3`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

❯ brew --prefix openssl@3
/home/linuxbrew/.linuxbrew/opt/openssl@3

❯ ruby-install ruby 3.1.2 -- --with-openssl-dir=$(brew --prefix openssl@3)
>>> Successfully installed ruby 3.1.2 into /home/kachick/.rubies/ruby-3.1.2

❯ bundle install
Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies...
kachick commented 2 years ago

https://github.com/rbenv/ruby-build/discussions/2009

ruby-build 側が自動でOpenSSL側にパッチを当てる方向で対応したみたい。凄いなぁとは思ったけど、OpenSSL側が修正パッチリリースしないみたいなので、使えないバージョンが入っているよりはマシな気がする・・・

with-openssl-dir 指定も ruby-build 側で指定できるみたいだし、この機会に asdf-ruby に乗り変えてみようかな

https://github.com/rbenv/ruby-build/wiki

RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/local rbenv install

asdf-ruby には rbenv とかで提供されてたっぽい? .default-gems が使えるのもちょっと便利そう。

kachick commented 2 years ago

しかし asdf-ruby の ruby-build 依存性が上がってなかったので fork して v20220721 に上げてみたけどあかんかった。 OpenSSL を linuxbrew の 3.x 指定すれば 3.1 が入り、 1.1 指定だと 2.7.6 とか install できないという状況が変わらず。 詳細なログ比較まではしていないけど、 指定の仕方次第で ssl っぽいのと default gem の stringio でコケてるっぽいのと2パターン合ってよくわからない・・・

generating x86_64-linux-fake.rb
x86_64-linux-fake.rb updated
./miniruby -I./lib -I. -I.ext/common  ./tool/runruby.rb --extout=.ext  -- --disable-gems -r./x86_64-linux-fake ./tool/rbinstall.rb --make="make" --dest-dir="" --extout=".ext" --mflags="" --make-flags="" --data-mode=0644 --prog-mode=0755 --installed-list .installed.list --mantype="doc" --rdoc-output=".ext/rdoc" --html-output=".ext/html"
/tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/core_ext/kernel_require.rb:83:in `require': libssl.so.1.1: cannot open shared object file: No such file or directory - /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/.ext/x86_64-linux/openssl.so (LoadError)
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/core_ext/kernel_require.rb:83:in `require'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/.ext/common/openssl.rb:13:in `<top (required)>'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/core_ext/kernel_require.rb:83:in `require'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/core_ext/kernel_require.rb:83:in `require'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/security.rb:12:in `<top (required)>'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/core_ext/kernel_require.rb:83:in `require'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/core_ext/kernel_require.rb:83:in `require'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/package.rb:44:in `<top (required)>'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/core_ext/kernel_require.rb:83:in `require'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/core_ext/kernel_require.rb:83:in `require'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/installer.rb:11:in `<top (required)>'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/core_ext/kernel_require.rb:83:in `require'
    from /tmp/ruby-build.20220721212310.6896.XKrOxR/ruby-2.7.6/lib/rubygems/core_ext/kernel_require.rb:83:in `require'
    from ./tool/rbinstall.rb:713:in `<module:RbInstall>'
    from ./tool/rbinstall.rb:649:in `<main>'
installing default gems from ext:   /home/kachick/.asdf/installs/ruby-kachick/2.7.6/lib/ruby/gems/2.7.0 (build_info, cache, doc, extensions, gems, specifications)
                                    bigdecimal 2.0.0
                                    date 3.0.3
                                    dbm 1.1.0
                                    etc 1.1.0
                                    fcntl 1.0.0
                                    fiddle 1.0.0
                                    gdbm 2.1.0
                                    io-console 0.5.6
                                    json 2.3.0
                                    openssl 2.1.3
                                    psych 3.1.0
                                    readline-ext 0.1.0
                                    sdbm 1.0.0
                                    stringio 0.1.0
                                    strscan 1.0.3
                                    zlib 1.1.0
installing bundled gems:            /home/kachick/.asdf/installs/ruby-kachick/2.7.6/lib/ruby/gems/2.7.0 (build_info, cache, doc, extensions, gems, specifications)
                                    test-unit 3.3.4
                                    xmlrpc 0.3.0
                                    minitest 5.13.0
                                    rake 13.0.1
                                    net-telnet 0.2.0
                                    power_assert 1.1.7
/home/kachick/.asdf/installs/ruby-kachick/2.7.6/bin/ruby: symbol lookup error: /home/kachick/.gem/ruby/3.1.2/gems/stringio-3.0.2/lib/stringio.so: undefined symbol: rb_ext_ractor_safe

https://github.com/ruby/stringio/blob/16847fea32bda8262bd8bc81ad5297de39592c9c/ext/stringio/stringio.c#L1778-L1780 このコード2年前に追加されてるんだけど、2.7 系なのに Ractor 関係の定義が有る・・・? と思ったら、2.7.6 の ruby から 3.1.2 の gems を読みに行ってるの・・・?どうして・・・? 🤷‍♂️ asdf-ruby の bug かなー

なんかコネコネしてたらうまく行ったっぽい!

$ asdf plugin-add ruby-kachick git@github.com:kachick/asdf-ruby.git
$ RUBY_CONFIGURE_OPTS=--with-openssl-dir=$(brew --prefix openssl@1.1) asdf install ruby-kachick 2.7.6
Downloading ruby-2.7.6.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.6.tar.bz2
Installing ruby-2.7.6...
ruby-build: using readline from homebrew
Installed ruby-2.7.6 to /home/kachick/.asdf/installs/ruby-kachick/2.7.6

zsh 上げ直した状態でうまく行った感だから、 chruby の PATH が残ってたのかも・・・?何もわからないけどなんか良さそう。後は早く本家がこの ruby-build バージョン入れてほしいけど、あんますぐ最新版に上げないというか、一個前のバージョンを stable みたいに扱ってる感なので難しいかも。しばらく fork したやつを使うか・・・ と思ったら ASDF_RUBY_BUILD_VERSION で ruby-build の ref を指定できるらしい。

ASDF_RUBY_BUILD_VERSION=v20220721 RUBY_CONFIGURE_OPTS=--with-openssl-dir=$(brew --prefix openssl@1.1) asdf install ruby 2.7.6