Rails 7.1 にアップグレードしてからローカル環境でRSpecを実行するとFrozenErrorが大量にログに出力されるようになりました。
(各specで以下のログが大量に繰り返し出力されるようになったのですが、記事スペースの都合により1件だけ抜き出して添付します)
An error occurred while loading ./spec/system/lists/edit_spec.rb.
Failure/Error: require_relative '../config/environment'
FrozenError:
can't modify frozen Array: ["/usr/local/bundle/gems/actiontext-7.1.6/app/helpers", "/usr/local/bundle/gems/actiontext-7.1.6/app/models"]
# /usr/local/bundle/gems/railties-7.1.6/lib/rails/engine.rb:581:in `unshift'
# /usr/local/bundle/gems/railties-7.1.6/lib/rails/engine.rb:581:in `block in <class:Engine>'
# /usr/local/bundle/gems/railties-7.1.6/lib/rails/initializable.rb:32:in `instance_exec'
# /usr/local/bundle/gems/railties-7.1.6/lib/rails/initializable.rb:32:in `run'
# /usr/local/bundle/gems/railties-7.1.6/lib/rails/initializable.rb:61:in `block in run_initializers'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:231:in `block in tsort_each'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:353:in `block (2 levels) in each_strongly_connected_component'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:425:in `block (2 levels) in each_strongly_connected_component_from'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:425:in `block (2 levels) in each_strongly_connected_component_from'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:434:in `each_strongly_connected_component_from'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:424:in `block in each_strongly_connected_component_from'
# /usr/local/bundle/gems/railties-7.1.6/lib/rails/initializable.rb:50:in `each'
# /usr/local/bundle/gems/railties-7.1.6/lib/rails/initializable.rb:50:in `tsort_each_child'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:418:in `call'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:418:in `each_strongly_connected_component_from'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:424:in `block in each_strongly_connected_component_from'
# /usr/local/bundle/gems/railties-7.1.6/lib/rails/initializable.rb:50:in `each'
# /usr/local/bundle/gems/railties-7.1.6/lib/rails/initializable.rb:50:in `tsort_each_child'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:418:in `call'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:418:in `each_strongly_connected_component_from'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:352:in `block in each_strongly_connected_component'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:350:in `each'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:350:in `call'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:350:in `each_strongly_connected_component'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:229:in `tsort_each'
# /usr/local/bundle/gems/tsort-0.2.0/lib/tsort.rb:208:in `tsort_each'
# /usr/local/bundle/gems/railties-7.1.6/lib/rails/initializable.rb:60:in `run_initializers'
# /usr/local/bundle/gems/railties-7.1.6/lib/rails/application.rb:426:in `initialize!'
# ./config/environment.rb:5:in `<main>'
# ./spec/rails_helper.rb:4:in `require_relative'
# ./spec/rails_helper.rb:4:in `<main>'
# /usr/local/bundle/gems/bootsnap-1.18.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
# /usr/local/bundle/gems/bootsnap-1.18.6/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:in `require'
# /usr/local/bundle/gems/zeitwerk-2.6.18/lib/zeitwerk/kernel.rb:34:in `require'
# ./spec/system/lists/edit_spec.rb:3:in `<main>'
原因
環境別のcredentialsを作成したことで、master.key を使ってローカルで復号できなくなったことが原因でした。
ちなみに、Rails 7.1 にアップグレードした後もCI環境では問題なくRSpecを実行できていました。
FrozenErrorのバックトレースだけ追いかけても原因を突き止めることができず、標準出力に繰り返し出力される大量のログで見切れた一番最初の部分に以下のエラーが出ていることに気が付いてようやく原因を特定することができました。
An error occurred while loading ./spec/system/lists/create_spec.rb.
Failure/Error: require_relative '../config/environment'
ActiveSupport::MessageEncryptor::InvalidMessage:
ローカルでRSpecを実行すると、credentialsを復号できずアプリケーションの初期化に失敗して、その後に読み込まれる各テストケースに紐付く形でFrozenErrorがログに繰り返し出力されていたみたいです。
解決方法
credentialsを再作成しました。
私の場合は環境別のcredentials作成時に誤ってmasterを上書きしたことが原因だったので断念しましたが、復号できるkeyとyml.encの組み合わせが分かる場合は元に戻すだけでもいいかも知れません。