capistranoでデプロイしようとしたら"The engine "node" is incompatible with this module."と怒られて止まった
タイトルの通りですが、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
したところ、無事最後まで完了しました!
めでたしめでたし。