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.Patch
par 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
RUN
oĂč la stabilitĂ© prime, jâai beaucoup plus confiance dans la promotion dâartefacts.