使用 Jenkins 时永远无法启动

Posted

技术标签:

【中文标题】使用 Jenkins 时永远无法启动【英文标题】:Forever not starting when using Jenkins 【发布时间】:2014-06-05 21:30:24 【问题描述】:

所以我有一个 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 文件的路径,为什么永远对文件所在的位置敏感。

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

【问题讨论】:

【参考方案1】:

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

据我所知,这不是"forever [being] sensitive to where the file is located" 的问题,而是您的nodejs 脚本app.js 对它的启动位置很敏感。 Forever 中的示例使用带有目录的路径没有问题。尝试从不正确的目录启动不带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,这表明它是一个开放的错误。

编辑: 为避免修改 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

粗体更改的部分)

【讨论】:

在不修改 nodejs 脚本的情况下添加了解决方法 效果很好。也许你可以永远修复它? github.com/nodejitsu/forever/issues/521 我很乐意...但我对nodejs一无所知,除了它是“在服务器上执行的javascript”。很高兴解决方法对您有所帮助。

以上是关于使用 Jenkins 时永远无法启动的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins 无法在 macOS 10.12 (Sierra) 上启动

在 Jenkins Docker 代理中使用测试容器:容器无法启动,NoRouteToHostException

启动jenkins后无法访问,如何排错

jenkins启动后无法连接网络解决方法

Discord.js 无法永远在服务器上使用 process.env 启动机器人,但它可以通过 Visual Studio 在我的本地驱动器上正常工作

jenkins 升级后无法启动