Что перезагружает переменную 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"
 },