Mozilla demande une construction 100% reproductible de Cesium. Faire un Docker?

Alors Mozilla me répond que mon build n’est pas reproductible.
Ils ont suivi les étapes suivantes :

npm install -g yarn@1.22.4 gulp@2.2.0 @ionic/cli@6.5.0 web-ext@4.1.0
git clone https://git.duniter.org/clients/cesium-grp/cesium.git
cd cesium
yarn install
gulp webExtBuild --release

Mais le fichier résultat (visible dans /dist/web/build) n’est pas identique au mien (disponible ici : cesium-v1.6.3-extension.zip)

En y regardant de plus près, l’ordre des template HTML n’est pas le même. Les CSS non plus, etc.
Bref, il me faut une manière simple de construire exactement les même build de Cesium.
Une idée ? Est-ce que l’un de vous pourraient m’aider ?

J’ai tenté de faire un docker file (en virant ailleurs toute la partie Android, qui est très lourde). Mais je ne suis pas expert docker. J’ai une erreur de droit sur un répertoire /root/.npm :

ERR! sharp EACCES: permission denied, mkdir '/root/.npm'
info sharp Are you trying to install as a root or sudo user? Try again with the --unsafe-perm flag
info sharp Attempting to build from source via node-gyp but this may fail due to the above error
info sharp Please see https://sharp.pixelplumbing.com/install for required dependencies
gyp WARN EACCES current user ("nobody") does not have permission to access the dev dir "/root/.cache/node-gyp/10.20.0"
gyp WARN EACCES attempting to reinstall using temporary dev dir "/usr/local/lib/node_modules/cordova-res/node_modules/sharp/.node-gyp"
gyp WARN install got an error, rolling back install
gyp WARN install got an error, rolling back install
gyp ERR! configure error 
gyp ERR! stack Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/cordova-res/node_modules/sharp/.node-gyp'
gyp ERR! System Linux 4.15.0-96-generic
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /usr/local/lib/node_modules/cordova-res/node_modules/sharp
gyp ERR! node -v v10.20.0
gyp ERR! node-gyp -v v5.1.0
gyp ERR! not ok 
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! sharp@0.25.2 install: `(node install/libvips && node install/dll-copy && prebuild-install --runtime=napi) || (node-gyp rebuild && node install/dll-copy)`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the sharp@0.25.2 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

Help ! :slight_smile:

Oui c’est parce que tu essaye de faire un conteneur qui s’exécutera en root, par sécurité c’est interdit :slight_smile:

La bonne pratique, c’est de créer un utilisateur dédié à l’application (ici cesium), puis de donner les droits nécessaire a cet utilisateur, tu peut t’inspirer du dockerfile de Duniter qui fait cela :

1 Like

Il faut configurer tes outils yarn / gulp pour que le build soit déterministe. Passer par docker ne changera rien je pense. J’imagine qu’un build déterministe te génèrerai le même hash sur le fichier zip généré, même si tu le joue deux fois de suite (voir le blog du build déterministe de chromium Chromium Docs - Deterministic builds - ils fournissent un script de comparaison à tester peut-être tools/determinism/compare_build_artifacts.py - chromium/src.git - Git at Google )

Pour yarn, il semblerait qu’il faille s’appuyer sur un lockfile : Yarn determinism | Yarn Blog

Je ne connais pas gulp, j’ai juste vu la doc ( https://gulpjs.com/ ) . Je te proposerais d’essayer une solution simple : configurer gulp pour désactiver la parallélisation et faire du séquentiel (utiliser l’api series plutot que parallel qui est non déterministe). Mais il semblerait que je ne trouve pas de parallel dans le gulpFile de Cesium. C’est peut être une option sur le src / pipe / dest alors ?

1 Like

Ben déjà ca évitera que l’équipe de mozilla se plante dans les commandes :slight_smile: On a déjà perdu pas mal de temps parcequ’ils faisaient un npm install au lieu d’un yarn install comme dans la doc que je leur avait donné. :frowning:

C’est parceque la version de gulp que Cesiuim utilise (v2.2.0) est inférieure à la v4 qui introduit gulp.series() et gulp.parallel().

Bien vu pour la parralèlisme. Je vais jetter un oeil de ce côté.

Merci @elois et @inso !

2 Likes

Pour info, j’ai enfin réussi à avoir un build reproductible.
Il manquait des sort() dans la concaténation des templates HTML et des traductions. Du coup gulp avait un ordre de traitement aléatoire.
J’en ai profité pour passer à gulp v4, compatible depuis hier avec ionic (grâce un merge request que j’avais fait il y a quelque mois). Jaime bien car la dernière version du toit Ionic reste compatible avec les projets restés en Ionic v1. C’est assez rare comme approche donc notable.

Bref, tout cela demande du temps mais ça avance quand même.

La prochaine version de Cesium devrait être acceptée par Mozilla. J’y crois !

5 Likes