Что перезагружает переменную PATH в последнюю секунду во время нажатия на OpenShift v2?
TL; DR: Рабочее приложение, клонированное, клон не запускается правильно из push hook (но работает отлично вручную, если я ssh in.) PATH
имеет правильную версию Node, добавленную к ней, но где-то прямо в на последнем шаге неверная версия Node добавляется к 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
не просто добавляет строки к себе...
У меня есть работающее приложение OpenShift v2 с версией NodeJS которое будет достаточно новым, чтобы поддерживать обозначение стрелки в массе.
Похоже, что он настроен на Пользовательскую node.js версию на Openshift, потому что скрипты из этого репо (для использования файла маркера) присутствуют в .openshift
.
Я установил второй, используя rhc create --from-app
на основе рабочего, reset репо, а затем повторно развернутый на нем. Второй работал отлично, за исключением последнего шага запуска 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
, который я развернул.)
Я предполагаю, что каким-то образом последний шаг в push-крюке использует 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
для его создания, и все остальные настройки кажутся равными между двумя?)
Ответы
Ответ 1
Среди одной из 129 вилок репо, первоначально используемых в приложении, для настройки версии NodeJS, был комментарий по проблеме, который решил:
Добавьте строку .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 - это волшебный ответ здесь.)
Ответ 2
Node.js (Latest)
Картридж
@hub.openshift: Node.js Latest
По умолчанию версия Node.js определяется путем запроса semver.io/node/stable.
Другой URL-адрес может быть указан либо через NODE_VERSION_URL
переменной окружения или установкой маркера .openshift/NODE_VERSION_URL
в вашем репозитории приложений.
Например, вы получите последние 0.10.x, поместив это в переменную NODE_VERSION_URL или маркер .openshift/NODE_VERSION_URL:
https://semver.io/node/resolve/0.10
Если вы используете нестандартную версию Node.js, и вы планируете масштабируйте приложение на нескольких передачах, вы должны использовать переменная окружения (узнайте вот почему).
Другие возможные методы
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
обходной путь:
Добавление папка .openshift из this repo позволит вам запустить любую версию nodejs, которая вам понадобится, используя раздел engine вашего файла package.json (см. README для использования):
"engines": {
"node": ">= 0.12.0"
},