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

## はじめに

Heroku-18 Stackで動いているアプリケーションがあり、こちらが[2023/4にEOL](https://devcenter.heroku.com/ja/articles/heroku-18-stack#support-period)を迎える。
それに伴いHeroku Stackを上げるとRubyのバージョンも上げないといけなかった。

[参考](https://devcenter.heroku.com/ja/articles/ruby-support#ruby-versions)
>Heroku-22 で使用可能な最も古い Ruby バージョン: Ruby 3.1.0

せっかくだったらこの機会に最新にしようと思い、バージョンを上げたのでその時の注意事項をメモ書き程度に残しておく。
前回上げた話はこちら。
[Ruby2.3.4+Rails5.0.4からRuby3.0.0+Rails6.1.3にバージョンアップした話](https://qiita.com/yamamoto_hiroya/items/62dfae2dda7f35452b44)

## Gemfile

まず元々のGemfile

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

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

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

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

```diff_ruby:Gemfile.lock
# 一部抜粋
RUBY VERSION
-   ruby 3.0.0p0
+   ruby 3.2.0p0
BUNDLED WITH
-   2.3.19
+   2.4.3
```

### therubyracer

gem installすると以下のエラー

```bash
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
An error occurred while installing therubyracer (0.12.3), and Bundler
```

[こちらの記事1](https://note.com/konpyu/n/na213a14ad1e3), [記事2](https://qiita.com/jkr_2255/items/1d4cf636e044c0093091)を参考にしました。

```diff_ruby: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
```

[こちらの記事](https://zenn.dev/gomo/articles/7f6c28d002837c)を参考に以下を追加しました。

```diff_docker: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まわりを以下のように修正。

```diff_ruby
- 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).
```

[こちら](https://github.com/lautis/uglifier/issues/127#issuecomment-352224986)を参考に修正。

```diff_ruby:config/environments/staging.rb
-  config.assets.js_compressor = :uglifier
+  config.assets.js_compressor = Uglifier.new(harmony: true)
```

### 2023/01/16 追記

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

```diff_ruby:Gemfile
- gem 'uglifier', '>= 1.3.0'
+ gem 'terser'
```

```diff_ruby:config/environments/staging.rb
-  config.assets.js_compressor = :uglifier
+  config.assets.js_compressor = :terser
```


## 最終的に

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

```ruby:Gemfile
# 一部抜粋
ruby "3.2.0"
gem 'rails', '~> 7.0.4'
gem 'mini_racer', '~> 0.6.3'
gem 'terser'
```

## 各バージョンの後方互換を調べる

ローカル環境が起動しひと通りアプリケーションが動くことを確認。
RSpecが全て通ることを確認。
この時点で8割方バージョンアップ完了だったが、念の為各バージョンで後方互換切られているところを中心に調べていくことにした。

[ruby3.1](https://qiita.com/jnchito/items/bcd9b7f59bf4b30ea5b3)
影響ありそうなところをgrepで見ていったが特に問題なし。

[ruby3.2](https://qiita.com/jnchito/items/bdee57b45f12a0d5eeae)
こちらも特に影響なし。
正規表現が速くなったのが嬉しい!

rails7.0.4
https://qiita.com/ryohashimoto/items/f5382478c78f296d8291
https://railsguides.jp/upgrading_ruby_on_rails.html

```diff_ruby: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/6080a81f-abc6-33a9-3dff-718cc0177ca3.png)

デプロイを実行したところ以下エラー。
```
Username for 'https://git.heroku.com': fatal: could not read Username for 'https://git.heroku.com': Success
```

[こちらの記事](https://qiita.com/jnchito/items/f976382726fecf1d9461)を参考にしました。
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/c8daa6f5-a207-418a-cfcd-f00b5b716d9f.png)

## まとめ

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