タイトルの通りですが、cap production deployしたらnodeがincompatibleだと怒られてデプロイできないという現象が発生しました。
実行環境
- Rails 6.0.3.3
- capistrano 3.15.0
- rake 13.0.1
参考リンク
- Cannot deploy an application using Rails 5.1 Webpacker · Issue #25 · koenpunt/capistrano-nvm · GitHub
- NVM multiple user install on Ubuntu · Issue #18 · koenpunt/capistrano-nvm · GitHub
実際に表示されたメッセージ
00:08 deploy:assets:precompile
01 /home/yuta/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
01 yarn install v1.21.1
01 warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix pack…
01 [1/4] Resolving packages...
01 [2/4] Fetching packages...
(中略)
error browserslist@4.14.0: The engine "node" is incompatible with this module. Expected version "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7". Got "13.3.0"
error Found incompatible module.
(Backtrace restricted to imported tasks)
cap aborted!
(後略)
解決に至る流れ
デプロイ先の環境でバージョン確認してみると14.0.0でした。
$ node -v v14.0.0
エラーメッセージと合わないので、which -a nodeしてみたところ、nvmの他にsystemにもnodeがインストールされていました。
(ていうかここで確認するまでnvm使っていること自体忘れていた・・・)
$ which -a node /home/yuta/.nvm/versions/node/v14.0.0/bin/node /usr/bin/node
そこで/usr/bin/node -vしてみたところ
$ /usr/bin/node -v v13.3.0
案の定、デプロイ時はnvmを経由せずsystemの方のnodeを参照してしまっているようです。
多分/usr/bin/nodeはもう使わないので、アンインストールしておきました。
$ sudo rm -rf /usr/bin/node
さらに、どうもnvmを使う場合はcapistrano-nvmを入れた方が良さそうなのでGemfileに追加。
gem "capistrano-nvm", require: false
これによりconfig/deploy.rbにnvm関連の値が設定できるので、下記のように追記しました。
set :nvm_type, :user set :nvm_node, "v14.0.0" set :nvm_map_bins, %w{npm node yarn rake} # ここにrakeを入れるのがポイント
基本capistrano-nvmのreadmeにある例そのままですが、自分の場合はnvm_map_binsにrakeを含める必要がありました。
この状態でcap production deployしたところ、無事最後まで完了しました!
めでたしめでたし。