Как указать pm2 использовать определенную версию узла при развертывании

РЕДАКТИРОВАТЬ. После попытки просто установить puppeteer на мою машину с использованием старой версии узла (8.1.0) выдается та же ошибка. Поэтому проблема должна заключаться в том, что при подключении к машине загружается неправильная версия узла. Тогда возникает вопрос: как запустить хук после развертывания pm2, используя правильную версию node.js?

Я получаю очень странную ошибку при попытке развернуть мое веб-приложение с помощью pm2 deploy. Ошибка возникает во время перехвата post-install процесса развертывания pm2, когда yarn устанавливает различные пакеты на мою удаленную машину (Ubuntu 18.04).

Ошибка выглядит следующим образом:

....The rest of the yarn installation...

[4/4] Building fresh packages...    
error /home/harrison/gql3.0_processors/source/node_modules/puppeteer: Command failed.
Exit code: 1
Command: node install.js
Arguments:
Directory: /home/harrison/gql3.0_processors/source/node_modules/puppeteer
Output:
/home/harrison/gql3.0_processors/source/node_modules/puppeteer/install.js:175
            } catch {
                    ^

SyntaxError: Unexpected token {
    at createScript (vm.js:80:10)
    at Object.runInThisContext (vm.js:139:10)
    at Module._compile (module.js:616:28)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)    
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:188:16)
    at bootstrap_node.js:609:3
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

  post-deploy hook failed

Deploy failed

Это происходит из файла install.js в каталоге puppeteer моей папки node_modules, которая является зависимостью, которую я использую для своего проекта.

Я склонен думать, что это связано с какой-то ошибкой с моей версией узла, когда я устанавливаю приложение удаленно? Может ли кто-нибудь предложить некоторые рекомендации?

Мой файл развертывания pm2 выглядит следующим образом (для получения дополнительной информации перейдите сюда: https://pm2.keymetrics.io/docs/usage/application-declaration/)

require("dotenv").config({ path: `./envs/.env.production` });
const path = require("path");

let hosts = process.env.HOSTS.split(",");
let hostsBashArgs = process.env.HOSTS.replace(/,/g, " "); // Pass as args to bash script

module.exports = {
  apps: [
    {
      name: process.env.APP_NAME,
      args: ["--color"],
      interpreter: process.env.NODE_PATH, // Installation of node on my remote machine, it's ––> `/home/harrison/.nvm/versions/node/v13.7.0/bin/`
      cwd: path.resolve(process.env.PROJECT_PATH, "current"), // Where post-deploy runs
      script: "dist/index.js", // Webpacked server file
      instances: process.env.INSTANCES || 0,
      exec_mode: "cluster",
      env: {
        ...process.env,
      },
    },
  ],
  deploy: {
    production: {
      user: "harrison",
      host: hosts,
      key: "~/.ssh/id_rsa2",
      ref: "origin/master",
      repo: process.env.GIT_REPO,
      path: process.env.PROJECT_PATH,
      "pre-deploy-local": `./deployEnvs.sh ${process.env.PROJECT_PATH} ${hostsBashArgs}`,
      //// THIS IS THE STEP WHICH FAILS 
      "post-deploy": `yarn install --ignore-engines && \
       yarn prod:build && \
       yarn prod:serve`,
    },
  },
};

person Harrison Cramer    schedule 07.06.2020    source источник


Ответы (2)


По какой-то причине скрипт пост-развертывания pm2 не загружался в мой файл .zshrc, поэтому версия Node.js, которую он пытался использовать, была неверной. Я смог увидеть это на этапе после установки, выполнив команду printenv (которая показала, что переменная $PATH не включает мою версию nvm).

Таким образом, решение состояло в том, чтобы специально указать файл .zshrc (или файл .bashrc для пользователей, использующих bash) во время сценария post-deploy, например так:

  ... The rest of the ecosystem.config.js file ...
  deploy: {
  production: {
    user: "harrison",
    host: hosts,
    key: "~/.ssh/id_rsa",
    ref: "origin/master",
    repo: process.env.GIT_REPO,
    path: process.env.PROJECT_PATH,
    /// Source the user's .zshrc file first!!
    "post-deploy": `source ~/.zshrc && \ 
     yarn install --ignore-engines && \
     yarn prod:build && \
     yarn prod:serve`
    }
}

Это было необходимо, потому что мой файл .zshrc загружался в среде nvm (и настраивает загрузку более поздней версии узла). Эта версия узла — это то, на что полагается пряжа при запуске скрипта установки, поэтому устаревшая версия не работала.

person Harrison Cramer    schedule 08.06.2020

Чтобы обновить созданное приложение pm2 версией вашего узла, выполните следующие действия:

  1. использование nvm (версия). Пример использования nvm 14.17.0.
  2. NODE_ENV = перезапуск производственного pm2 nameOfYourApp --update-env
person lokesh    schedule 13.05.2021