Mir bei True Engineering hunn e Prozess opgestallt fir eng kontinuéierlech Liwwerung vun Updates op Clientsserveren a wëllen dës Erfahrung deelen.
Fir unzefĂ€nken hu mir en Online System fir de Client entwĂ©ckelt an en an eisem eegene Kubernetes Cluster ofgesat. Elo ass eis High-Load-LĂ©isung op d'Plattform vum Client geplĂ«nnert, fir dĂ©i mir e vollautomatesche Continuous Deployment Prozess ageriicht hunn. Dank dĂ«sem hu mir d'ZĂ€it-ze-Maart beschleunegt - d'Liwwerung vun Ănnerungen am ProduktĂ«mfeld.
An dësem Artikel schwÀtze mir iwwer all Etappe vum Continuous Deployment (CD) Prozess oder d'Liwwerung vun Updates op d'Plattform vum Client:
- Wéi fÀnkt dëse Prozess un?
- Synchroniséierung mam Client sÀi Git Repository,
- Assemblée vum Backend a Frontend,
- automatesch Uwendungsdeployment an engem Testëmfeld,
- automatesch Deployment op Prod.
Mir deelen d'Installatiounsdetailer laanscht de Wee.

1. Start CD
Continuous Deployment fÀnkt mam Entwéckler un d'VerÀnnerunge vun der Verëffentlechungszweig vun eisem Git Repository.
Eis Applikatioun leeft op enger Mikroservicearchitektur an all seng Komponenten ginn an engem Repository gelagert. Dank dësem ginn all Mikroservicer gesammelt an installéiert, och wann ee vun hinnen geÀnnert huet.
Mir hunn Aarbecht duerch ee Repository aus verschiddene Grënn organiséiert:
- Einfachheet vun der Entwécklung - d'Applikatioun ass aktiv entwéckelt, sou datt Dir mat all de Code glÀichzÀiteg schaffe kënnt.
- Eng eenzeg CI / CD Pipeline déi garantéiert datt d'Applikatioun als eenzege System all Tester passéiert an an d'Produktiounsëmfeld vum Client geliwwert gëtt.
- Mir eliminéieren Duercherneen a Versiounen - mir mussen net eng Kaart vu Mikroservice Versiounen spÀicheren a seng Konfiguratioun fir all Mikroservice an Helm Scripten beschreiwen.
2. Synchroniséierung mam Git Repository vum Quellcode vum Client
Ănnerungen gemaach ginn automatesch mat dem Client sĂ€i Git Repository synchronisĂ©iert. Do ass d'Applikatiounsversammlung konfigurĂ©iert, dĂ©i no der AktualisĂ©ierung vun der Branche lancĂ©iert gĂ«tt, an d'Deployment op d'Fortsetzung. BĂ©id Prozesser stamen aus hirem Ămfeld aus engem Git Repository.
Mir kĂ«nnen net direkt mam Repository vum Client schaffen well mir eis eegen Ămfeld fir EntwĂ©cklung an Testen brauchen. Mir benotzen eise Git Repository fir dĂ«s Zwecker - et ass mat hirem Git Repository synchronisĂ©iert. Soubal en EntwĂ©ckler Ănnerungen an der entspriechender Branche vun eisem Repository postt, drĂ©ckt GitLab dĂ«s Ănnerungen direkt un de Client.

