如何告诉 pm2 在部署时使用特定的节点版本



>EDIT -- 在尝试使用旧版本的节点(8.1.0(在我的机器上安装木偶师后,它抛出了同样的错误。因此,问题一定是连接到计算机时,它没有以正确的节点版本加载。那么问题来了,如何使用正确的节点.js版本运行 pm2 部署后钩子?

尝试使用部署部署pm2我的网络抓取应用程序时,我遇到了一个非常奇怪的错误。错误出现在pm2部署过程的post-install钩子期间,即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

这来自我的node_modules文件夹的puppeteer目录中的install.js文件,这是我用于项目的依赖项。

我倾向于认为这是由于远程安装应用程序时我的节点版本出现某种错误?任何人都可以提供一些指导吗?

我的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`,
},
},
};

无论出于何种原因,pm2部署后脚本都没有加载到我的.zshrc文件中,因此它尝试使用的 Node.js 版本不正确。在安装后阶段,我能够看到这一点,运行printenv命令(显示$PATH变量不包括我的nvm版本(。

因此,解决方案是在post-deploy脚本期间专门获取.zshrc文件(或使用 bash 的用户.bashrc文件(,如下所示:

... 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 环境中加载的(并设置了我对更高版本的节点的加载(。该节点版本是 yarn 在运行安装脚本时所依赖的版本,这就是过时版本失败的原因。

要使用节点版本更新创建的pm2应用程序,请按照以下步骤操作:

  1. NVM 使用(版本(。 示例 nvm 使用 14.17.0。
  2. NODE_ENV=生产 pm2 重新启动名称您的应用程序 --update-env

最新更新