这真的是一种罕见的情况吗?我找不到任何地方的答案?无论如何。我在 DigitalOcean 上有一个 Ubuntu VM 服务器,并且我在这个服务器上运行 Jenkins 来构建、测试和本地部署 Web 应用程序(本质上是将 Web 应用程序目录复制到其他位置并重新启动运行它的 systemctl 服务)。
问题是 jenkins 在系统中生成的用户(顺便说一句,您无法使用该用户登录)不知何故弄乱了节点模块目录。它安装在 jenkins 主文件夹中/var/lib/jenkins/
,执行时npm install
(尽管没有-g
选项),而不是构建部署目录,并且应用程序内部的包解析无法解析安装在 jenkins 主文件夹中的模块(尽管由 jenkins 运行,因此由 jenkins 用户运行)。
我怀疑解决方案是允许以某种方式管理节点的安装,这样每个用户都可以安装和需要全局模块而无需使用sudo
,但到目前为止,我查找的每个解决方案(nvm、n-install、各种脚本)都是针对单个用户或 sudo 的。我真的无法对 jenkins(或任何其他程序生成的)用户做任何事情。那么在这种情况下最好的解决方案是什么?
答案1
从没有任何活动来看,这似乎确实是一个令人惊讶的罕见情况。无论如何,我现在的解决方案是将 node.js 安装包含到我的 Jenkinsfile 中的管道中,并使用sh
命令运行它。安装脚本如下所示:
#!/usr/bin/env bash
command_exists () {
command -v $1 >/dev/null 2>&1
}
if command_exists 'node' && command_exists 'npm'; then
echo 'Node installed, exiting'
exit 0
else
if [ -d $HOME/n ]; then
echo 'n-install directory exists, path likely not configured, exiting'
exit 0
fi
echo 'Node not installed, installing'
curl -L https://git.io/n-install | bash -s -- -y
echo 'Reloading bashrc'
. $HOME/.bashrc
if command_exists 'node' && command_exists 'npm'; then
echo 'Node installed successfully. Updating npm'
npm i -g npm
echo 'Node version:'
node -v
echo 'NPM version:'
npm -v
echo 'NPM prefix:'
npm config get prefix
exit 0
else
echo 'Node installation failed!'
exit 1
fi
fi
当然,这不是理想的,因为它实际上并没有安装 node.js 并让每个用户都可以使用,但每个用户都有私有的 npm 存储库,因此他们不需要 sudo 来安装或读取它们。因此,我必须单独确保 systemd 服务用于运行应用程序的用户也安装了 node.js,我必须手动执行此操作。
如果有人有更好的解决方案,请告诉我。如果没有更好的解决方案,我会将此标记为答案。