背景
自分は普段、Github Actions で CI/CD 環境を作る事が多いのですが、つい先日、新たなコミットを push してビルドおよびテストを実行した結果、なぜか途中でコケるようになってしまいました。
具体的に言うと、「bundle exec」コマンドを使おうとするタイミングで
to_binary': wrong argument type false (expected Symbol) (TypeError)
エラーが発生するようになってしまった感じです。
▶︎ Run bundle exec rails db:create
bundle exec rails db:create
bundle exec rails db:migrate
shell: sh -e {0}
/__w/myapp/vendor/bundle/ruby/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/compile_cache/iseq.rb:13:in `to_binary': wrong argument type false (expected Symbol) (TypeError)
from /__w/myapp/myapp/vendor/bundle/ruby/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/compile_cache/iseq.rb:13:in `input_to_storage'
from /__w/myapp/myapp/vendor/bundle/ruby/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/compile_cache/iseq.rb:30:in `fetch'
ごくわずかな修正(とあるページの文言を少し変更しただけ)でどう考えても Github Actions のワークフローに影響を与え得るようなものではなかったのと、そもそもローカル環境では問題無く動いているように見えたため、解消にだいぶ手こずりました。
今回はその際のメモという事で残しておきます。
環境
- Ruby 3.0.3
- Rails 6.1.4.1
- bootsnap 1.9.1
- Github Actions
原因
先に結論から言ってしまうと、どうやらRubyのバージョンが影響していたみたいです。
少し前に Ruby 3.0.3 がリリースされたようなのですが、ちょうどそのタイミングで bootsnap のリポジトリにて不具合に関する報告が挙げられています。
なので、自分が何か直接マズい変更を加えたというよりは、外部ライブラリによる影響だったというわけですね。
該当のissue内で
「Updating to 1.9.3 helped us with this issue. Thanks!」
とあるように、この問題については
$ bundle update bootsnap
などのコマンドで bootsnap のバージョンを上げると解決できるようなので、素直に従ったところ無事解決しました。
なお、冒頭で「ローカル環境では問題無く動いているのに Github Actions のワークフロー内ではなぜかコケる」といった旨の発言をしていましたが、これはローカル環境では
ruby-3.0.1
と Ruby をパッチバージョンまで明確に固定しているのに対し、Github Actions のワークフロー内では
jobs:
test:
container:
image: ruby:3.0
といった具合にマイナーバージョンまでの指定に留めてやや曖昧にしていたのが理由と思われます。
ローカル環境では 3.0.1 で動いている一方、 Github Actions のワークフロー内では問題の 3.0.3 で動いてしまっており厳密には実行環境が揃っていないという感じですね。
この辺を自分は甘く考えていたため、今後はより実行環境の統一を心がけていこうという教訓になりました。
まとめ
- Ruby 3.0.3 以降は bootsnap のバージョンを上げる必要がある
- 実行環境は極力統一を心がける