Вечно не запускается при использовании Jenkins

Итак, у меня есть сборка 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, почему всегда зависит от того, где находится файл.

Я также обнаружил, что forever не соблюдает флаг -p или каталог конфигурации forever. Есть предположения?


person zmanc    schedule 21.04.2014    source источник


Ответы (1)


Это не имеет ничего общего с Дженкинсом, как вы сказали, вы получаете ту же ошибку из командной строки.

Насколько я могу судить, проблема не в "forever [being] sensitive to where the file is located", а в том, что ваш скрипт nodejs app.js чувствителен к тому, откуда он запускается. В примере из Forever без проблем используется путь с каталогами. Попробуйте запустить свой сценарий без forever из неправильного каталога, и вы увидите ту же проблему.

Где-то в коде сценария вы полагаетесь на текущий рабочий каталог при определении местоположения ssl/gd_bundle.crt. Не видя исходного кода, я могу только догадываться и указывать пальцем.

  • Если ваше местоположение ssl/gd_bundle.crt относительно местоположения скрипта, то, как указано в этом ответе: Как мне получить путь к текущему сценарию с помощью Node.js?, вы должны использовать __dirname, чтобы получить расположение каталога сценария, которое будет таким же независимо от текущего рабочего каталога.

  • Если ваше расположение ssl/gd_bundle.crt в файловой системе зафиксировано, вы должны использовать абсолютный путь, начиная с /, чтобы убедиться, что он не зависит от текущего рабочего каталога.

Что касается игнорирования -p, быстрый поиск в Google показывает следующее: forever -p / var / run / forever игнорируется, что указывает на открытую ошибку.

Изменить:
Чтобы избежать изменения сценария nodejs (если это не ваш файл), вы можете просто перейти в правильный текущий каталог перед выполнением вашей команды node. Работает как в Jenkins, так и в командной строке:

cd / var / nodejs / app && sudo NODE_ENV = разработка навсегда начать -a -l журналы /forever.log -o журналы / output. log -e журналы /error.log app.js

(измененные части выделены жирным)

person Slav    schedule 21.04.2014
comment
Добавлен обходной путь без изменения скрипта nodejs - person Slav; 21.04.2014
comment
Это сработало фантастически. Может ты сам навсегда исправишь? github.com/nodejitsu/forever/issues/521 - person zmanc; 22.04.2014
comment
Я был бы счастлив ... но я ничего не знаю о nodejs, кроме того, что это javascript, выполняемый на сервере. Рад, что обходной путь вам помог. - person Slav; 22.04.2014