遅ればせながら、バージョンアップしました。(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