📈 Paso a Node.js LTS 16/18 + fin de Open-Zwave

Salut les @contributors !

J’ai mergé la PR qui retire l’intégration Open-Zwave ( Remove Open-Zwave integration by Pierre-Gilles · Pull Request #1617 · GladysAssistant/Gladys · GitHub ), ce qui nous débloque un paquet de chantiers :slight_smile:

Ce que j’ai en tête :

  1. Passage à Node.js 16/18
  2. Passage à la Webcrypto API pour Gladys Plus au lieu du polyfill qu’on utilisait jusque-là
  3. Mise à jour des dépendances serveurs
  4. Mise à jour des dépendances front
  5. Mise à jour des Github Actions
  6. Mise à jour de Cypress

Ce que j’ai fais pour l’instant :

1., 2., 3. (en partie) et 5. dans cette PR:

Pour l’instant je passe à Node.js 18 sur le serveur, et Node.js 16 sur le front, car preact-cli tourne sous Webpack 4 qui n’est pas compatible avec Node.js 18 pour l’instant.

@Pti_Nico Je me suis basé sur ton boulot sur ta PR ( ci: update CI deprecated actions by NickDub · Pull Request #1630 · GladysAssistant/Gladys · GitHub ), est-ce que tu pourrais à la limite faire une PR séparée pour Cypress ? (Limite attend que je merge ma PR Node 18)

Avant/Après

Je pensais pas que ça allait être aussi impressionnant, mais en gros voilà la vitesse d’exécutions des tests de PR:

Avant (exemple sur la dernière PR)

Maintenant (Sur ma PR):

Comme quoi garder les logiciels et technologies à jour c’est important et ça sert à quelque chose :blush:

J’avoue que c’est assez fou comme gain de perf !

Plusieurs raisons à cette amélioration, ce n’est pas juste passer à Node.js 16/18 qui est la clé :

  • Open-Zwave était une librairie basée sur des binding C++ qui devait être buildée à chaque npm install + docker build dans chaque architecture. Retirer cette lib a pas mal contribué.
  • Avant Node.js 16, l’API Webcrypto n’était pas disponible dans Node.js donc j’utilisais un polyfill qui devait être compilé à chaque npm install + chaque docker build dans chaque architecture.

Dans le code du gateway, le changement ressemble à ça:

Ce qui retire node-webcrypto-ossl qui était une tannée à compiler, et on passe par l’API native Node.js.

Potentiellement, ça améliore les performances et la stabilité de la partie Gladys Plus car on passe par une API native bétonnée et officielle.

  • On passe à une version plus récente de sqlite3 qui a les bons bindings avec la Node-API, et qui est normalement pré-compilé pour chaque architecture, pareil on s’économise un build par npm install + build docker par architecture.

En gros, l’écosystème a pas mal évolué et le fait de ne pas utiliser la dernière version de Node nous empêchait de passer à plein de nouvelles optimisations.

L’autre avantage de tout ça, c’est qu’on va avoir un onboarding développeur beaucoup plus facile, et donc ça retirera un frein au développement de service Gladys.

On va pouvoir mettre à jour les tutos, et ça sera beaucoup plus simple :slight_smile:

J’ai une première image Docker tournant sous Node.js 18:

gladysassistant/gladys:upgrade-node-18

Je suis preneur de retours :slight_smile:

Edit: tag dev désormais:

J’avoue que pour l’environnement de dev, le module a compiler zwave était une tannée !

Je vois ça dès que possible :wink:

Pour info, j’ai intégré les différents retours fait sur la PR et mergé la PR sur master pour que toutes les PR en cours puissent s’adapter et profiter des améliorations de vitesse de build ! :partying_face:

J’ai mis à jour la documentation développeur Linux/MacOS qui est maintenant bien plus claire à mon sens, fini open-zwave :slight_smile:

Pour info, au final je suis passé à Node.js 18 sur le back et le front, donc pas de Node 16.

Pour la documentation Windows, est-ce que quelqu’un pourrait faire une passe et vérifier que tout marche bien avec Node.js 18 LTS sur WSL et mettre à jour la documentation ? Merci !

L’image Docker sur le tag :dev est désormais basée sur Node.js 18 LTS:

gladysassistant/gladys:dev

Sur Apple M1 Pro, c’est vraiment impressionnant maintenant, les 1785 tests du backend passent en 1 minute :sweat_smile: Je gagne un temps fou de dev !

Et encore, on a de la marge d’améliorations, il y a 4-5 tests sur les services MQTT et Zigbee2mqtt qui prennent 10 secondes chacun, donc quasiment la moitié des tests est passé sur ces intégrations.

J’ai créé des issues Github pour ces tests:

@pierre-gilles j’ai revu ma PR :wink:

C’est fait

Génial ! C’est bon pour moi, mergé :slight_smile:

Efficace :smiley: C’est mergé, le nouveau tutoriel Windows est live sur le site: