Câest bon, votre serveur Nest.JS que vous testez sur lâenvironnement de DEV depuis quelques semaines marche au poil. Il suffit de cliquer sur un bouton pour le dĂ©ployer en PROD.
Sauf que voilĂ , vous utilisez la promotion de code et votre image DOCKER de votre pipeline est configurĂ©e en node:latest . Câest cette nuit que la version a Ă©tĂ© changĂ©e en v20 avec tous les superbes changements cassants cĂŽtĂ© dĂ©pendance crypto.
Tant pis ! Pourtant vous lâaviez pourant bien bien testĂ©eâŠ
Câest dommage, il aurait pourtant suffi dâutiliser le PACKAGE qui tournait bien en DEV et le dĂ©ployer, sans ne RIEN CHANGER.
Et je ne sais pas vous, mais sur mes diffĂ©rents projets, il y a toujours au moins deux grandes catĂ©gories dâenvironnements (DEV / PROD) et cela peut monter selon les besoins (UAT, STAGING, PRE-PRODâŠ).
Chaque équipe ayant sa propre inertie, le délai entre chaque étape peut se compter en jours.
Alors si je dois re-tĂ©lĂ©charger Ă chaque Ă©tape mes dĂ©pendances, compiler tout en croisant des doigts que lâenvironnement de BUILD nâait pas bougĂ©, câest la porte ouverte Ă toute les fenĂȘtres.
Comment je faisais avant: la promotion de code
Je poussais sur une branche DEV, câĂ©tait parti pour lâINSTALL, BUILD, TESTS et DEPLOY en environnement de DEV.
Quand on voulait dĂ©ployer en prod, un petit coup de PR sur passage sur une branche RELEASE (PROD par exemple), puis câĂ©tait reparti pour INSTALL, BUILD, TESTS et DEPLOY en environnement de (PRE-)PROD
Dans cette approche, câest la politique de changement de branche qui dĂ©fini le type dâartefact que je fais.
- Quand je pousse sur DEV, cela dĂ©ploie sur lâenvironnement DEV.
- Quand je pousse sur PROD, ça dĂ©ploie sur lâenvironnement PROD.
â Avantages
- Facile Ă comprendre, nom de la branche == environnement
- Facile à versionner, la derniÚre version sur la branche qui passe les tests == la derniÚre version déployée
- Rapide à mettre en place pour une équipe avec plusieurs personnes
â InconvĂ©nients
- Le code est peut ĂȘtre identique, mais rien ne nous assure que les version compilĂ©es le soient. Une version DEV peut ĂȘtre diffĂ©rente de PROD. Les dĂ©pendances ou lâimage docker qui a fait le build sont peut ĂȘtre diffĂ©rentes.
- Plus long Ă valider, et donc Ă dĂ©ployer. Les tests de DEV auront soit Ă©tĂ© Ă©vitĂ©s, soit Ă©tĂ© repassĂ©s pour le mĂȘme code (parce quâartefact diffĂ©rent).
Et maintenant, je prĂ©fĂšre la promotion dâartefact (vous savez, dĂ©ployer la MĂME chose en DEV & PROD)
Je garde toujours une politique de branche. Mais, je dĂ©corrĂšle le dĂ©ploiement de lâacte de pousser sur une branche.
Il sâagit de deux choses distincts. Le fait de pousser sur une branche dĂ©clenche le niveau maximal auquel un artefact peut aller.
- Quand je pousse sur DEV, lâartefact construit nâira pas plus loin que lâenvironnement de DEV
- Quand je tag une version release, lâartefact traversera tous les environnements jusquâĂ la PROD
Et comment ça se passe ?
- Envoi: Une version est envoyée à mon gestionnaire de version
- Compilation & Packaging: pour gĂ©nĂ©rer un artefact optimal, quâon versionne.
Une approche sémantique (
Majeur.Mineur.Patchpar exemple) câest un minimum, . Et avec un identifiant unique de build câest encore mieux (Majeur.Mineur.Patch.Build)!
Si possible, ajout de suffixe pour diffĂ©rencier les versions DEV / PROD (vous avez le choix:SNAPSHOT,RC⊠Cette partie lĂ dĂ©pend de lâorganisation de lâĂ©quipe.) - Tests Statiques: On passe toute la phase dâanalyse statique du code (qualitĂ©, tests unitairesâŠ) pour ne pas pousser ce qui ne passe dĂ©jĂ pas la premiĂšre barriĂšre
- Livraison et stockage: La version est livrĂ©e sur un gestionnaire dâartefacts (Nexus par exemple) de DEV
- Audits dâartefact: Les Ă©tapes de CI de tests et dâaudits viennent rĂ©cupĂ©rer lâartefact et sâappuie dessus pour le tester.
- DĂ©ploiement de la DEV: On rĂ©cupĂšre lâartefact et on le pousse dans lâenvironnement de DEV.
Si la version est identifiĂ©e comme âReleaseâ, et que câest OK, on passe au niveau supĂ©rieur !
- Promotion: Lâartefact de DEV est promu. Il passe en PROD et est âscellĂ©â : pas possible de pousser une version avec le mĂȘme numĂ©ro ni dâĂ©diter son contenu
- DĂ©ploiement des environnements PRE-PROD: Chaque environnement PRE-PROD rĂ©cupĂšre le dernier artefact et passe les diffĂ©rents tests (Migration, performances, AcceptancesâŠ)
- Passage en PROD: lors de la release
Un bug de régression critique est rencontré en PROD ?
Il suffit de cibler une version antĂ©rieure fonctionnelle et de lancer le Rollback đ€
(bien sĂ»r, la gestion de version de la DB câest un problĂšme tout entier que nous nâaborderons pas ici).
Le must du must: pourquoi un gestionnaire différent pour les artefacts de DEV & de PROD ?
Cela permet une meilleure gestion des droits dâaccĂšs en fonction des Ă©quipes.
On peut appliquer des politiques diffĂ©rentes : par exemple, les artefacts de dĂ©veloppement peuvent ĂȘtre supprimĂ©s plus rapidement, tandis que ceux de production doivent ĂȘtre conservĂ©s plus longtemps pour garantir un rollback rapide.
â Avantages
- đŠ FiabilitĂ© accrue
Avec la promotion dâartefacts, nous savons exactement ce que nous dĂ©ployons. Rien nâest Ă ajouter, tout y est. Un artefact qui fonctionne Ă chaque Ă©tape de tests fonctionnera de la mĂȘme maniĂšre en production (sous rĂ©serve des diffĂ©rences dâenvironnement, mais cela ne DEVrait jamais arriver⊠ou presque đ ).
- đ Gain de temps cĂŽtĂ© CI & CD
On Ă©vite toute lâĂ©tape de BUILD & PACKAGE + rĂ©duction de certaines Ă©tapes du TESTS et du DELIVER (la promotion de lâartefact peut se faire cĂŽtĂ© gestionnaire dâartefacts directement) ce qui accĂ©lĂšre les cycles de livraison.
- đ FacilitĂ© dâaudit
Chaque artefact est versionné et accessible, ce qui simplifie les audits externes.
Besoin de rĂ©aliser des benchmarks de sĂ©curitĂ©, de performance ou dâaccessibilitĂ© sur une version prĂ©cĂ©dente ? Aucun problĂšme ! Tout est Ă portĂ©e de main.
â InconvĂ©nients
- NĂ©cessite un cycle de release bien identifiĂ© au sein de lâĂ©quipe
- Implique des outils particuliers comme un registre dâartefacts, des pipelines bien pensĂ©e et une bonne rigueur du flow.
En conclusion
Petit disclaimer de fin : il mâarrive de garder la promotion de code sur des projets encore jeunes avec un cycle de release encore naissant.
Quand un projet est encore en phase de BUILD, il sâagit dâune maniĂšre trĂšs rapide dâavancer. Surtout si lâentreprise chez qui je suis nâa pas encore de processus bien normĂ© en terme de RELEASE.
Mais, dans une phase de
RUNoĂč la stabilitĂ© prime, jâai beaucoup plus confiance dans la promotion dâartefacts.
