遅ればせながら、バージョンアップしました。(Rails除くGemや、packageもできるだけ最新に)
意外と手こずったので、メモしておきます。

Rubyアップデート

% rvm install 3.1.4
% rvm --default use 3.1.4
% ruby -v
ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [arm64-darwin22]

Gemfile

- ruby '3.0.0'
+ ruby '3.1.4'

.ruby-version

- ruby-3.0.0
+ ruby-3.1.4

Bundlerアップデート

railsコマンドで表示された下記エラーに対応する為だけど、
定期的にアップデートした方が良いですね。

Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)’ has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)’ instead.

% bundle -v
Bundler version 2.2.3

% bundle update --bundler

% bundle -v
Bundler version 2.4.14

Gemアップデート

既存アプリには直接関係なさそうだけど、アップデートしておく。
バージョンが揃うので、パス指定とか不要で便利。

% gem update --system
% gem update

Bundleアップデート(Gemfile)

Gemfileでバージョン縛りが多かったので、rails以外は外して試してみます。
問題があったら改めて使える最新バージョンで縛る。→私のでは問題なかった。
「~>」(1.2.3なら1.3.0未満まで)を「>=」(以上)に変更
【Rails】忘れがちなGemfileの書き方を総復習

また、エラー対応の為、Gemfileに下記を追加しました。

# NOTE: [ruby 3.0.0 -> 3.1.4] rails s -> Psych::BadAlias: Unknown alias: male_first_name
gem 'psych', '~> 3.1'

# NOTE: [ruby 3.0.0 -> 3.1.4] rspec -> LoadError: cannot load such file -- matrix, net/smtp
gem 'matrix'
gem 'net-smtp'

Psych::BadAlias: Unknown alias: defaultというエラーの対処法 – Qiita

% bundle update

※Gemfile.lockが更新される

Yarnアップグレード(package.json)

こちらもバージョン縛りが多かったので、
「^」(1.1.1なら2.0.0未満まで)を「>=」(以上)に変更
【いまさらですが】package.jsonのversion指定 – Qiita

% yarn upgrade

※yarn.lockが更新される

webpack-dev-serverがエラーになる

% bin/webpack-dev-server
The command moved into a separate package: @webpack-cli/serve
Would you like to install serve? (That will run yarn add -D @webpack-cli/serve) (yes/NO) :

noだと動かない。

@webpack-cli/serve needs to be installed in order to run the command.

yesだとエラーになる。

TypeError: Class constructor ServeCommand cannot be invoked without 'new'

% bin/webpack-dev-server
/Users/xxxx/workspace/rails-app-origin/node_modules/webpack-cli/bin/utils/prompt-command.js:46
	return func(...args);
	       ^

TypeError: Class constructor ServeCommand cannot be invoked without 'new'

yarn.lock確認すると、4.15.1は入っている。3系じゃないと動かないと。
webpacker-dev-serverでClass constructor ServeCommand cannot be invoked without ‘new’のエラーが出た時の対処法 – わくんきょ

package.json

-    "@webpack-cli/serve": "^2.0.5",
-    "webpack-dev-server": ">=3.11.2"
+    "webpack-dev-server": "^3.11.2"

追加されたwebpack-cli/serveを削除して、webpack-dev-serverのバージョン指定を戻しました。

% yarn install

RailsAdminバージョンアップ(使用している場合)

2系使っていると下記のWarningが表示される。

% rails s
[Warning] After upgrading RailsAdmin to 3.x you haven't set asset_source yet, using :sprockets as the default.
To suppress this message, run 'rails rails_admin:install' to setup the asset delivery method suitable to you.

記載通りのコマンドを実行してみる。

% rails rails_admin:install
    conflict  package.json
Overwrite /Users/xxxx/workspace/rails-app-origin/package.json? (enter "h" for help) [Ynaqdhm] 
       force  package.json

