EMBER_CLI_PROD_ASSETS = 1 приводит к крашу при компиляции ассетов

Получено с New installs will default to Ember CLI builds in Production - #36 by david

Привет, команда,

При попытке установить EMBER_CLI_PROD_ASSETS в значение 1 во время предварительной компиляции ресурсов (версия 2.9.0.beta2, коммит: d2de058ff51f204fcf85c86a00750a59505af3bb) я получаю следующее:

yarn run v1.22.17
$ /var/www/discourse/app/assets/javascripts/node_modules/.bin/ember build -prod
WARNING: Node v16.13.2 is not tested against Ember CLI on your platform. We recommend that you use the most-recent "Active LTS" version of Node.js. See https://git.io/v7S5n for details.
DEPRECATION: The integration of jQuery into Ember has been deprecated and will be removed with Ember 4.0. You can either opt-out of using jQuery, or install the `@ember/jquery` addon to provide the jQuery integration. Please consult the deprecation guide for further details: https://emberjs.com/deprecations/v3.x#toc_jquery-apis
A system error occurred: uv_os_get_passwd returned ENOENT (no such file or directory)

node:internal/errors:464
    ErrorCaptureStackTrace(err);
    ^

SystemError [ERR_SYSTEM_ERROR]: A system error occurred: uv_os_get_passwd returned ENOENT (no such file or directory)
    at new SystemError (node:internal/errors:233:5)
    at new NodeError (node:internal/errors:336:7)
    at Object.userInfo (node:os:347:11)
    at summarizeProcess (/var/www/discourse/app/assets/javascripts/node_modules/console-ui/lib/summarize-process.js:17:15)
    at writeError (/var/www/discourse/app/assets/javascripts/node_modules/console-ui/lib/write-error.js:114:3)
    at UI.writeError (/var/www/discourse/app/assets/javascripts/node_modules/console-ui/lib/index.js:167:20)
    at CLI.logError (/var/www/discourse/app/assets/javascripts/node_modules/ember-cli/lib/cli/cli.js:318:13)
    at CLI.run (/var/www/discourse/app/assets/javascripts/node_modules/ember-cli/lib/cli/cli.js:253:12)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async module.exports (/var/www/discourse/app/assets/javascripts/node_modules/ember-cli/lib/cli/index.js:145:12) {
  code: 'ERR_SYSTEM_ERROR',
  info: {
    errno: -2,
    code: 'ENOENT',
    message: 'no such file or directory',
    syscall: 'uv_os_get_passwd'
  },
  errno: [Getter/Setter],
  syscall: [Getter/Setter]
}
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Есть ли какие-либо подсказки, почему это происходит?

С уважением,
Исмаэль

Это установка в продакшн по руководству по установке?

Попробуйте выполнить пересборку.

После пересоздания экземпляра успеха нет. Меня больше интересует, что вызывает вызов uv_os_get_passwd, или, в более общем смысле, что является причиной этой ошибки. Ожидается ли наличие какого-либо конкретного пользователя в системе или требуется установка определённых настроек?

С уважением,
Исмаэль

Как именно вы запускаете образ Discourse? Есть ли какие-либо дополнительные флаги для безопасности?

Судя по этому трассировке, проблема в том, что сборка Ember-CLI завершается неудачей, и при попытке вывести ошибку возникает ещё одно исключение, скрывающее истинную причину.

Можете ли вы зайти внутрь образа Discourse и выполнить:

node
const os = require('os');
os.userInfo().shell

?

Интересно, вот что я получаю при выполнении вашего предложения (и это имеет полный смысл, если цель — получить доступ к любой внутренней библиотеке системы с произвольным пользователем, отличным от root):

node
Welcome to Node.js v16.13.2.
Type ".help" for more information.
> const os = require('os');
undefined
> os.userInfo().shell
Uncaught:
SystemError [ERR_SYSTEM_ERROR]: A system error occurred: uv_os_get_passwd returned ENOENT (no such file or directory)
    at __node_internal_captureLargerStackTrace (node:internal/errors:464:5)
    at new SystemError (node:internal/errors:233:5)
    at new NodeError (node:internal/errors:336:7)
    at Object.userInfo (node:os:347:11) {
  code: 'ERR_SYSTEM_ERROR',
  info: {
    errno: -2,
    code: 'ENOENT',
    message: 'no such file or directory',
    syscall: 'uv_os_get_passwd'
  },
  errno: [Getter/Setter: -2],
  syscall: [Getter/Setter: 'uv_os_get_passwd']
}
>