Duerno musst Dir d'Versammlung maachen. Et besteet aus e puer Etappen: Backend a Frontend Assemblée, Testen a Liwwerung fir d'Produktioun.
3. Assemblée Backend a Frontend
De Backend a Frontend bauen sinn zwou parallel Aufgaben déi am GitLab Runner System ausgefouert ginn. Seng originell Versammlungskonfiguratioun ass am selwechte Repository.
.
GitLab Runner hëlt de Code aus dem erfuerderleche Repository, montéiert et mam Java Applikatioun Build Kommando a schéckt en an den Docker Registry. Hei versammele mir de Backend a Frontend, kréien Docker Biller, déi mir an e Repository op der SÀit vum Client setzen. Fir Docker Biller ze managen benotze mir .
Mir synchroniséieren d'Versioune vun eise Biller mat der Verëffentlechungsversioun déi am Docker publizéiert gëtt. Fir glat Operatioun hu mir e puer Upassunge gemaach:
1. Container ginn net tĂ«scht dem TestĂ«mfeld an dem ProduktiounsĂ«mfeld nei opgebaut. Mir hunn Parametrisatioune gemaach fir datt dee selwechte Container mat all Astellungen, Ămfeldvariablen a Servicer souwuel am TestĂ«mfeld wĂ©i och an der Produktioun ouni nei opzebauen kĂ©int schaffen.
2. Fir eng Applikatioun via Helm ze aktualiséieren, musst Dir seng Versioun uginn. Mir bauen de Backend, de Frontend an aktualiséieren d'Applikatioun - dëst sinn drÀi verschidden Aufgaben, also ass et wichteg déi selwecht Versioun vun der Applikatioun iwwerall ze benotzen. Fir dës Aufgab benotze mir Daten aus der Git Geschicht, well eis K8S Cluster Konfiguratioun an Uwendungen am selwechte Git Repository sinn.
Mir kréien d'Applikatioun Versioun vun de Kommando Ausféierung Resultater
git describe --tags --abbrev=7.
4. Automatesch DĂ©tachement vun all Ănnerungen am Test Ămfeld (UAT)
De nÀchste Schrëtt an dësem Build Skript ass automatesch de K8S Cluster ze aktualiséieren. Dëst geschitt virausgesat datt déi ganz Applikatioun gebaut gouf an all Artefakte am Docker Registry publizéiert goufen. Duerno fÀnkt d'Testëmfeldaktualiséierung un.
De Clusterupdate gĂ«tt ugefaang ze benotzen . Wann, als Resultat, eppes net no Plang gelaf ass, wĂ€ert Helm automatesch an onofhĂ€ngeg all seng Ănnerungen zrĂ©ckrollen. Seng Aarbecht brauch net kontrollĂ©iert ze ginn.
Mir liwweren d'K8S Cluster Konfiguratioun zesumme mat der Assemblée. Dofir ass de nÀchste Schrëtt et ze aktualiséieren: configMaps, Deployment, Servicer, Geheimnisser an all aner K8S Konfiguratiounen déi mir geÀnnert hunn.
Helm leeft dann e RollOut Update vun der Applikatioun selwer am Testëmfeld. Ier d'Applikatioun op d'Produktioun ofgesat gëtt. Dëst gëtt gemaach fir datt d'Benotzer d'GeschÀftsfeatures manuell testen, déi mir an d'Testëmfeld setzen.
5. Automatesch DĂ©tachement vun all Ănnerungen ze Prod
Fir en Update an d'Produktiounsëmfeld z'installéieren, musst Dir just ee KnÀppchen am GitLab klicken - an d'Container ginn direkt an d'Produktiounsëmfeld geliwwert.
DĂ©i selwecht Applikatioun kann a verschiddenen Ămfeld schaffen - Test a Produktioun - ouni nei opzebauen. Mir benotzen dĂ©iselwecht Artefakte ouni eppes an der Applikatioun z'Ă€nneren, a mir setzen d'Parameteren extern.
Flexibel ParameterisĂ©ierung vun Applikatiounsastellungen hĂ€nkt vun der Ămwelt of an dĂ€r d'Applikatioun ausgefouert gĂ«tt. Mir hunn all d'Ămweltastellungen extern geplĂ«nnert: alles gĂ«tt parametrisĂ©iert duerch d'K8S Konfiguratioun an Helm Parameteren. Wann Helm eng AssemblĂ©e an d'TestĂ«mfeld ofbaut, ginn d'Test-Astellunge drop ugewannt, an d'Produktastellunge ginn op d'ProduktiounsĂ«mfeld applizĂ©iert.
DĂ©i schwieregst Saach war all benotzt Servicer a Variabelen ze parameterisĂ©ieren, dĂ©i vun der Ămwelt ofhĂ€ngeg sinn, an iwwersetze se an Ămweltvariablen a Beschreiwungskonfiguratiounen vun Ămweltparameter fir Helm.
Applikatioun Astellunge benotzen Ămfeld Variablen. Hir WĂ€erter ginn a Container gesat mat K8S Configmap, dĂ©i mat Go Template geschaaft gĂ«tt. Zum Beispill, eng Ămfeldvariabel op den Domain Numm ze setzen kann esou gemaach ginn:
APP_EXTERNAL_DOMAIN: {{ (pluck .Values.global.env .Values.app.properties.app_external_domain | first) }}
.Values.global.env - dĂ«s Variabel spĂ€ichert den Numm vun der Ămwelt (Prod, BĂŒhn, UAT).
.Values.app.properties.app_external_domain - an dëser Variabel setzen mir de gewënschte Domain an der .Values.yaml Datei
Beim AktualisĂ©ierung vun enger Applikatioun erstellt Helm eng configmap.yaml-Datei aus Schablounen a fĂ«llt den APP_EXTERNAL_DOMAIN-WĂ€ert mat dem gewĂ«nschten WĂ€ert jee no der ĂmgĂ©igend, an dĂ€r d'AktualisĂ©ierung vun der Applikatioun ufĂ€nkt. DĂ«s Variabel ass schonn am Container gesat. Et kann aus der Applikatioun zougĂ€nglech sinn, sou datt all ApplikatiounsĂ«mfeld en anere WĂ€ert fir dĂ«s Variabel huet.
Relativ viru kuerzem ass K8S ĂnnerstĂ«tzung a Spring Cloud erschĂ©ngt, inklusiv mat configMaps schaffen: . WĂ€hrend de Projet aktiv entwĂ©ckelt a radikal verĂ€nnert, kĂ«nne mir et net an der Produktioun benotzen. Awer mir iwwerwaachen aktiv sĂ€in Zoustand a benotzen se an DEV Konfiguratiounen. Soubal et stabilisĂ©iert, wĂ€erte mir vun der Benotzung vun Ămfeldvariablen wiesselen.
Total
Also, Continuous Deployment ass konfigurĂ©iert a funktionnĂ©iert. All Updates geschĂ©ien mat engem Tastatur. D'Liwwerung vun Ănnerungen am ProduktĂ«mfeld ass automatesch. An, Wichteg, Updates stoppen de System net.

