【发布时间】:2018-01-31 07:04:46
【问题描述】:
TL;DR:工作应用程序,克隆它,克隆不能从 push hook 正确启动(但如果我 ssh 进入,手动工作正常。)PATH 添加了正确的节点版本,但在最后一个地方步骤,不正确的节点版本再次被添加到PATH。
这里的路径是正确的:
remote: PATH = /var/lib/openshift/.../app-root/data//node-v4.x.x-linux-x64/bin:/var/lib/openshift/.../app-root/runtime/repo/node_modules/.bin:/var/lib/openshift/...//.node_modules/.bin:/opt/rh/nodejs010/root/usr/bin:/bin:/usr/bin:/usr/sbin
然后不正确的紧接着,这里的某处:
remote: Starting NodeJS cartridge
remote: Tue Aug 22 2017 15:39:10 GMT-0400 (EDT): Starting application 'staging' ...
那么在这最后两行中或之前代表了哪些脚本和钩子?PATH 不只是为其自身添加行...
我有一个运行 NodeJS 版本 new enough to support fat arrow notation 的可用 OpenShift v2 应用程序。
它似乎是根据Custom node.js version on Openshift 设置的,因为来自该存储库的脚本(用于使用标记文件)存在于.openshift 中。
我在工作的基础上使用rhc create --from-app 设置了第二个,重置存储库,然后重新部署到它上面。第二个效果很好,除了启动node的最后一步:
remote: npm info ok
remote: NOTE: The .openshift/action_hooks/build hook is not executable, to make it executable:
remote: On Windows run: git update-index --chmod=+x .openshift/action_hooks/build
remote: On Linux/OSX run: chmod +x .openshift/action_hooks/build
remote: Preparing build for deployment
remote: Deployment id is cedf7f51
remote: Activating deployment
remote: NOTE: The .openshift/action_hooks/deploy hook is not executable, to make it executable:
remote: On Windows run: git update-index --chmod=+x .openshift/action_hooks/deploy
remote: On Linux/OSX run: chmod +x .openshift/action_hooks/deploy
remote:
remote: - pre_start_nodejs: Adding Node.js version 4.x.x binaries to path
remote: - PATH set to include custom node version (4.x.x) from
remote: /var/lib/openshift/.../app-root/data//node-v4.x.x-linux-x64/bin
remote: PATH = /var/lib/openshift/.../app-root/data//node-v4.x.x-linux-x64/bin:/var/lib/openshift/.../app-root/runtime/repo/node_modules/.bin:/var/lib/openshift/...//.node_modules/.bin:/opt/rh/nodejs010/root/usr/bin:/bin:/usr/bin:/usr/sbin
remote: Starting NodeJS cartridge
remote: Tue Aug 22 2017 15:39:10 GMT-0400 (EDT): Starting application 'staging' ...
remote: Waiting for application port (8080) become available ...
(到目前为止,除了名称之外,所有内容都与工作应用程序上的完全相同。)
remote: Application 'staging' failed to start (port 8080 not available)
remote: -------------------------
remote: Git Post-Receive Result: failure
remote: Activation status: failure
remote: Activation failed for the following gears:
remote: ... (Error activating gear: CLIENT_ERROR: Failed to execute: 'control start' for /var/lib/openshift/.../nodejs
remote: #<IO:0x00000001cd42d0>
remote: #<IO:0x00000001cd4258>
remote: )
remote: Deployment completed with status: failure
remote: postreceive failed
rhc env 和 rhc app show 显示设置在所有方面都是相同的。
我从其他问题中知道,上面的“8080 端口”部分是红鲱鱼。另外,如果我 rhc ssh 并手动 node www.js,它使用该端口就好了,我可以通过浏览器访问应用程序。
所以我使用rhc tail 进行了调查。由于粗箭头符号,我可以看到它无法重复启动:
pg.on('error', (err) => {
^
SyntaxError: Unexpected token >
at Module._compile (module.js:439:25)
at Object.Module._extensions..js (module.js:474:10)
...
DEBUG: Program node ./www.js exited with code 8
DEBUG: Starting child process with 'node ./www.js'
然而,如果我 rhc ssh 进入同一台服务器并运行 node --version,我会得到更新的版本(与另一台服务器相同的版本,它们都从我部署的 .openshift 目录中的标记文件中提取它.)
我猜测推送挂钩的最后一步是使用 Node 0.10,因为这就是这两个应用程序上的墨盒名称。但是,如果我检查添加到 PATH 的路径,实际上确实存在更新的 Node 版本。
然而,这就是事情变得有趣的地方。上面报告的PATH(前面加上 4.x.x)在 Node 启动时不再是路径。我将www.js 更改为只是吐出process.env.PATH 并比较了两者。后者在开头添加了这两条路径!
/opt/rh/nodejs010/root/usr/bin
/opt/rh/v8314/root/usr/bin
这是怎么回事,我该如何阻止它?在这些输出线中还有什么机会?
remote: PATH = /var/lib/openshift/.../app-root/data//node-v4.x.x-linux-x64/bin:/var/lib/openshift/.../app-root/runtime/repo/node_modules/.bin:/var/lib/openshift/...//.node_modules/.bin:/opt/rh/nodejs010/root/usr/bin:/bin:/usr/bin:/usr/sbin
remote: Starting NodeJS cartridge
remote: Tue Aug 22 2017 15:39:10 GMT-0400 (EDT): Starting application 'staging' ...
(为什么只是在我的第二个应用程序上,当我使用--from-app 创建它时,两者之间的所有其他设置似乎都相同?)
【问题讨论】:
-
我对大部分这项技术一无所知,但交互式 ssh 会话通常会解析更多的
~/.bashrc等。也许 PATH 只是在这种情况下设置? -
@o11c 谢谢,但是根据 OP,push hook 正确地按照它所说的去做,并将 4.x.x 节点 bin 目录添加到路径中。问题是原始节点 bin 目录随后被复制并添加到路径的开头。
标签: node.js git ssh openshift openshift-cartridge