【问题标题】:What is resetting the PATH variable at the last second during an OpenShift v2 push hook?什么是在 OpenShift v2 推送挂钩期间的最后一秒重置 PATH 变量?
【发布时间】: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 envrhc 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


【解决方案1】:

Node.js (Latest)墨盒

@hub.openshift : Node.js Latest

默认情况下,Node.js 版本是通过查询来确定的 semver.io/node/stable.

可以通过NODE_VERSION_URL 指定不同的 URL 环境变量或通过设置.openshift/NODE_VERSION_URL 标记 在您的应用程序存储库中。

例如,您将获得最新的 0.10.x 通过将其放入 NODE_VERSION_URL 变量或 .openshift/NODE_VERSION_URL 标记:

https://semver.io/node/resolve/0.10

如果您使用的是非默认 Node.js 版本并且您打算 跨多个齿轮扩展应用程序,您必须使用 环境变量(learn here why)


其他可能的方法

pre_build action hook 解决方法:

#!/bin/bash

#NODE_VERSION_URL
TARGET_NODE_VERSION=$(node -e "var p = require('$OPENSHIFT_REPO_DIR/package.json')||{engines:{}}; console.log(encodeURI(p.engines.node||''));")
echo "https://semver.io/node/resolve/$TARGET_NODE_VERSION" > ${HOME}.env/user_vars/NODE_VERSION_URL

#NPM_VERSION_URL
TARGET_VERSION=$(node -e "var p = require('$OPENSHIFT_REPO_DIR/package.json')||{engines:{}}; console.log(encodeURI(p.engines.npm||''));")
echo "https://semver.io/npm/resolve/$TARGET_VERSION" > ${HOME}.env/user_vars/NPM_VERSION_URL

package.json engines 解决方法:

this repo 添加the .openshift folder 将允许您使用package.json 文件(see the README for usage) 的引擎部分运行所需的任何版本的nodejs:

"engines": {
    "node": ">= 0.12.0"
 },

【讨论】:

  • 抱歉,我不想运行最新的 Node.js。我有一个特定版本在已经工作的rhc app 中运行,我想在我的另一个rhc app 中类似地工作。所以只有你的最后一个建议适用,在这种情况下,回购是我链接到的问题中提到的那个(stackoverflow.com/questions/27954712/…),这已经是两个应用程序的设置方式——我想保留它那样。问题归结为PATH 在推送钩子的最后一刻被错误地覆盖,这就是我需要帮助的地方。
  • (我不准备更换磁带的原因是,如果在这个相对简单的克隆操作中事情变得如此意外,我不想对已经运行的应用程序进行更大的更改.)
  • (另外,当前的设置几乎可以工作——安装了正确的Node版本,并添加到路径中。只是原来的Node版本是re 在那之后立即添加到路径中。)
  • 所以我给你3个解决方案/方法来测试,感觉你根本没读过……(没有一个强迫你使用最新的nodejs版本,一切都是为了你定义什么版本......)哦,好吧,对不起,他们都没有“适合你的最低难度级别”。也许他们会帮助别人。
  • 对不起,我很欣赏你的回答尝试,但相反,我的印象是你没有阅读整个 OP/标题。我需要有关 PATH 问题的帮助,因为这就是它归结为的原因。您的第三个解决方案是我已经在使用的仓库(不同的分支),所以我显然已经意识到了。您的另外两个实际上是同一解决方案的两个部分,它是一个涉及安装不同 nodejs 墨盒的解决方案。如果我首先设置它会很好,但从 OP 中可以清楚地看出,我希望第二个克隆的应用程序与第一个应用程序一样工作。谢谢你
【解决方案2】:

在最初在应用程序中用于自定义其 NodeJS 版本的 129 个 repo 分支之一中,有 a comment on an issue 解决了它:

.openshift\lib\utils添加一行:

#  Add the node binary path to the PATH.
export OPENSHIFT_NODEJS_VERSION=0.6 ### this is the new line
export PATH="$node_bin_path:${PATH}"

“重要的是,就像你提到的那样,它设置为 0.6,即使你没有运行 0.6。”

将其设置为 0.6 也很重要,即使您要恢复到的原始 Node 版本也不是 0.6。 (我尝试了 0.10,但没有运气。0.6 是神奇的答案,在这里。)

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 2019-11-14
    相关资源
    最近更新 更多