capistrano、远程 shell/nodejs/yarn 不起作用

chm*_*ich 2 capistrano ruby-on-rails node.js

有问题:Yarn requires Node.js 4.0 or higher to be installed

\n

通过 ssh 进入远程服务器,我有:

\n
passwords@meet:/srv/passwords$ yarn -v\n1.22.5\npasswords@meet:/srv/passwords$ node -v\nv16.9.1\npasswords@meet:/srv/passwords$\n
Run Code Online (Sandbox Code Playgroud)\n

Node是由nvm安装的。另外,我让节点使用 16.9.1,这没有改变任何东西。通过 ssh(登录外壳)它工作正常。

\n

宝石文件:

\n
group :development, :deploy do\n  gem 'capistrano', '~> 3.14', require: false\n  gem 'capistrano-faster-assets'\n  gem 'capistrano-passenger'\n  gem 'capistrano-rails', '~> 1.6', require: false\n  gem 'capistrano-rake', require: false\n  gem 'capistrano-rvm'\n  gem 'capistrano-resque', require: false\nend\n
Run Code Online (Sandbox Code Playgroud)\n

错误

\n

rake stderr:Yarn 需要安装 Node.js 4.0 或更高版本

\n

我做了什么

\n

我添加到deploy/staging.rb

\n
task :debugs do\n  on roles(:app), in: :parallel do |server|\n    on "passwords@#{server.hostname}" do\n      #execute :node, '-v'\n      execute :echo, '$PATH'\n      execute :pwd\n    end\n  end\nend\nbefore :deploy, :debugs\n
Run Code Online (Sandbox Code Playgroud)\n

因此,从这里开始,在部署时,它不会打印出与我在 ssh 上看到的相同的 PATH,并且缺少该部分,该部分将指向我的 nvm-node 二进制文件。但是,通过 pwd,我发现它可以在远程服务器主目录上运行。

\n

那么,capistrano 如何在远程 shell 上工作?\n它似乎没有执行.bashrc将 nvm / node-bin 部分导出到 PATH 的命令

\n

我需要配置什么吗?

\n

下面是输出cap staging deploy

\n

谢谢!\n克里斯