package.jsonに下記が追加されている。

    "rails_admin": "3.1.2",

  },
  "resolutions": {
    "rails_admin/@fortawesome/fontawesome-free": "^5.15.0"
% yarn install
% bin/webpack-dev-server
Deprecation Warning: Using / for division outside of calc() is deprecated and will be removed in Dart Sass 2.0.0.

Recommendation: math.div(20em, 16) or calc(20em / 16)

More info and automated migrator: https://sass-lang.com/d/slash-div

12 │ $fa-fw-width:          (20em / 16);
   │                         ^^^^^^^^^

6 │   font-size: (4em / 3);
  │               ^^^^^^^

7 │   line-height: (3em / 4);
  │                 ^^^^^^^

6 │   margin-left: $fa-li-width * 5/4;
  │                ^^^^^^^^^^^^^^^^^^

Warningが出るので、バージョンを上げてみる。

package.json

-    "rails_admin": "3.1.2",
+    "rails_admin": ">=3.1.2",
+    "rails_admin": "^3.1.2",

-    "rails_admin/@fortawesome/fontawesome-free": "^5.15.0"
+    "rails_admin/@fortawesome/fontawesome-free": ">=5.15.0"
% yarn install
% bin/webpack-dev-server

fontawesome-freeは6.4.0が入りWarningが出なくなりました。

追記:「rails webpacker:compile」(←「rails assets:precompile」←「cap production deploy」から呼ばれている)が失敗する。
Warningが消せないけど、fontawesome-freeのバージョンを戻す事で解消しました。

ERROR in ./app/javascript/stylesheets/rails_admin.scss
Module build failed (from ./node_modules/mini-css-extract-plugin/dist/loader.js):
ModuleBuildError: Module build failed (from ./node_modules/postcss-loader/src/index.js):
ParserError: Syntax Error at line: 1, column 30
at /home/railsapp/app/releases/20230627232708/app/javascript/stylesheets/rails_admin.scss:9:1271

序でにwebpackerも入れ直してみる

% rails webpacker:install
Overwrite /Users/xxxx/workspace/rails-app-origin/config/webpacker.yml? (enter "h" for help) [Ynaqdhm] y
Overwrite /Users/xxxx/workspace/rails-app-origin/config/webpack/environment.js? (enter "h" for help) [Ynaqdhm] y
Overwrite /Users/xxxx/workspace/rails-app-origin/babel.config.js? (enter "h" for help) [Ynaqdhm] y

config/webpack/environment.jsで読み込んでいるjQueryが消えるので、このファイルだけ戻す。

例によってバージョン固定をやめてみる。

package.json

-    "@rails/webpacker": "5.4.4",
+    "@rails/webpacker": ">=5.4.4",

-    "webpack": "^4.46.0",
+    "webpack": ">=4.46.0",
-    "webpack-cli": "^3.3.12"
+    "webpack-cli": ">=3.3.12"
% yarn install
% rails s
ActionController::RoutingError (No route matches [GET] "/packs/js/rails_admin-e4d6732cd04f5160f287.js"):

デザイン崩れやjsが動かない。

バージョン確認: yarn.lock
・@rails/webpacker: 5.4.4
・webpack: 5.88.0
・webpack-cli: 5.1.4

バージョン固定に戻して、解決。

package.json

-    "webpack": ">=4.46.0",
+    "webpack": "^4.46.0",
-    "webpack-cli": ">=3.3.12"
+    "webpack-cli": "^3.3.12"
% yarn install

Dockerアップデート

Docker Compose V2で変わったdocker-compose.ymlの書き方

docker-compose.yml → compose.yml

-    image: mysql:8.0 # https://hub.docker.com/_/mysql
+    image: mysql:8.0.33 # https://hub.docker.com/_/mysql

-    image: postgres:13.4-alpine # https://hub.docker.com/_/postgres
+    image: postgres:15.3-alpine # https://hub.docker.com/_/postgres

序でにDBのバージョンも変更しました。

Dockerfile

# https://hub.docker.com/_/ruby
- FROM ruby:3.0.0-alpine
+ FROM ruby:3.1.4-alpine

Rubyのバージョンが同じイメージに変更。

- RUN apk update && apk add --no-cache --update build-base tzdata bash yarn python2 imagemagick graphviz ttf-freefont
+ RUN apk update && apk add --no-cache --update build-base tzdata bash yarn python3 imagemagick graphviz ttf-freefont gcompat

python2 → python3

下記エラー対応の為、gcompatを追加しました。
[bug] v1.13.0 fails to load on ARM alpine linux · Issue #2414 · sparklemotion/nokogiri · GitHub

% docker compose up --build
rails-app-origin-web-1  | /usr/local/bundle/gems/bootsnap-1.16.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:17:in
 `require': cannot load such file -- nokogiri/nokogiri (LoadError)
rails-app-origin-web-1  | /usr/local/bundle/gems/nokogiri-1.15.2-aarch64-linux/lib/nokogiri/extension.rb:7:in
 `require_relative': Error loading shared library ld-linux-aarch64.so.1:
 No such file or directory (needed by /usr/local/bundle/gems/nokogiri-1.15.2-aarch64-linux/lib/nokogiri/3.1/nokogiri.so)
 - /usr/local/bundle/gems/nokogiri-1.15.2-aarch64-linux/lib/nokogiri/3.1/nokogiri.so (LoadError)

digital envelope routines::unsupported

Nodejsのバージョンを上げたら`error:0308010C:digital envelope routines::unsupported`が出てしまう – Qiita

ruby:3.1.4-alpineのNode.jsがv18で、OpenSSLのエラーになっている。

% docker compose exec web bash
# node -v
v18.16.0

Dockerfile

+ # NOTE: Error: error:0308010C:digital envelope routines::unsupported
+ ENV NODE_OPTIONS='--openssl-legacy-provider'

non-printable ASCII characters

% docker compose up --build
failed to solve: Internal: rpc error: code = Internal desc = rpc error: code = Internal desc = header key "exclude-patterns"
 contains value with non-printable ASCII characters

これ対象が見つけ難い。
私の場合、.dockerignoreに日本語のパスを指定していたのが原因でした。

序でにwebpackとjobのコンテナを作成

compose.yml

services:
  db:
<省略>
+    healthcheck:
+      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "mysql"]
+      interval: 5s # <- 30s
+      timeout: 10s # <- 30s
+      retries: 10 # <- 3
  pg:
<省略>
+    healthcheck:
+      test: ["CMD", "pg_isready", "-U", "postgres"]
+      interval: 5s # <- 30s
+      timeout: 10s # <- 30s
+      retries: 10 # <- 3

delayed_jobはDBに接続できる状態でないと起動できない為、
下記のservice_healthyで使用するチェックコマンドを定義する。

  web:
<省略>
-      - /workdir/public/packs
-      - /workdir/public/packs-test

webpack-dev-serverで作ったのと共有しないと、compileされてしまう為、削除

<省略>
+    environment:
+      WEBPACKER_DEV_SERVER_HOST: webpack
+  webpack:
+    build: .
+    command: bin/webpack-dev-server --host 0.0.0.0 --port 3035
+    volumes:
+      - .:/workdir
+      - /workdir/node_modules
+    ports:
+      - 3035:3035
+    environment:
+      WEBPACKER_DEV_SERVER_HOST: 0.0.0.0
+  job:
+    build: .
+    command: bundle exec rails jobs:work
+    volumes:
+      - .:/workdir
+      - /workdir/node_modules
+    depends_on:
+      db:
+        condition: service_healthy
+      pg:
+        condition: service_healthy

config/environments/development.rb

-  config.file_watcher = ActiveSupport::EventedFileUpdateChecker
+  config.file_watcher = ActiveSupport::FileUpdateChecker

最初、commandを「rails jobs:work」ではなく「bin/delayed_job start」にして、下記エラーが出たので変更しましたが、Dockerでコード修正が即反映されない問題もあるみたいなので、変更したままにしました。

Exception rescued in listen-run_thread: IOError: closed stream


今回のコミット内容
https://dev.azure.com/nightonly/rails-app-origin/_git/rails-app-origin/commit/6d1278f376fac48f6c0767aabfcd7d385d0d4bd7

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です