Eis Ëmsetzung vun der kontinuĂ©ierlecher Deployment op der Plattform vum Client

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:

  1. Wéi fÀnkt dëse Prozess un?
  2. Synchroniséierung mam Client sÀi Git Repository,
  3. Assemblée vum Backend a Frontend,
  4. automatesch Uwendungsdeployment an engem Testëmfeld,
  5. automatesch Deployment op Prod.

Mir deelen d'Installatiounsdetailer laanscht de Wee.

Eis Ëmsetzung vun der kontinuĂ©ierlecher Deployment op der Plattform vum Client

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.

Eis Ëmsetzung vun der kontinuĂ©ierlecher Deployment op der Plattform vum 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.

Tutorial fir e YAML Skript ze schreiwen fir am GitLab ze bauen.

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 Gradle Plugin.

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 Helm Update. 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: FrĂ©ijoer Cloud Kubernetes. 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.

Eis Ëmsetzung vun der kontinuĂ©ierlecher Deployment op der Plattform vum Client

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

Kaaft zouverlĂ€sseg Hosting fir Site mat DDoS Schutz, VPS VDS Server đŸ”„ Kaaft zouverlĂ©issegt WebsĂ€ithosting mat DDoS-Schutz, VPS VDS Server | ProHoster