\n
MacBook: ~/projects-priv/passwords.rails$ cap staging deploy\nrvm 1.29.12-next (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]\nruby-2.7.2\nruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux]\n00:00 debugs\n      01 echo $PATH\n      01 /usr/local/bin:/usr/bin:/bin:/usr/games\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 0.245s\n      02 pwd\n      02 /home/passwords\n    \xe2\x9c\x94 02 passwords@sedlmair.ch 0.239s\n00:00 git:wrapper\n      01 mkdir -p /tmp\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 0.228s\n      Uploading /tmp/git-ssh-d21e8dbb787dbfd49298.sh 100.0%\n      02 chmod 700 /tmp/git-ssh-d21e8dbb787dbfd49298.sh\n    \xe2\x9c\x94 02 passwords@sedlmair.ch 0.242s\n00:01 git:check\n      01 git ls-remote repo-get@sedlmair.ch:/repos/sedl/passwords.git HEAD\n      01 8cf4b5d57543eccf3737cd670519a9deac5592b8   HEAD\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 0.546s\n00:02 deploy:check:directories\n      01 mkdir -p /srv/passwords-staging/shared /srv/passwords-staging/releases\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 0.199s\n00:02 deploy:check:linked_dirs\n      01 mkdir -p /srv/passwords-staging/shared/log /srv/passwords-staging/shared/backup /srv/passwords-staging/shared/tmp/pids /srv/passwords-staging/shared/tmp/cache /srv/passwords-staging/shared/tm\xe2\x80\xa6\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 0.232s\n00:02 deploy:check:make_linked_dirs\n      01 mkdir -p /srv/passwords-staging/shared/config /srv/passwords-staging/shared/config/credentials\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 0.230s\n00:04 git:clone\n      The repository mirror is at /srv/passwords-staging/repo\n00:04 git:update\n      01 git remote set-url origin repo-get@sedlmair.ch:/repos/sedl/passwords.git\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 0.237s\n      02 git remote update --prune\n      02 Fetching origin\n      02 From sedlmair.ch:/repos/sedl/passwords\n      02    7713138..8cf4b5d  master     -> master\n    \xe2\x9c\x94 02 passwords@sedlmair.ch 0.589s\n00:05 git:create_release\n      01 mkdir -p /srv/passwords-staging/releases/20210917211320\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 0.251s\n      02 git archive master | /usr/bin/env tar -x -f - -C /srv/passwords-staging/releases/20210917211320\n    \xe2\x9c\x94 02 passwords@sedlmair.ch 0.263s\n00:06 deploy:set_current_revision\n      01 echo "8cf4b5d57543eccf3737cd670519a9deac5592b8" > REVISION\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 0.229s\n00:06 deploy:symlink:linked_files\n      01 mkdir -p /srv/passwords-staging/releases/20210917211320/config /srv/passwords-staging/releases/20210917211320/config/credentials\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 0.232s\n      02 rm /srv/passwords-staging/releases/20210917211320/config/database.yml\n    \xe2\x9c\x94 02 passwords@sedlmair.ch 0.231s\n      03 ln -s /srv/passwords-staging/shared/config/database.yml /srv/passwords-staging/releases/20210917211320/config/database.yml\n    \xe2\x9c\x94 03 passwords@sedlmair.ch 0.229s\n      04 ln -s /srv/passwords-staging/shared/config/secrets.yml /srv/passwords-staging/releases/20210917211320/config/secrets.yml\n    \xe2\x9c\x94 04 passwords@sedlmair.ch 0.233s\n      05 ln -s /srv/passwords-staging/shared/config/master.key /srv/passwords-staging/releases/20210917211320/config/master.key\n    \xe2\x9c\x94 05 passwords@sedlmair.ch 0.234s\n      06 ln -s /srv/passwords-staging/shared/config/credentials/staging.key /srv/passwords-staging/releases/20210917211320/config/credentials/staging.key\n    \xe2\x9c\x94 06 passwords@sedlmair.ch 0.233s\n00:10 deploy:symlink:linked_dirs\n      01 mkdir -p /srv/passwords-staging/releases/20210917211320 /srv/passwords-staging/releases/20210917211320/tmp /srv/passwords-staging/releases/20210917211320/public\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 0.236s\n      02 rm -rf /srv/passwords-staging/releases/20210917211320/log\n    \xe2\x9c\x94 02 passwords@sedlmair.ch 0.232s\n      03 ln -s /srv/passwords-staging/shared/log /srv/passwords-staging/releases/20210917211320/log\n    \xe2\x9c\x94 03 passwords@sedlmair.ch 0.233s\n      04 ln -s /srv/passwords-staging/shared/backup /srv/passwords-staging/releases/20210917211320/backup\n    \xe2\x9c\x94 04 passwords@sedlmair.ch 0.235s\n      05 rm -rf /srv/passwords-staging/releases/20210917211320/tmp/pids\n    \xe2\x9c\x94 05 passwords@sedlmair.ch 0.230s\n      06 ln -s /srv/passwords-staging/shared/tmp/pids /srv/passwords-staging/releases/20210917211320/tmp/pids\n    \xe2\x9c\x94 06 passwords@sedlmair.ch 0.234s\n      07 ln -s /srv/passwords-staging/shared/tmp/cache /srv/passwords-staging/releases/20210917211320/tmp/cache\n    \xe2\x9c\x94 07 passwords@sedlmair.ch 0.227s\n      08 ln -s /srv/passwords-staging/shared/tmp/sockets /srv/passwords-staging/releases/20210917211320/tmp/sockets\n    \xe2\x9c\x94 08 passwords@sedlmair.ch 0.230s\n      09 ln -s /srv/passwords-staging/shared/public/uploads /srv/passwords-staging/releases/20210917211320/public/uploads\n    \xe2\x9c\x94 09 passwords@sedlmair.ch 0.232s\n      10 ln -s /srv/passwords-staging/shared/public/packs /srv/passwords-staging/releases/20210917211320/public/packs\n    \xe2\x9c\x94 10 passwords@sedlmair.ch 0.232s\n      11 ln -s /srv/passwords-staging/shared/public/assets /srv/passwords-staging/releases/20210917211320/public/assets\n    \xe2\x9c\x94 11 passwords@sedlmair.ch 0.234s\n00:16 bundler:config\n      01 ~/.rvm/bin/rvm 2.7.2 do bundle config --local deployment true\n    \xe2\x9c\x94 01 passwords@sedlmair.ch 1.017s\n      02 ~/.rvm/bin/rvm 2.7.2 do bundle config --local path /srv/passwords-staging/shared/bundle\n    \xe2\x9c\x94 02 passwords@sedlmair.ch 1.074s\n      03 ~/.rvm/bin/rvm 2.7.2 do bundle config --local without development\\ test\n    \xe2\x9c\x94 03 passwords@sedlmair.ch 1.017s\n00:21 bundler:install\n      The Gemfile's dependencies are satisfied, skipping installation\n00:21 deploy:assets:precompile\n      01 ls /srv/passwords-staging/releases/20210917211125/assets_manifest_backup\n      01 ls: cannot access '/srv/passwords-staging/releases/20210917211125/assets_manifest_backup': No such file or directory\n      02 ~/.rvm/bin/rvm 2.7.2 do bundle exec rake assets:precompile\n      02 Yarn requires Node.js 4.0 or higher to be installed.\n#<Thread:0x00007ff22d193e40 /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/runners/parallel.rb:10 run> terminated with exception (report_on_exception is true):\nTraceback (most recent call last):\n    13: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute'\n    12: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:31:in `run'\n    11: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:31:in `instance_exec'\n    10: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/capistrano-faster-assets-1.1.0/lib/capistrano/tasks/faster_assets.rake:17:in `block (4 levels) in <top (required)>'\n     9: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:92:in `within'\n     8: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/capistrano-faster-assets-1.1.0/lib/capistrano/tasks/faster_assets.rake:18:in `block (5 levels) in <top (required)>'\n     7: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:100:in `with'\n     6: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/capistrano-faster-assets-1.1.0/lib/capistrano/tasks/faster_assets.rake:29:in `block (6 levels) in <top (required)>'\n     5: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:80:in `execute'\n     4: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:148:in `create_command_and_execute'\n     3: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:148:in `tap'\n     2: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:148:in `block in create_command_and_execute'\n     1: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/netssh.rb:170:in `execute_command'\n/Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/command.rb:97:in `exit_status=': ls exit status: 2 (SSHKit::Command::Failed)\nls stdout: Nothing written\nls stderr: ls: cannot access '/srv/passwords-staging/releases/20210917211125/assets_manifest_backup': No such file or directory\n    8: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute'\n    7: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:31:in `run'\n    6: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:31:in `instance_exec'\n    5: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/capistrano-faster-assets-1.1.0/lib/capistrano/tasks/faster_assets.rake:17:in `block (4 levels) in <top (required)>'\n    4: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:92:in `within'\n    3: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/capistrano-faster-assets-1.1.0/lib/capistrano/tasks/faster_assets.rake:18:in `block (5 levels) in <top (required)>'\n    2: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:100:in `with'\n    1: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/capistrano-faster-assets-1.1.0/lib/capistrano/tasks/faster_assets.rake:29:in `block (6 levels) in <top (required)>'\n/Users/dev/.rvm/gems/ruby-2.7.2/gems/capistrano-faster-assets-1.1.0/lib/capistrano/tasks/faster_assets.rake:29:in `rescue in block (6 levels) in <top (required)>': PrecompileRequired (PrecompileRequired)\n    14: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/runners/parallel.rb:12:in `block (2 levels) in execute'\n    13: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:31:in `run'\n    12: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:31:in `instance_exec'\n    11: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/capistrano-faster-assets-1.1.0/lib/capistrano/tasks/faster_assets.rake:17:in `block (4 levels) in <top (required)>'\n    10: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:92:in `within'\n     9: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/capistrano-faster-assets-1.1.0/lib/capistrano/tasks/faster_assets.rake:18:in `block (5 levels) in <top (required)>'\n     8: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:100:in `with'\n     7: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/capistrano-faster-assets-1.1.0/lib/capistrano/tasks/faster_assets.rake:19:in `block (6 levels) in <top (required)>'\n     6: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/capistrano-faster-assets-1.1.0/lib/capistrano/tasks/faster_assets.rake:68:in `rescue in block (6 levels) in <top (required)>'\n     5: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:80:in `execute'\n     4: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:148:in `create_command_and_execute'\n     3: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:148:in `tap'\n     2: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/abstract.rb:148:in `block in create_command_and_execute'\n     1: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/backends/netssh.rb:170:in `execute_command'\n/Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/command.rb:97:in `exit_status=': rake exit status: 1 (SSHKit::Command::Failed)\nrake stdout: Nothing written\nrake stderr: Yarn requires Node.js 4.0 or higher to be installed.\n    1: from /Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/runners/parallel.rb:11:in `block (2 levels) in execute'\n/Users/dev/.rvm/gems/ruby-2.7.2/gems/sshkit-1.21.2/lib/sshkit/runners/parallel.rb:15:in `rescue in block (2 levels) in execute': Exception while executing as passwords@sedlmair.ch: rake exit status: 1 (SSHKit::Runner::ExecuteError)\nrake stdout: Nothing written\nrake stderr: Yarn requires Node.js 4.0 or higher to be installed.\n(Backtrace restricted to imported tasks)\ncap aborted!\nSSHKit::Runner::ExecuteError: Exception while executing as passwords@sedlmair.ch: rake exit status: 1\nrake stdout: Nothing written\nrake stderr: Yarn requires Node.js 4.0 or higher to be installed.\n\n\nCaused by:\nSSHKit::Command::Failed: rake exit status: 1\nrake stdout: Nothing written\nrake stderr: Yarn requires Node.js 4.0 or higher to be installed.\n\n\nCaused by:\nPrecompileRequired: PrecompileRequired\n\n\nCaused by:\nSSHKit::Command::Failed: ls exit status: 2\nls stdout: Nothing written\nls stderr: ls: cannot access '/srv/passwords-staging/releases/20210917211125/assets_manifest_backup': No such file or directory\n\nTasks: TOP => deploy:assets:precompile\n(See full trace by running task with --trace)\nThe deploy has failed with an error: Exception while executing as passwords@sedlmair.ch: rake exit status: 1\nrake stdout: Nothing written\nrake stderr: Yarn requires Node.js 4.0 or higher to be installed.\n\n\n** DEPLOY FAILED\n** Refer to log/capistrano.log for details. Here are the last 20 lines:\n\n\n DEBUG [5db32273] Running ~/.rvm/bin/rvm 2.7.2 do bundle check as passwords@sedlmair.ch\n\n DEBUG [5db32273] Command: cd /srv/passwords-staging/releases/20210917211320 && ~/.rvm/bin/rvm 2.7.2 do bundle check\n\n DEBUG [5db32273]   The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.\n\n DEBUG [5db32273]   The Gemfile's dependencies are satisfied\n\n DEBUG [5db32273] Finished in 1.177 seconds with exit status 0 (successful).\n\n  INFO The Gemfile's dependencies are satisfied, skipping installation\n\n DEBUG [01c835ec] Running if test ! -d /srv/passwords-staging/releases/20210917211320; then echo "Directory does not exist '/srv/passwords-staging/releases/20210917211320'" 1>&2; false; fi as passwords@sedlmair.ch\n\n DEBUG [01c835ec] Command: if test ! -d /srv/passwords-staging/releases/20210917211320; then echo "Directory does not exist '/srv/passwords-staging/releases/20210917211320'" 1>&2; false; fi\n\n DEBUG [01c835ec] Finished in 0.225 seconds with exit status 0 (successful).\n\n DEBUG [17c736a8] Running /usr/bin/env ls -xr /srv/passwords-staging/releases as passwords@sedlmair.ch\n\n DEBUG [17c736a8] Command: cd /srv/passwords-staging/releases/20210917211320 && ( export RAILS_ENV="staging" ; /usr/bin/env ls -xr /srv/passwords-staging/releases )\n\n DEBUG [17c736a8]   20210917211320  20210917211125  20210917124038  20210917123113  20210917123012\n\n20210917122443  20210917115628  20210917115208  20210917114621\n\n DEBUG [17c736a8] Finished in 0.239 seconds with exit status 0 (successful).\n\n  INFO [e1420513] Running /usr/bin/env ls /srv/passwords-staging/releases/20210917211125/assets_manifest_backup as passwords@sedlmair.ch\n\n DEBUG [e1420513] Command: cd /srv/passwords-staging/releases/20210917211320 && ( export RAILS_ENV="staging" ; /usr/bin/env ls /srv/passwords-staging/releases/20210917211125/assets_manifest_backup )\n\n DEBUG [e1420513]   ls: cannot access '/srv/passwords-staging/releases/20210917211125/assets_manifest_backup': No such file or directory\n\n  INFO [02b44f15] Running ~/.rvm/bin/rvm 2.7.2 do bundle exec rake assets:precompile as passwords@sedlmair.ch\n\n DEBUG [02b44f15] Command: cd /srv/passwords-staging/releases/20210917211320 && ( export RAILS_ENV="staging" ; ~/.rvm/bin/rvm 2.7.2 do bundle exec rake assets:precompile )\n\n DEBUG [02b44f15]   Yarn requires Node.js 4.0 or higher to be installed.\n\nMacBook: ~/projects-priv/passwords.rails$ \n
Run Code Online (Sandbox Code Playgroud)\n

chm*_*ich 8

找到了解决办法

它在这张票中,来自 Delameko 的回答

在 中.bashrc,我将导出 PATH 的 nvm 部分移动到顶部,位于如果不是交互式 shell 则返回的部分之上

现在纱线可以工作了。

# load nvm always
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
#export PATH="$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH"
export PATH="$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH"


# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
Run Code Online (Sandbox Code Playgroud)