EMBER_CLI_PROD_ASSETS à 1 plante la précompilation des assets

Vient de New installs will default to Ember CLI builds in Production - #36 by david

Salut l’équipe,

En essayant de définir EMBER_CLI_PROD_ASSETS sur 1, j’obtiens ce qui suit lors de la précompilation des assets (version 2.9.0.beta2 commit : 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.

Une idée de pourquoi cela se produit ?

Cordialement,
Ismael

1 « J'aime »

Est-ce une installation de production utilisant le guide d’installation ?

Pouvez-vous essayer une reconstruction ?

1 « J'aime »

Aucun succès après une reconstruction de l’instance. Je cherche plutôt ce qui cause l’appel uv_os_get_passwd, ou plus généralement ce qui cause cette erreur, est-ce que cela attend un utilisateur spécifique dans le système/paramètre ?

Cordialement,
Ismael

Comment exécutez-vous exactement l’image Discourse ? Y a-t-il des indicateurs supplémentaires pour la sécurité ?

En suivant cette trace, le problème est que la construction Ember-CLI échoue, et en essayant d’imprimer l’erreur, elle lance une autre exception et masque la réelle.

Pouvez-vous entrer dans l’image Discourse et essayer :

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

?

1 « J'aime »

Intéressant, voici ce que j’obtiens en exécutant votre suggestion (et cela a tout son sens si l’intention est d’accéder à un système de bibliothèque interne avec un utilisateur aléatoire autre que root) :

node
Bienvenue dans Node.js v16.13.2.
Tapez ".help" pour plus d'informations.

> const os = require('os');
undefined

> os.userInfo().shell
Uncaught:
SystemError [ERR_SYSTEM_ERROR]: Une erreur système s'est produite : uv_os_get_passwd a retourné ENOENT (aucun fichier ou répertoire de ce type)
    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: 'aucun fichier ou répertoire de ce type',
    syscall: 'uv_os_get_passwd'
  },
  errno: [Getter/Setter: -2],
  syscall: [Getter/Setter: 'uv_os_get_passwd']
}

>

Comment exécutez-vous exactement l’image Discourse ? Y a-t-il des indicateurs supplémentaires pour la sécurité ?

Nous utilisons une solution conteneurisée basée sur OpenShift, dans laquelle Discourse s’exécute avec un identifiant d’utilisateur aléatoire. Aucun problème jusqu’à présent, approche très similaire au guide d’installation officiel.
Il est certain que nous pouvons contourner ce problème en définissant EMBER_CLI_PROD_ASSETS sur 0, les actifs sont précompilés comme autrefois, mais tôt ou tard, si vos plans sont d’aller dans cette direction, cela peut poser un réel problème pour ce type de solutions si le processus de précompilation actuel est abandonné.

Donc, quelques questions ici :

  • Avez-vous une estimation de l’abandon (si c’est le cas) de la précompilation des actifs à l’ancienne ?
  • Y a-t-il un moyen d’accéder à la machinerie os d’une autre manière, ou d’envisager une approche différente, afin que les solutions conteneurisées avec des identifiants d’utilisateur aléatoires puissent toujours fonctionner ?

Merci beaucoup de vous pencher sur ce problème, très apprécié.

Cordialement,
Ismael

1 « J'aime »

Nous supprimons EMBER_CLI_PROD_ASSETS dans les prochaines semaines.

Nous ne l’utilisons pas directement, mais une dépendance, d’une dépendance, d’une dépendance… Je pense que c’est un appel étrange aussi, mais ce n’est pas quelque chose sur lequel nous avons beaucoup de contrôle.

1 « J'aime »

Notez que l’erreur que vous voyez n’est pas l’erreur réelle.
C’est une erreur qui se produit lorsque l’on essaie de vous montrer la vraie erreur…

3 « J'aime »

C’est exactement le même problème que dans Issue with non 'username' defined · Issue #2373 · nodejs/node-gyp · GitHub et os.userInfo throws if no username in docker container · Issue #25714 · nodejs/node · GitHub

En utilisant un identifiant d’utilisateur aléatoire, node se plaint au moment du chargement des méthodes et propriétés utilitaires système de os.

Juste pour confirmer, l’ancienne méthode sera totalement dépréciée/supprimée, n’est-ce pas ?

Cordialement,
Ismael

1 « J'aime »

Oui, compris après le message ci-dessus. À moins que l’équipe n’effectue une action/vérification spéciale pour l’autoriser, l’ère de l’utilisation d’identifiants d’utilisateur aléatoires est révolue, à mon avis.

Cordialement,
Ismael

1 « J'aime »

Oui, exactement. Nous avons progressivement déployé ce nouveau pipeline d’assets au fil des ans, afin de suivre les recommandations du projet EmberJS et d’être moins un cas isolé. Nous sommes déjà dans la phase finale du déploiement.

2 « J'aime »

Excellent, tout est clair.

Comme d’habitude, merci beaucoup pour vos informations détaillées, j’apprécie beaucoup.

Cordialement,
Ismael

1 « J'aime »

Juste pour information, et si cela peut être utile à quelqu’un. Il existe au moins une façon de faire fonctionner ember cli comme prévu avec un uid aléatoire, et cela consiste à s’assurer que l’uid aléatoire assigné a une entrée dans /etc/passwd au moment de l’exécution de l’opération rake assets:precompile.

Quelque chose comme :

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

Ainsi, la commande app/assets/javascripts/discourse run ember build -prod (de discourse/assets.rake at tests-passed · discourse/discourse · GitHub) fonctionnera.

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)
...

J’ai également remarqué que cette opération est assez coûteuse, consommant près de 2 Go de RAM juste pour la précompilation :scream:

Cordialement,
Ismael

2 « J'aime »

La semaine dernière, il utilisait plus de 4 Go, mais nous avons réussi à le faire fonctionner récemment sur des serveurs avec 1 Go de RAM / 2 Go de swap.

4 « J'aime »

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.