Docker + Rails(Ruby)をバージョンアップ(アップグレード)したお話

## Docker環境でRails(Ruby)アプリをアップグレードした記事がない!?

### 非Docker環境でRubyとRailsをアップグレードする方法はすぐに見つかりました。
伊藤さんが書かれてる下記の記事が本当にわかりやすいです。

> [永久保存版！？伊藤さん式・Railsアプリのアップグレード手順 - Qiita](https://qiita.com/jnchito/items/0ee47108972a0e302caf)

ちなみに私は`Docker Rails アップデート`、`Docker Rails バージョンアップ`などでググりましたが見つかりませんでした。ワードが違いますもんねw



### 「じゃあDocker環境でRubyとRailsをアップグレードする記事もすぐ見つかるでしょ」
そう思ったのですが

- 思ったよりも見つからない
- Rubyのアップグレード方法がいくつかパターンがあるみたい
  - rbenvを利用してアップグレードする方法([docker-composeによるrails5の開発環境構築時のエラーまとめ【公式通りはうまくいかない】 - よしゆきライフ](https://yoshiyukilife.com/docker-compose-rails/))
  - DockerfileのRubyのバージョンを変更してアップグレードする([個人開発アプリをDockerでコンテナ化してみた - アクトインディ開発者ブログ](https://tech.actindi.net/2020/01/05/174712?utm_source=feed))


といういくつかのパターンがある印象を受けました。

それがこの投稿に至った理由です。


### 進め方、参考リンク
基本的には[永久保存版！？伊藤さん式・Railsアプリのアップグレード手順 - Qiita](https://qiita.com/jnchito/items/0ee47108972a0e302caf)が全体のベースとして進めます。

後々同じことを繰り返さないために遭遇したWARNINGログやエラーログも書いていこうと思います。


### 読んで欲しい人
- Docker + Railsアプリ作れた人(RSpecでテスト書いてあったら最高!!)
- Docker + Ruby + Rails の環境をアップグレードしようとしている人

今回はRubyの公式からイメージを取得する方法で行なっています。
rbenvでRubyを設定、アップデートする方法は想定していません、ご了承ください(m_ _m)




### 動作環境
|  | version<br>(アップグレード前)      |version<br>(アップグレード後)|
|:----------:|:------------:|:----------:|
| MacOS      | Mojave        | Mojave        |
| Ruby       | 2.5.7        |2.7.2        |
| Rails      | 5.1.7        |6.0.3.5        |
| MySQL      | 5.7          |5.7          |



#### 注意点
あくまでアプリをアップグレードした私の備忘録です。完璧ではありません。
違う部分があればアドバイスいただけると助かります。

現在はサンプルアプリのリンクはありませんが、後々作成する予定です。


### 本題

<!--
手順0. 前準備
実際に試すには参考アプリが必要になります。
あったほうがいいですよね?
というわけで作ってみました。
-->

#### 手順1. 現在使用しているgemを最新にする
RubyとRailsアップグレードを進める前にDockerコンテナ内のgemをアップデートしておきます。
おなじみのコマンドですね。

```bash:shell
docker-compose run --rm web bundle update
```
私の場合はここで下記のログが表示されました。

```bash:shell
Ignoring bigdecimal-1.3.5 because its extensions are not built. Try: gem pristine bigdecimal --version 1.3.5
Ignoring bootsnap-1.5.1 because its extensions are not built. Try: gem pristine bootsnap --version 1.5.1
Ignoring mini_racer-0.3.1 because its extensions are not built. Try: gem pristine mini_racer --version 0.3.1
Ignoring msgpack-1.4.0 because its extensions are not built. Try: gem pristine msgpack --version 1.4.0
Ignoring msgpack-1.3.3 because its extensions are not built. Try: gem pristine msgpack --version 1.3.3
Ignoring puma-5.1.1 because its extensions are not built. Try: gem pristine puma --version 5.1.1
Ignoring websocket-driver-0.7.3 because its extensions are not built. Try: gem pristine websocket-driver --version 0.7.3
:
:
```
この後は通常の`bundle install`、`bundle update`と同じ表示がされていました。
これは[リンク](https://blog.freedom-man.com/ruby-notbuilt-message)の通りに下記のコマンドを実行することで`bundle install`を実行しても上記のログも表示されなくなりました。

```bash:shell
docker-compose run --rm web gem pristine --all
```


#### 手順2. 最新ではないgemを探して、できる限りバージョンアップする
`docker-compose run --rm web bundle outdated`コマンドで最新バージョンを使っていないgemを確認できます。

```bash:shell
$ docker-compose run --rm web bundle outdated
Creating app_for_job_change_web_run ... done
Fetching https://github.com/thoughtbot/shoulda-matchers.git
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies................................................

Outdated gems included in the bundle:
  * actioncable (newest 6.1.1, installed 5.1.7)
  * actionmailer (newest 6.1.1, installed 5.1.7)
  * actionpack (newest 6.1.1, installed 5.1.7)
  * actionview (newest 6.1.1, installed 5.1.7)
  * activejob (newest 6.1.1, installed 5.1.7)
  * activemodel (newest 6.1.1, installed 5.1.7)
  * activerecord (newest 6.1.1, installed 5.1.7)
  * activesupport (newest 6.1.1, installed 5.1.7)
  * arel (newest 9.0.0, installed 8.0.0)
  * childprocess (newest 4.0.0, installed 3.0.0)
  * listen (newest 3.4.1, installed 3.1.5, requested >= 3.0.5, < 3.2) in groups "development"
  * polyamorous (newest 2.3.2, installed 2.3.0)
  * puma (newest 5.2.0, installed 3.12.6, requested ~> 3.7) in groups "default"
  * rails (newest 6.1.1, installed 5.1.7, requested ~> 5.1.7) in groups "default"
  * rails-i18n (newest 6.0.0, installed 5.1.3) in groups "default"
  * railties (newest 6.1.1, installed 5.1.7)
  * ransack (newest 2.4.2, installed 2.3.0) in groups "default"
  * shoulda-matchers (newest 4.5.1, installed 3.1.2 4b160bd) in groups "test"
  * tzinfo (newest 2.0.4, installed 1.2.9)
  * web-console (newest 4.1.0, installed 3.7.0) in groups "development"
  * webpacker (newest 5.2.1, installed 4.3.0) in groups "default"
  * websocket-driver (newest 0.7.3, installed 0.6.5)
```

ちなみに伊藤さんの記事で紹介されている`bundle_outdated_formatter`というgemを使うと下記のように表示されます([emsk/bundle_outdated_formatter: Formatter for `bundle outdated` command](https://github.com/emsk/bundle_outdated_formatter))。
結果表示までの時間もgemを使用したやりかたの方が早かったです!!
it's so beautiful!!

```bash:shell
# ローカルにインストールする
$ gem install bundle_outdated_formatter

$  docker-compose run --rm web bundle outdated | bof
Creating app_for_job_change_web_run ... done
┌──────────────────┬────────┬───────────┬─────────────────┬─────────────┐
│ gem              │ newest │ installed │ requested       │ groups      │
├──────────────────┼────────┼───────────┼─────────────────┼─────────────┤
│ actioncable      │ 6.1.1  │ 5.1.7     │                 │             │
│ actionmailer     │ 6.1.1  │ 5.1.7     │                 │             │
│ actionpack       │ 6.1.1  │ 5.1.7     │                 │             │
│ actionview       │ 6.1.1  │ 5.1.7     │                 │             │
│ activejob        │ 6.1.1  │ 5.1.7     │                 │             │
│ activemodel      │ 6.1.1  │ 5.1.7     │                 │             │
│ activerecord     │ 6.1.1  │ 5.1.7     │                 │             │
│ activesupport    │ 6.1.1  │ 5.1.7     │                 │             │
│ arel             │ 9.0.0  │ 8.0.0     │                 │             │
│ childprocess     │ 4.0.0  │ 3.0.0     │                 │             │
│ listen           │ 3.4.1  │ 3.1.5     │ >= 3.0.5, < 3.2 │ development │
│ polyamorous      │ 2.3.2  │ 2.3.0     │                 │             │
│ puma             │ 5.2.0  │ 3.12.6    │ ~> 3.7          │ default     │
│ rails            │ 6.1.1  │ 5.1.7     │ ~> 5.1.7        │ default     │
│ rails-i18n       │ 6.0.0  │ 5.1.3     │                 │ default     │
│ railties         │ 6.1.1  │ 5.1.7     │                 │             │
│ ransack          │ 2.4.2  │ 2.3.0     │                 │ default     │
│ shoulda-matchers │ 4.5.1  │ 3.1.2     │                 │ test        │
│ tzinfo           │ 2.0.4  │ 1.2.9     │                 │             │
│ web-console      │ 4.1.0  │ 3.7.0     │                 │ development │
│ webpacker        │ 5.2.1  │ 4.3.0     │                 │ default     │
│ websocket-driver │ 0.7.3  │ 0.6.5     │                 │             │
└──────────────────┴────────┴───────────┴─────────────────┴─────────────┘
```


**めっちゃ表示されました...**
アプリを作成してからバージョンアップをこまめにしてこなかったのが原因です(m_ _m)

ここで表示されている中で特に注目していただきたいのは **現状のRailsと同じバージョン番号を表示、使用しているgem** と **バージョン番号の先頭の数字が変わっているgem** です。

Railsと同じバージョン番号のgemは、Railsアプリを作成するときに必須のgemであり、Rails本体ををアップグレードすれば一緒にバージョン番号が上がると考えて問題ないと思います(`actioncable`, `railties`など)。

次にバージョン番号の先頭の数字が変わっているgem(今回の場合は`webpacker`や`regexp_parser`など)についてですが、こちらは[伊藤さんが対処法を書かれています](https://qiita.com/jnchito/items/0ee47108972a0e302caf#4-c-%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%81%8C%E8%B5%B7%E3%81%8D%E3%82%84%E3%81%99%E3%81%9D%E3%81%86%E3%81%AAgem%E3%82%921%E3%81%A4%E3%81%9A%E3%81%A4%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B)ので、一読していただければわかります。
ひどい時はアプリが動かなくなる可能性もあるみたいです。

もしgemのバージョン指定の意味がわからない場合は[こちらの記事](https://yu8mada.com/2018/04/28/let-s-follow-semantic-versioning-when-deciding-versions-of-a-rubygem/)でわかると思います。

ちなみに私の場合は上記の表示されるgemの数が減りませんでした(m_ _m)
**Railsのバージョンを上げていくにつれて表示される数が減っていったので、**もし頑張っても数が減らないなら**Railsのバージョンをアップするのもあり**かもしれません。

#### 手順3. developmentとtestグループのgemをバージョンアップする
ここで本番環境に影響の出ないdevelopment環境とtest環境のgemをバージョンアップします。
その前にGemfileにとても大事な変更を行います。
それは**gemのバージョン指定の記述を削除することです(Railsは対象外)。**
下記のように全てのgemに対してバージョン指定を削除しましょうというお話です。

```diff_ruby:Gemfile
- gem 'mysql2', '>= 0.3.18', '< 0.6.0'
- gem 'puma', '~> 3.7'
+ gem 'mysql2'
+ gem 'puma'
gem 'rails', '~> 5.1.7' # Railsのgemのバージョン指定は削除しないこと!!
```

Rails以外のバージョンアップするにはshellで下記のコマンドを実行します。
developmentとtest環境からアップグレードします。

```bash:shell
$ docker-compose run --rm web bundle update -g development -g test
```

```bash:shell
$ docker-compose run --rm web bundle update -g development -g test                                                                                                
Creating app_for_job_change_web_run ... done
Fetching https://github.com/thoughtbot/shoulda-matchers.git
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies.........
:
# gemのインストールなどは省略します
:
:
Bundler attempted to update awesome_print but its version stayed the same
Bundler attempted to update byebug but its version stayed the same
Bundler attempted to update factory_bot_rails but its version stayed the same
Bundler attempted to update faker but its version stayed the same
Bundler attempted to update gimei but its version stayed the same
Bundler attempted to update pry-byebug but its version stayed the same
Bundler attempted to update pry-rails but its version stayed the same
Bundler attempted to update rails-flog but its version stayed the same
Bundler attempted to update rspec-rails but its version stayed the same
Bundler attempted to update capybara but its version stayed the same
Bundler attempted to update launchy but its version stayed the same
Bundler attempted to update rspec_junit_formatter but its version stayed the same
Bundler attempted to update selenium-webdriver but its version stayed the same
Bundler attempted to update shoulda-matchers but its version stayed the same
Bundler attempted to update simplecov but its version stayed the same
Bundler attempted to update vcr but its version stayed the same
Bundler attempted to update webdrivers but its version stayed the same
Bundler attempted to update webmock but its version stayed the same
```
同じようなWARNINGがたくさん表示されました。

`Bundler attempted to update xxx but its version stayed the same`
をそのままググると[リンク](https://teratail.com/questions/260262)のようにこの警告が原因で、Rails自体がアップグレードできない場合もあるみたいです。

私の場合は色々試みましたがこの時点では解決できなかったので、放置して次の手順へ進みました。
一応念のため、RSpecでテストを実行して動作的に問題がないことを確認してから次に進めています。
(ちなみにアプリのアップグレードが完了した後も`docker-compose run --rm web bundle update -g development -g test`を実行すると同じようにログが出ます... 解消できない...)

#### 手順4. Rails以外ののgemを全てバージョンアップする
今度は本番環境を含むgemをバージョンアップしましょう
**ここもRailsは対象外です**。
やっていることは上とほぼ同じなので割愛しますが

1. `docker-compose run --rm web bundle update`を実行する
2. `docker-compose run --rm web rspec`でテストを実行する

という手順をふみます。

問題なくバージョンアップできていれば次に進みます。
例のごとくRSpecでテストを実行して動作的に問題がないことを確認します。

さぁ、
これで準備できたから
Railsをアップグレードするぞ!!

**とはなりません。**

#### 手順5. Rubyを(できるだけ)バージョンアップする
**※Rubyのバージョンが最新安定版であれば問題ありません。次のRailsをアップグレードする手順へ進んでください。**

Rubyを段階的にアップグレードします(`2.6.6` -> `2.7.2`みたいな感じ)。
ちなみに2021年1月現在の最新安定版のRubyバージョンは 3.0.0 です([Rubyのトップページ](https://www.ruby-lang.org/ja/downloads/))。

理由としては下記が挙げられます。

- Rubyをアップグレードすると仕様が変わることがある(アプリが動かなくなる原因にも)
- セキュリティやパフォーマンスに悪い影響が出る可能性がある

なので**アップグレードは定期的にしましょう!!**

そして個人的に重要だと思うのは**アップグレードすることに対して十分な時間と心のゆとりをもつこと**です。
それさえあればなんとかなります(なると思います)。

私の場合は記事投稿地点でのRubyのバージョンが`2.5.7`です。
最新のRubyバージョンまでアップするためには

`2.5.7` ~> `2.6.6` ~> `2.7.2` ~~~> `3.0.0`~~

と~~3~~2回のアップグレードが必要になります。


では実際にアップグレードしていきます。

まず`Dockerfile`の記述を変更します。

```diff_docker:Dockerfile
- ARG RUBY_VERSION=2.5.7
+ ARG RUBY_VERSION=2.6.6
FROM ruby:$RUBY_VERSION
```

ちなみにここで指定しているイメージの数値は**必ずDockerHubのRuby公式イメージに存在する数値に書き換えてください!!**([ruby - Docker Hub](https://hub.docker.com/_/ruby))
私は`2.6.6`にすべき値を`2.6.0`とDockerHubを確認せずに変更して、エラーの原因がそれだと気づかず数日を浪費しました。

話を戻しますが、
私はDockerfileで定義命令として`ARG`を使っているので上記の書き方になりますが、使っていなければ

```diff_docker:Dockerfile
- FROM ruby:2.5.7
+ FROM ruby:2.6.6
```
という書き方になります。

その後下記コマンドを順に実行していきます。

```bash:shell
docker-compose build --no-cache
docker-compose run --rm web bundle install
# mv Gemfile.lock tmp <- bundle install がうまくいかないときに実行
# docker-compose run --rm web bundle install <- mv Gemfile.lock tmp を実行したら再度bundle installする
docker-compose run --rm web gem pristine --all # これを実行すると Ignoring <gem_name>-<version> because its extensions are not built. Try: gem pristine <gem_name> --version <version> という警告が表示されなくなる
```

上記のコマンドの意味は下記に書いておきます。

- `docker-compose build --no-cache`: cacheを使わずにイメージをビルドする。cacheが有効になっていると設定変更がうまくされない場合があります([docker-compose build | Docker ドキュメント](https://matsuand.github.io/docs.docker.jp.onthefly/compose/reference/build/))。今回はかなり大きめな変更なので`--no-cache`オプションを付加します。
- `mv Gemfile.lock tmp`: Gemfile.lockが原因でうまくgemが入らない時があります。そんなときはGemfile.lockの中の記述を空にする方法がありますが、それと同じ効果があります。
- `docker-compose run --rm web bundle install`: Rubyのアップグレードを行ったのでgemの対応バージョンも変化する場合があるので実行します。
- `docker-compose run --rm web gem pristine --all`:詳細は[このリンク](https://helen.hatenablog.com/entry/2016/04/24/140820)に委ねます。


そしてここでRSpecでテストします。

問題なければ、DockerのRubyイメージがちゃんと変更した新しいバージョンかチェックしましょう。
チェックするには下記のコマンドを実行します。

```bash:shell
$  docker-compose run --rm web ruby -v
Creating app_for_job_change_web_run ... done
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]
```
Dockerfileで変更した数値と合致していれば成功です。
最後に隠しファイルである`.ruby-version`を開いてみてください。
私の場合は後から気づいたのですが、基本的には自動でRailsアプリで使用しているRubyのバージョンに自動で切り替わるらしいのですが、私の場合は切り替わらなかったので自分で修正しました。

```diff:.ruby-version
- 2.5.7
+ 2.6.6
```
これで**Rubyのアップグレードは(とりあえず)完了です**。
**そしてやっと本題のRailsのアップグレードに取り掛かります。**

#### ちなみに
- Rubyのイメージのバージョンを変更して(`docker-compose build  --no-cache`)、`bundle install`も問題なくできた場合、**それ以降で発生するエラーは通常のRailsで発生するエラーと同じはずです。**
じっくり、こつこつと修正していきましょう^ ^
- 試していてわかったのですが、**Rubyの`3.0.0`とRailsの`5.2.4.4`は現在互換性がありません**(調べ方は[このリンク](https://qiita.com/fursich/items/692f50cc16a3a8d167e7#%E8%A4%87%E6%95%B0%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E3%83%86%E3%82%B9%E3%83%88%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88)の`過去も含めた複数バージョンへのサポートを提供しているgem`というところに書いてある)。
- **Rubyの`3.0.0`と互換性のあるRailsのバージョンは`6.1.0`以上**のようです([アプリケーションをRuby3にあげるときにやること - Qiita](https://qiita.com/fursich/items/692f50cc16a3a8d167e7#ruby300%E5%AF%BE%E5%BF%9C%E7%8A%B6%E6%B3%81%E8%A6%B3%E6%B8%AC%E7%AF%84%E5%9B%B2))。
- この記事ではとりあげていませんが、CircleCIを使用されている場合はCircleCI側のRubyのバージョンも変更する必要があるので注意してください。

自分の事例をそのままま書くと下記になります。

| アップグレード | Ruby ver | Rails ver | 可否 |
|:----------:|:------------:|:----------:|:----------:|
| 初期状態      | 2.5.7        | 5.1.7        | OK |
| 1回目       | 2.6.6        | 5.1.7        | OK |
| 2回目      | 2.7.2        |5.1.7        | OK |
| 3回目      | 2.7.2          |5.2.4.4          |OK|
| 4回目      | 2.7.2          |6.0.3.4          |OK|
| 5回目      | 3.0.0          |6.0.3.4          |NG|
| 4回目      | 2.7.2(ダウングレード)          |6.0.3.4          |OK|



#### 手順6. Railsをバージョンアップする

**ようやく本題、Railsのアップグレードにとりかかります**。

ここで注意しなければならないことは、当たり前かもしれませんが
**RubyとRailsの互換性を確認すること** です。
**これが合っていないと作成したアプリが壊れてしまいかねませんのでご注意ください。**
確認方法は[Rails アップグレードガイド - Railsガイド](https://railsguides.jp/upgrading_ruby_on_rails.html#ruby%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3)に互換性のあるRubyとRailsのバージョンが記載されています。
ちなみに下記リンクはRailsの全バージョン履歴です(Rubyの全バージョン履歴わかれば誰か教えてください)。

> [railsの全バージョン履歴 | RubyGems.org | コミュニティのGemホスティングサービス](https://rubygems.org/gems/rails/versions)

私の作成当初の構成は

- Ruby: `2.5.7`
- Rails: `5.1.7`

だったので
Railsはまず`5.2.4.4`にまで上げることにしました。

Railsのバージョンを上げるためには Gemfile の記述を下記のように変更します。

```diff:Gemfile
- gem 'rails', '~> 5.1.7'
+ gem 'rails', '5.2.4.4'
```
バージョンは最新のパッチバージョンでカッチリ固定してあげてください。
準備ができたらshellで下記コマンドを実行してRailsも含めたバージョンアップを行います

```shell:shell
docker-compose run --rm web bundle update
```

バージョンアップが完了したらRspecでテストをします。
テストがOKならば無事Railsのアップグレードが**ひとまず**完了です。


#### 手順7. load_defaultsやnew_framework_defaults_x_x.rbを設定する
[伊藤さんの記事へのリンク](https://qiita.com/jnchito/items/0ee47108972a0e302caf#10-d-load_defaults%E3%82%84new_framework_defaults_x_xrb%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)をそのまま貼らせていただいてますが、
アップグレードによってデフォルトの挙動が変わったりする時があります。
それを前のバージョンのと同じように動作させるための設定をする必要がある場合もあります。
> [config.load_defaultsとnew_framework_defaults_x_x.rbの関係を詳しく調べてみた - Qiita](https://qiita.com/jnchito/items/cce3b2795e1c66735310)


#### Ruby、Railsのアップグレードの流れは完了
これでDocker + Ruby + Rails アップグレードの流れは理解できたと思います。
バージョンが古い場合は大変な労力と時間がかかりますが、手順の5から7を繰り返せばアップグレードはできると思います!!


# 警告一覧
##### HEADS UP! i18n 1.1 changed fallbacks to exclude default locale. But that may break your application.
`docker-compose run --rm web bundle update`をした時にgem `Devise`から表示されました。
ログとしては下記のように表示されました。

```bash:terminal
HEADS UP! i18n 1.1 changed fallbacks to exclude default locale.
But that may break your application.

Please check your Rails app for 'config.i18n.fallbacks = true'.
If you're using I18n (>= 1.1.0) and Rails (< 5.2.2), this should be
'config.i18n.fallbacks = [I18n.default_locale]'.
If not, fallbacks will be broken in your app by I18n 1.1.x.

For more info see:
https://github.com/svenfuchs/i18n/releases/tag/v1.1.0
```

`If you're using I18n (>= 1.1.0) and Rails (< 5.2.2), this should be 'config.i18n.fallbacks = [I18n.default_locale]'.`でググると出てくる、下記の4つのリンクを読めば解決方法や詳細がわかります。
> - [bundle install(rails new)すると”HEADS UP! i18n 1.1 changed fallbacks to exclude default locale."と言われる - 真夜中エンジニアリング](http://midnight-engineering.hatenadiary.jp/entry/2019/01/02/181645)
- [HEADS UP! i18n 1.1 changed fallbacks to exclude default locale. But that may break your application. - Qiita](https://qiita.com/homhom_star/items/ac0fd3769f1d7f974fa4)
- [config.i18n.fallbacks の BREAKING CHANGE について | deadwood](https://www.d-wood.com/blog/2020/02/18_11789.html)
- [config.i18n.fallbacksのメッセージについて - Qiita](https://qiita.com/tsurugeek/items/e1292536aa8b67962490)


##### Ignoring bigdecimal-1.3.5 because its extensions are not built. Try: gem pristine bigdecimal --version 1.3.5
`docker-compose build --no-cache`を実行して`bundle install`を実行したときに表示されました。
`docker-compose run --rm web gem pristine --all`を実行すれば表示されなくなります。

##### The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
`bundle install`、`bundle update`時に表示される。
基本的にWindows以外の開発環境では必要ないと思われるので、
削除する or コメントアウトする という対処法で問題ないと思われます。
下記リンクに詳細が書いてあります。
> - [The dependency tzinfo-data〜 – Ruby on Rails 5 アプリケーションプログラミング読解物語](https://pcl.solima.net/ror5/archives/21)
- [bundle installする際のtzinfo-dataのwarningがウザい - Qiita](https://qiita.com/tatama/items/3f0f5e42cb5f75b53817)

##### Bundler attempted to update rails but its version stayed the same
Rubyが2.7.2、Railsが6.0.3.4の時に`bundle update rails`を実行しようとして表示された警告です。。
使っていたBundlerのバージョンが1.17.3と古く、バージョンアップしてくださいという警告です。
[[Ruby] bundler 2 へのアップグレード方法 | DevelopersIO](https://dev.classmethod.jp/articles/bundler_2_upgrade/)を参考に進めていきます。

```bash:terminal
$ docker-compose run --rm web bundle update --bundler
Creating app_for_job_change_web_run ... done
Using rake 13.0.3
Using concurrent-ruby 1.1.8
Using i18n 1.8.8
Using minitest 5.14.3
:
:
:
Warning: the lockfile is being updated to Bundler 2, after which you will be unable to return to Bundler 1.
```

上記のコマンドを使用して私の場合はBundlerのバージョンが 1.17.4 -> 2.1.4 に無事バージョンアップができました。

##### `DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1. To continue case sensitive comparison on the :name attribute in Foodcategory model, pass `case_sensitive: true` option explicitly to the uniqueness validator.`
Railsを 5.2系 から 6.0系 へバージョンアップしたときに表示されます。
解決法(?)は下記がわかりやすいです
> [Rails 6.0で"Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1."という警告が出たときの対処法 - Qiita](https://qiita.com/jnchito/items/e23b1facc72bd86234b6)

# エラー一覧
##### Your Ruby version is x.x.x, but your Gemfile specified y.y.y
GemfileにRubyのバージョンを明記している場合にエラーが発生します。
指定を修正してあげるだけでエラーが解消できます。

```diff_ruby:Gemfile
- ruby 'y.y.y'
+ ruby 'x.x.x
```

##### warning: already initialized constant Shoulda::Matchers::ActiveModel::ValidateInclusionOfMatcher::ARBITRARY_OUTSIDE_STRING
terminal上では下記のように表示されていました。
(Railsは5.1系のまま、)Rubyを2.6.6から2.7.2に上げた時にRSpecのテストで発生したエラーです。

```bash:terminal
Failure/Error: require File.expand_path('../config/environment', __dir__)

NoMethodError:
  undefined method `new' for BigDecimal:Class
# /usr/local/bundle/bundler/gems/shoulda-matchers-4b160bd19ecc/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb:273:in `<class:ValidateInclusionOfMatcher>'
```


私の場合はtest環境に追加されているgemの`shoulda-matchers`のオプション(?)を削除することで問題なく動作するようになりました(rails5系でもオプションを指定する必要がいつのまにかなくなっていました)。

```diff_ruby:Gemfile
- gem 'shoulda-matchers',
-     git: 'https://github.com/thoughtbot/shoulda-matchers.git',
-     branch: 'rails-5'
+ gem 'shoulda-matchers',
```


##### undefined method `operations' for #<ActionDispatch::MiddlewareStack
wrong number of arguments (given 3, expected 2) というパターンもありました。
(Railsは5.1系のまま)Rubyを2.7.2から3.0.0に上げた時にRSpecのテストで発生したエラーです。
原因はRubyとRailsの互換性にありました。
Ruby`3.0.0`に対応しているRailsのバージョンは`6.1.0`以上のようです。
Rubyを`2.7.2`に戻せばエラーは解消されます。

terminal上でのログは下記の通りです。

```bash:terminal
  docker-compose run --rm web rspec
Creating app_for_job_change_web_run ... done
/usr/local/bundle/gems/bundler-1.17.3/lib/bundler/shared_helpers.rb:29: warning: Pathname#untaint is deprecated and will be removed in Ruby 3.2.
/usr/local/bundle/gems/bundler-1.17.3/lib/bundler/shared_helpers.rb:118: warning: Pathname#untaint is deprecated and will be removed in Ruby 3.2.
/usr/local/bundle/gems/bundler-1.17.3/lib/bundler/shared_helpers.rb:118: warning: Pathname#untaint is deprecated and will be removed in Ruby 3.2.
/usr/local/bundle/gems/bundler-1.17.3/lib/bundler/shared_helpers.rb:35: warning: Pathname#untaint is deprecated and will be removed in Ruby 3.2.
/usr/local/bundle/gems/bundler-1.17.3/lib/bundler/shared_helpers.rb:35: warning: Pathname#untaint is deprecated and will be removed in Ruby 3.2.
/usr/local/bundle/gems/bundler-1.17.3/lib/bundler/shared_helpers.rb:44: warning: Pathname#untaint is deprecated and will be removed in Ruby 3.2.
/usr/local/bundle/gems/bundler-1.17.3/lib/bundler/shared_helpers.rb:118: warning: Pathname#untaint is deprecated and will be removed in Ruby 3.2.
/usr/local/bundle/gems/bundler-1.17.3/lib/bundler/shared_helpers.rb:35: warning: Pathname#untaint is deprecated and will be removed in Ruby 3.2.

An error occurred while loading ./spec/features/foodcategory_spec.rb.
Failure/Error: require File.expand_path('../config/environment', __dir__)

ArgumentError:
  wrong number of arguments (given 3, expected 2)
# /usr/local/bundle/gems/actionpack-5.1.7/lib/action_dispatch/middleware/static.rb:109:in `initialize'
# /usr/local/bundle/gems/actionpack-5.1.7/lib/action_dispatch/middleware/stack.rb:35:in `new'
# /usr/local/bundle/gems/actionpack-5.1.7/lib/action_dispatch/middleware/stack.rb:35:in `build'
# /usr/local/bundle/gems/actionpack-5.1.7/lib/action_dispatch/middleware/stack.rb:99:in `block in build'
# /usr/local/bundle/gems/actionpack-5.1.7/lib/action_dispatch/middleware/stack.rb:99:in `each'
# /usr/local/bundle/gems/actionpack-5.1.7/lib/action_dispatch/middleware/stack.rb:99:in `inject'
# /usr/local/bundle/gems/actionpack-5.1.7/lib/action_dispatch/middleware/stack.rb:99:in `build'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/engine.rb:508:in `block in app'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/engine.rb:504:in `synchronize'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/engine.rb:504:in `app'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/application/finisher.rb:45:in `block in <module:Finisher>'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/initializable.rb:30:in `instance_exec'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/initializable.rb:30:in `run'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/initializable.rb:59:in `block in run_initializers'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/initializable.rb:58:in `run_initializers'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/application.rb:353:in `initialize!'
# ./config/environment.rb:5:in `<top (required)>'
# ./spec/rails_helper.rb:3:in `<top (required)>'
# ./spec/features/foodcategory_spec.rb:1:in `<top (required)>'

An error occurred while loading ./spec/models/cuisine_spec.rb.
Failure/Error: require File.expand_path('../config/environment', __dir__)

NoMethodError:
  undefined method `operations' for #<ActionDispatch::MiddlewareStack:0x000055c6d7c7e388 @middlewares=[Rack::Sendfile, ActionDispatch::Static, ActionDispatch::Executor, ActiveSupport::Cache::Strategy::LocalCache::Middleware, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, ActionDispatch::RemoteIp, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::DebugExceptions, ActionDispatch::Callbacks, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, Rack::Head, Rack::ConditionalGet, Rack::ETag, Warden::Manager]>
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/configuration.rb:76:in `+'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/application.rb:525:in `build_middleware'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/engine.rb:507:in `block in app'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/engine.rb:504:in `synchronize'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/engine.rb:504:in `app'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/application/finisher.rb:45:in `block in <module:Finisher>'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/initializable.rb:30:in `instance_exec'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/initializable.rb:30:in `run'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/initializable.rb:59:in `block in run_initializers'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/initializable.rb:58:in `run_initializers'
# /usr/local/bundle/gems/railties-5.1.7/lib/rails/application.rb:353:in `initialize!'
# ./config/environment.rb:5:in `<top (required)>'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:292:in `require'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:292:in `block in require'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:258:in `load_dependency'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:292:in `require'
# ./spec/rails_helper.rb:3:in `<top (required)>'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:292:in `require'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:292:in `block in require'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:258:in `load_dependency'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:292:in `require'
# ./spec/models/cuisine_spec.rb:1:in `<top (required)>'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:286:in `load'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:286:in `block in load'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:258:in `load_dependency'
# /usr/local/bundle/gems/activesupport-5.1.7/lib/active_support/dependencies.rb:286:in `load'
```

##### /config/boot.rb:4:in `require': cannot load such file -- bootsnap/setup (LoadError)
Ruby2.7.2の状態でRailsを5.2.4.4にアップグレードしたあとの動作確認中に発生したエラー。
Rails5.2からbootsnapが導入されましたが、Gemfileに自動的にbootsnapが追記されず、自分で追記していなかったことが原因です。
Gemfileに下記のように追記することでエラーが解消しました。
導入されたことがわかるのは[RailsDiff](http://railsdiff.org/5.1.7/5.2.4.4)が、
bootsnapについては[bootsnapのせいでRails5.2とかが動かない人へ - Qiita](https://qiita.com/cyborg__ninja/items/d15b50500f4ffb069feb)
がわかりやすいです。

```ruby:Gemfile
gem 'bootsnap', '>= 1.1.0', require: false
```

##### Can't resolve image into URL: undefined method `to_model'
Ruby2.7.2の状態でRailsを5.2.4.4にアップグレードしたあとの動作確認中に発生したエラー。
画像アップロード用のgemとして`carrierwave`を使用しており、それに伴うエラーです。

そのままググると全く同じ状況のエラー解決法があったので([ruby on rails - Carrierwave: Can't resolve image into URL: undefined method `to_model' - Stack Overflow](https://stackoverflow.com/questions/53883893/carrierwave-cant-resolve-image-into-url-undefined-method-to-model))参考にしたところ解決しました。

ちなみにActiveStrageでも同じようなことが起こる場合があるみたいです([【Rails】ActiveStorageを用いた画像複数枚投稿のエラー - Qiita](https://qiita.com/zuu_aa/items/6ddd8da3a1e6b985f91b))


##### Migrations are pending. To resolve this issue, run: rails db:migrate RAILS_ENV=development

Ruby2.7.2のときに
Railsを 5.2.4.4から 6.0.3.4 にアップグレードした際に発生したエラーです。
このアップグレードにはどうやら標準で搭載されているActiveStrageに対してのDB設計の修正が行われており、
アップグレードした際にマイグレーションファイルが追加されています。
追加されたmigrationファイルをDBに反映させてあげればいいだけなので下記コマンドを実行することでエラーが解消されます。

```bash:terminal
docker-compose run --rm web rails db:migrate
```

### 最後に
Qiita初投稿のこの記事を書くのに何日費やしたのかわかりません(カウントしておけばよかった...)。
普段から引用して問題解決などしていますが、良記事を投稿している方の偉大さがとても身にしみました。




# 参考リンクなどなど
- [Ruby系のコマンドでits extensions are not built](https://blog.freedom-man.com/ruby-notbuilt-message)
- [個人開発アプリをDockerでコンテナ化してみた - アクトインディ開発者ブログ](https://tech.actindi.net/2020/01/05/174712?utm_source=feed)
- [永久保存版！？伊藤さん式・Railsアプリのアップグレード手順 - Qiita](https://qiita.com/jnchito/items/0ee47108972a0e302caf)
- [railsのバージョンを確認しただけなのにWarningがでた件 - helen's blog](https://helen.hatenablog.com/entry/2016/04/24/140820)
- [emsk/bundle_outdated_formatter: Formatter for `bundle outdated` command](https://github.com/emsk/bundle_outdated_formatter)
- [RubyGem のバージョンを決める時は Semantic Versioning に従おう - yu8mada](https://yu8mada.com/2018/04/28/let-s-follow-semantic-versioning-when-deciding-versions-of-a-rubygem/)
- [Ruby - Ruby on Railsがアップグレードされない｜teratail](https://teratail.com/questions/260262)
- [ダウンロード(Ruby公式)](https://www.ruby-lang.org/ja/downloads/)
- [ruby](https://hub.docker.com/_/ruby)



- [Rails アップグレードガイド - Railsガイド](https://railsguides.jp/upgrading_ruby_on_rails.html#ruby%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3)
- [Ruby 2.1.0 以降のセマンティックバージョニングについて](https://www.ruby-lang.org/ja/news/2013/12/21/ruby-version-policy-changes-with-2-1-0/)
- [セマンティック・バージョニングと、Gemfileのバージョン指定方法 - Gemfileでよく見る`~>`を使いこなす - Qiita](https://qiita.com/awakia/items/5745938c192ca1139c63)
- [bundle updateで特定のgemのみ更新する時に気をつけるべきポイント - 10nin blog](https://scrapbox.io/10nin/bundle_update%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AEgem%E3%81%AE%E3%81%BF%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%E6%99%82%E3%81%AB%E6%B0%97%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%B9%E3%81%8D%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88)
- [Gemの更新 | Bundler日本語ドキュメント | Ruby STUDIO](http://ruby.studio-kingdom.com/bundler/guides/updating_gems)