Date : 2023-07-03
Remplace l'ADR #18.
Amende 0018-specifier-version-nodejs.md
En discussion
Avec l'ADR 18, nous avons choisi :
- PAAS : préciser la version majeure de Node uniquement.
- CI : préciser une version exacte de Node (parce que imposé par la CI).
- Local : préciser la version majeure de Node uniquement.
Nous avons constaté plusieurs limites à ce choix :
- Un bug corrigé par la PR 6512 nous oblige à fixer une version minimale.
- Fixer la version majeure uniquement peut provoquer des problèmes de reproductibilité car nos 3 environnements ont chacun une version de Node différente. Notamment en local, il est arrivé que certain(e)s développeurs(euses) restent en version antérieure à la 16.15 lorsque nous avons dû supprimer la compatibilité de ces versions. Par exemple, si l'on spécifie la version 16 :
- en local, on peut utiliser la
16.1.0
. - dans la CI, on peut utiliser la
16.2.8
. - dans le PAAS, on peut utiliser la
16.15.0
.
- en local, on peut utiliser la
Cette solution consiste à mettre à jour la version de node dans chacun des 3 environnements en même temps.
- Limite l'écart de version possible entre les 3 environnements.
- Clarification du choix de version compatible.
- Moins de gestion de compatibilité sur des versions non gérées.
- Automatisable avec Renovate.
- Mises à jour de sécurité de Node en local plus régulière.
- Alerte en local que la version utilisée n'est pas bonne.
- Nécessite des
nvm install
plus réguliers. - On synchronise les montées de versions de Node avec les mises à jour des images Node de Circle CI.
- Retard minime possible à cause du délai de mise à jour des versions de Node côté Circle CI.
Notre CI évoluerai de son côté, pour éviter la synchronisation avec les images Node Circle CI.
- Limite l'écart de version possible entre les 3 environnements.
- Clarification du choix de version compatible.
- Moins de gestion de compatibilité sur des versions non gérées.
- Automatisable avec Renovate.
- Mises à jour de sécurité de Node en local plus régulière.
- Alerte en local que la version utilisée n'est pas bonne.
- Nécessite des
nvm install
plus réguliers. - La reproductibilité en CI n'est pas assurée.
Permettre de spécifier une version mineure (en plus de la majeure) pour préciser la version minimale nécessaire.
- Gestion plus fine de la compatibilité.
- Permet de forcer la mise à jour des développeurs quand une version mineure n'est plus compatible.
- La reproductibilité entre les 3 environnements n'est pas assurée.
- Non automatisable avec Renovate.
- Nécessite des
nvm install
plus réguliers.
Lors des Tech Days 2023, une équipe s'est formée sur le sujet des montées de version. Après avoir corrigé la version de Node embarquée dans l'API qui était non maintenue nous avons expérimenté les montées de version automatisées de Node sur un fork du monorepo.
NB : Après six mois, les versions impaires (9, 11, etc.), ne sont plus maintenues et sont donc hors LTS voir la doc
En faisant évoluer notre configuration Renovate, nous avons observé que l'outil force l'ajout du numéro de patch si on précise la version mineure requise.
Fort de ces expérimentations, l'équipe propose de choisir la solution 1.
Il faut migrer le format d'écriture des numéros de versions de Node.js :
- Dans les
.nvmrc
, préciser le numéro de version exacte. Exemple :16.20.1
- Dans les
package.json
, préciser le numéro de version exacte minimum denode
. On propose d'utiliser le même format que pour les dépendances. Exemple :^16.20.1
. - Dans les
package.json
, ne pas préciser le numéro de version exacte minimum denpm
pour utiliser celle embarquée par défaut par Node.js. On peut directement supprimer cette contrainte pour éviter les soucis lors des futures de migration de Node.
Renovate nous proposera dès lors les montées de versions groupées de Node dès qu'une nouvelle version de l'image Node Circle CI est publiée.
On peut commencer cette migration par le monorepo, avant de migrer nos dépendances comme pix-ui
.
Sur le PaaS, dans sa version actuelle, rien ne change car on utilisera toujours la dernière version disponible. À l'avenir, la version du PaaS sera synchronisée avec les 2 autres versions.