LoginSignup
4
4

More than 1 year has passed since last update.

Ruby3.0.0+Rails6.1.3からRuby3.2.0+Rails7.0.4にバージョンアップした話

Last updated at Posted at 2023-01-13

はじめに

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

Gemfile
# 一部抜粋
ruby "3.0.0"
gem 'rails', '~> 6.1', '>= 6.1.3.1'
gem 'therubyracer', platforms: :ruby

今回はRubyとRailsのバージョンを上げたいので以下を設定してみた。

Gemfile
ruby "3.2.0"
gem 'rails', '~> 7.0.4'

これで環境を作り直そうとした結果bundlerのエラー。
Gemfile.lockを消した状態でbundlerのバージョンを上げてbundle installした。
bundlerは2.4.3になった。

Gemfile.lock
# 一部抜粋
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

こちらの記事1, 記事2を参考にしました。

Gemfile
- 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

こちらの記事を参考に以下を追加しました。

Dockerfile
+ 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/environments/staging.rb
-  config.assets.js_compressor = :uglifier
+  config.assets.js_compressor = Uglifier.new(harmony: true)

2023/01/16 追記

コメントいだきましてuglifierはterserに変更しました。

Gemfile
- gem 'uglifier', '>= 1.3.0'
+ gem 'terser'
config/environments/staging.rb
-  config.assets.js_compressor = :uglifier
+  config.assets.js_compressor = :terser

最終的に

以下のようなGemfileになった。

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/environments/test.rb
-  config.cache_classes = true
+  config.cache_classes = false

これ変更したりspringのバージョンを上げたりした。

Heroku

以上の調査と修正によりバージョンアップ問題なしと判断し本番をHeroku-22 Stackに上げる。
Herokuのweb画面Settingsタブより「Upgrade Stack」を押す。

スクリーンショット 2023-01-13 14.47.19.png

デプロイを実行したところ以下エラー。

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になったことを確認した。

スクリーンショット 2023-01-13 14.52.32.png

まとめ

今回も前回同様15時間程度でバージョンアップすることができた。
バージョンアップは可能な限り追随していきたい。

4
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4