Rails + Capistranoでのデプロイの際にassets:precompileでのエラー解決法
株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。
RailsアプリケーションでCapistranoのデプロイ時だけ、アセットコンパイルでエラーが発生するという事象に陥りました。
その際のエラーの内容と対応方法を記載します。
環境
サーバー : AWS EC2
サーバーOS : Amazon Linux
Ruby on Rails : v6.1.4
Node.js : v14.15.0
Node.jsのバージョン管理ツール : nvm
サーバーにログインしてのassets:precompile(正常に動作する)
Node.js, yarnなどもインストールされており、サーバーにログインしてコンパイルをすると正常に動作することは確認しました。
bundle exec rails assets:precompile RAILS_ENV=production
Capistranoでのassets:precompile(エラーが発生する)
しかし、Capistranoでデプロイした際の、assets:precompileでは以下のようなエラーがでてしまいました。
bundle exec cap production deploy
出力されたエラーログは以下の通りです。
INFO [d71f7fa5] Running $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile as app@54.199.200.40
DEBUG [d71f7fa5] Command: cd /var/www/app/releases/20210805085352 && ( export RBENV_ROOT="$HOME/.rbenv" RBENV_VERSION="2.7.3" RAILS_ENV="production" RAILS_GROUPS="" ; $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile )
DEBUG [d71f7fa5] Yarn executable was not detected in the system.
DEBUG [d71f7fa5] Download Yarn at https://yarnpkg.com/en/docs/install
DEBUG [d71f7fa5] Yarn executable was not detected in the system.
DEBUG [d71f7fa5] Download Yarn at https://yarnpkg.com/en/docs/install
DEBUG [d71f7fa5] sh: node: コマンドが見つかりません
DEBUG [d71f7fa5] sh: nodejs: コマンドが見つかりません
DEBUG [d71f7fa5] Node.js not installed. Please download and install Node.js https://nodejs.org/en/download/
Exiting!
node: コマンドが見つかりません
と言われていたので、サーバーにログインして、node -v
を実行してNode.jsがインストールされているか確認しましたが、正常にインストールされていました。
$ node -v
v14.15.0
原因として考えたのは、サーバーにログインした際のコンパイル時には、Node.jsへのパスが正常に読み込まれていますが、Capistranoでのコンパイルの際には、Node.jsへのパスが読み込まれていないのだと考えました。
しかし、~.bash_profile
にsource ~/.nvm/nvm.sh
を記述して、nvmを読み込んでおり、これが正常に機能していたので、解決するのに時間がかかりました。
解決策
解決策としては、nvmのパスを~/.bashrc
で読み込むようにします。
~/.bashrc
に以下の記述を追加します。
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
これを記述することで、Capistranoでのデプロイ時でもコンパイルの際にNode.jsが読み込まれるようになり、正常に動作することを確認しました。
しかし、なぜ~/.bash_profile
でnvmへのパスの読み込みが反映されず、~/.bashrc
での読み込みは反映されるのかは原因不明です、、、。(どなたか知っていたら教えてください。)
Discussion