Zukunft PlÀng: automatesch Datebank Migratioun
Mir hunn iwwer d'Upgrade vun der Datebank geduecht an d'MĂ©iglechkeet dĂ«s Ănnerungen zrĂ©ckzekrĂ©ien. No allem lafen zwou verschidde Versioune vun der Applikatioun zur selwechter ZĂ€it: dĂ©i al leeft, an dĂ©i nei ass op. A mir wĂ€erten dĂ©i al nĂ«mmen ausschalten wa mir sĂ©cher sinn datt dĂ©i nei Versioun funktionnĂ©iert. D'Datebankmigratioun sollt Iech erlaben mat bĂ©ide Versioune vun der Applikatioun ze schaffen.
Dofir kĂ«nne mir net einfach de Kolonnennumm oder aner DonnĂ©eĂ«n Ă€nneren. Awer mir kĂ«nnen eng nei Kolonn erstellen, Daten aus der aler Kolonn an et kopĂ©ieren an Trigger schreiwen, dĂ©i, wann Dir d'DonnĂ©eĂ«n aktualisĂ©iert, glĂ€ichzĂ€iteg kopĂ©ieren an aktualisĂ©ieren se an enger anerer Kolonn. An no der erfollegrĂ€icher Installatioun vun der neier Versioun vun der Applikatioun, no der Post-Start-ĂnnerstĂ«tzungsperiod, kĂ«nne mir dĂ©i al Kolonn an den AuslĂ©iser lĂ€schen, deen onnĂ©ideg ass.
Wann dĂ©i nei Versioun vun der Applikatioun net richteg funktionnĂ©iert, kĂ«nne mir op dĂ©i viregt Versioun zrĂ©ckrollen, och dĂ©i frĂ©ier Versioun vun der Datebank. Kuerz gesot, eis Ănnerungen erlaben Iech glĂ€ichzĂ€iteg mat verschiddene Versioune vun der Applikatioun ze schaffen.
Mir plangen eng Datebank Migratioun via K8S Aarbecht automatiséieren, et an der CD Prozess intégréieren. A mir wÀerten dës Erfahrung definitiv op Habré deelen.
Source: will.com
