🌊

Rails + Capistranoでのデプロイの際にassets:precompileでのエラー解決法

2021/08/05に公開

株式会社TECH LUCKという会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら弊社HPからご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。

  • プロジェクトでRailsエンジニアが足りなくて困っている
  • Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
  • オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら弊社HPからご連絡いただけますと幸いです。

前提

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_profilesource ~/.nvm/nvm.shを記述して、nvmを読み込んでおり、これが正常に機能していたので、解決するのに時間がかかりました。

解決策

解決策としては、nvmのパスを~/.bashrcで読み込むようにします。
~/.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