Как именно вы запускаете образ Discourse? Есть ли какие-либо дополнительные флаги для безопасности?

Мы используем контейнеризованное решение на базе OpenShift, в котором Discourse работает с произвольным идентификатором пользователя. На данный момент проблем не возникало, подход очень похож на официальное руководство по установке.
Конечно, мы можем обойти эту проблему, установив EMBER_CLI_PROD_ASSETS в значение 0; ассеты будут предварительно скомпилированы, как в старые времена, но рано или поздно, если ваши планы включают движение в этом направлении, это может стать реальной проблемой для подобных решений, если текущий процесс предварительной компиляции будет заброшен.

Поэтому у меня несколько вопросов:

  • Есть ли у вас ориентировочная дата отказа (если это так) от предварительной компиляции ассетов старым способом?
  • Есть ли способ получить доступ к механизму os иным образом или рассмотреть другой подход, чтобы контейнеризованные решения с произвольными идентификаторами пользователей всё ещё могли работать?

Большое спасибо за внимание к этому вопросу, очень ценим.

С уважением,
Исмаэль

Мы удалим EMBER_CLI_PROD_ASSETS в ближайшие несколько недель.

Мы не используем это напрямую, а лишь через зависимость, зависимость от зависимости, зависимость от зависимости… Думаю, это тоже странное решение, но мы не имеем здесь большого контроля.

Обратите внимание, что ошибка, которую вы видите, — это не сама ошибка. Это ошибка, возникающая при попытке показать вам реальную ошибку…

Это точно такая же проблема, как в Issue with non 'username' defined · Issue #2373 · nodejs/node-gyp · GitHub и os.userInfo throws if no username in docker container · Issue #25714 · nodejs/node · GitHub

При использовании случайного идентификатора пользователя node выдаёт ошибку при загрузке системных утилит и свойств модуля os.

Просто для подтверждения: старый способ будет полностью устаревшим/удалённым, верно?

С уважением,
Исмаэль

Да, понял после сообщения выше. Если команда не предпримет каких-либо специальных действий или проверок для разрешения этого, эра использования случайных идентификаторов пользователей, на мой взгляд, закончилась.

С уважением,
Исмаэль

Да, именно так. Мы постепенно внедряли этот новый конвейер ресурсов в течение нескольких лет, чтобы следовать рекомендациям проекта EmberJS и не быть «белыми воронами». Мы уже находимся в финальной фазе развертывания.

Отлично, всё ясно.

Как всегда, большое спасибо за подробную информацию, очень ценим.

С наилучшими пожеланиями,
Исмаэль

Только для информации, и на случай, если это кому-нибудь пригодится. Существует по крайней мере один способ заставить ember-cli работать как ожидалось с произвольным uid: нужно убедиться, что у назначенного случайного uid есть запись в /etc/passwd на момент выполнения операции rake assets:precompile.

Что-то вроде:

if [ `id -u` -ge 10000 ]; then
  cat /etc/passwd | sed -e "s/^discourse:/builder:/" > /tmp/passwd
  echo "discourse:x:`id -u`:`id -g`:,,,:/home/discourse:/bin/bash" >> /tmp/passwd
  cat /tmp/passwd > /etc/passwd
  rm /tmp/passwd
fi

Таким образом, команда app/assets/javascripts/discourse run ember build -prod (из discourse/assets.rake at tests-passed · discourse/discourse · GitHub) решит эту проблему.

yarn run v1.22.17
$ /discourse/app/assets/javascripts/node_modules/.bin/ember build -prod
WARNING: Node v16.13.2 is not tested against Ember CLI on your platform. We recommend that you use the most-recent "Active LTS" version of Node.js. See https://git.io/v7S5n  for details.
DEPRECATION: The integration of jQuery into Ember has been deprecated and will be removed with Ember 4.0. You can either opt-out of using jQuery, or install the `@ember/jquery` addon to provide the jQuery integration. Please consult the deprecation guide for further details: https://emberjs.com/deprecations/v3.x#toc_jquery-apis 
- Building
Environment: production
- Building
- building... 
[WARN] (broccoli-terser-sourcemap) Minifying "assets/chunk.529.6ee9018498e97f872147.js" took: 24288ms (more than 20,000ms)
...

Я также заметил, что эта операция довольно затратна: для предкомпиляции требуется почти 2 ГБ оперативной памяти :scream:

С наилучшими пожеланиями,
Исмаэль

На прошлой неделе она потребляла более 4 ГБ, но недавно нам удалось заставить её работать на серверах с 1 ГБ ОЗУ и 2 ГБ swap-памяти.