node.js - 使用 Jenkins 时永远无法启动

标签 node.js unix jenkins forever

所以我有一个 Jenkins 构建,它使用以下命令调用永久启动。

sudo NODE_ENV=development forever start -a -l /var/nodejs/app/logs/forever.log -o /var/nodejs/app/logs/output.log -e /var/nodejs/app/logs/error.log /var/nodejs/app/app.js 

此命令引发以下错误。

running on the development server

fs.js:427
  return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
                 ^
Error: ENOENT, no such file or directory 'ssl/gd_bundle.crt'
    at Object.fs.openSync (fs.js:427:18)
    at Object.fs.readFileSync (fs.js:284:15)
    at Object.<anonymous> (/var/nodejs/app/app.js:190:10)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:902:3
error: Forever detected script exited with code: 8

当我从服务器上的命令行运行它时,我会遇到相同的错误,但前提是我不在包含 app.js 文件的目录中。如果我指定 app.js 文件的路径,为什么永远对文件所在的位置敏感。

我还发现forever不尊重-p标志或forever配置目录。有什么想法吗?

最佳答案

这与 Jenkins 没有任何关系,正如您所说,您从命令行收到相同的错误。

据我所知,这不是“永远[对文件所在位置敏感””的问题,而是您的nodejs脚本app.js的问题对它的启动位置敏感。来自 Forever 的示例 使用带有目录的路径没有问题。尝试从不正确的目录永远启动脚本,您将观察到相同的问题。

在脚本代码中的某个位置,您在确定 ssl/gd_bundle.crt 的位置时依赖于当前工作目录。 没有看到你的代码源,我只能猜测和指责。

  • 如果您的 ssl/gd_bundle.crt 位置与脚本位置相关,则如本答案所示: How do I get the path to the current script with Node.js? ,您应该使用__dirname来获取脚本的目录位置,无论当前工作目录如何,该位置都是相同的。

  • 如果 ssl/gd_bundle.crt 的位置在文件系统上是固定的,则应使用以 / 开头的绝对路径以确保它独立于当前工作目录。

至于被忽略的-p,快速谷歌搜索会发现: forever -p /var/run/forever is ignored 这表明这是一个 Unresolved 错误。

编辑:
为了避免修改 nodejs 脚本(如果它不是您的文件),您只需在执行 Node 命令之前更改到正确的当前目录即可。适用于 Jenkins 以及命令行:

cd /var/nodejs/app && sudo NODE_ENV=development forever start -a -l logs/forever.log -o logs/output.log -e logs/error.log app.js

(粗体更改的部分)

关于node.js - 使用 Jenkins 时永远无法启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23203807/

相关文章:

javascript - 从 javascript 访问 jenkins 远程 api,无需 JSONP

node.js - Mongoose 时间戳返回错误的日期

node.js - 在前台启动 redis 并使用一个命令并行但串行地启动 Node 服务器

r - 在 R 中解析 SVG 路径

c - 了解 C 中的 fork

linux - 在Linux CLI中按位置替换特定行上的特定字符

python - 如何列出所有未使用的 Jenkins 插件?

git - Jenkins - 一个版本有多少 CI/CD 管道?

javascript - 如何在 Node sequelize.js 中的 FROM SQL 中执行子查询

node.js - 在 socket.io-client Reactjs 中多次发出相同的事件