はじめに
Heroku-18 Stackで動いているアプリケーションがあり、こちらが2023/4にEOLを迎える。
それに伴いHeroku Stackを上げるとRubyのバージョンも上げないといけなかった。
Heroku-22 で使用可能な最も古い Ruby バージョン: Ruby 3.1.0
せっかくだったらこの機会に最新にしようと思い、バージョンを上げたのでその時の注意事項をメモ書き程度に残しておく。
前回上げた話はこちら。
Ruby2.3.4+Rails5.0.4からRuby3.0.0+Rails6.1.3にバージョンアップした話
Gemfile
まず元々のGemfile
# 一部抜粋
ruby "3.0.0"
gem 'rails', '~> 6.1', '>= 6.1.3.1'
gem 'therubyracer', platforms: :ruby
今回はRubyとRailsのバージョンを上げたいので以下を設定してみた。
ruby "3.2.0"
gem 'rails', '~> 7.0.4'
これで環境を作り直そうとした結果bundlerのエラー。
Gemfile.lockを消した状態でbundlerのバージョンを上げてbundle installした。
bundlerは2.4.3になった。
# 一部抜粋
RUBY VERSION
- ruby 3.0.0p0
+ ruby 3.2.0p0
BUNDLED WITH
- 2.3.19
+ 2.4.3
therubyracer
gem installすると以下のエラー
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
An error occurred while installing therubyracer (0.12.3), and Bundler
- gem 'therubyracer', platforms: :ruby
+ gem 'mini_racer', '~> 0.6.3'
mysql
手元の環境はDockerで作成しているが以下のエラー。
#5 22.67 W: GPG error: http://repo.mysql.com/apt/debian buster InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY xxxxxxxxxx
こちらの記事を参考に以下を追加しました。
+ RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys xxxxxxxxxx
render
ローカル環境が立ち上がったので動作確認をしたところrenderまわりで例外発生。
`render file:` should be given the absolute path to a file. 'hoge/moge.html.erb' was given instead
render fileに相対パスは渡せなくなったようだ。
renderまわりを以下のように修正。
- format.html { render :file => 'hoge/moge.html.erb' }
+ format.html { render 'hoge/moge' }
- format.js { render :template => 'foo/bar.js.erb' }
+ format.js { render 'foo/bar' }
これでひと通り動くようになった。
Rspec
ローカルでCI実行→全て通ったのでヨシ。
Uglifier
stgにデプロイした際に以下のエラー。
remote: rake aborted!
remote: Uglifier::Error: Unexpected token: punc ((). To use ES6 syntax, harmony mode must be enabled with Uglifier.new(:harmony => true).
こちらを参考に修正。
- config.assets.js_compressor = :uglifier
+ config.assets.js_compressor = Uglifier.new(harmony: true)
2023/01/16 追記
コメントいだきましてuglifierはterserに変更しました。
- gem 'uglifier', '>= 1.3.0'
+ gem 'terser'
- config.assets.js_compressor = :uglifier
+ config.assets.js_compressor = :terser
最終的に
以下のようなGemfileになった。
# 一部抜粋
ruby "3.2.0"
gem 'rails', '~> 7.0.4'
gem 'mini_racer', '~> 0.6.3'
gem 'terser'
各バージョンの後方互換を調べる
ローカル環境が起動しひと通りアプリケーションが動くことを確認。
RSpecが全て通ることを確認。
この時点で8割方バージョンアップ完了だったが、念の為各バージョンで後方互換切られているところを中心に調べていくことにした。
ruby3.1
影響ありそうなところをgrepで見ていったが特に問題なし。
ruby3.2
こちらも特に影響なし。
正規表現が速くなったのが嬉しい!
rails7.0.4
https://qiita.com/ryohashimoto/items/f5382478c78f296d8291
https://railsguides.jp/upgrading_ruby_on_rails.html
- config.cache_classes = true
+ config.cache_classes = false
これ変更したりspringのバージョンを上げたりした。
Heroku
以上の調査と修正によりバージョンアップ問題なしと判断し本番をHeroku-22 Stackに上げる。
Herokuのweb画面Settingsタブより「Upgrade Stack」を押す。
デプロイを実行したところ以下エラー。
Username for 'https://git.heroku.com': fatal: could not read Username for 'https://git.heroku.com': Success
こちらの記事を参考にしました。
sshでpushできなくなったのでhttpでpushするように変更。
heroku git:remote -a app_name -r heroku-stg
git push heroku-stg master
その後デプロイし無事にstack22になったことを確認した。
まとめ
今回も前回同様15時間程度でバージョンアップすることができた。
バージョンアップは可能な限り追随していきたい。