MÄs, True Engineering, esam izveidojuÅ”i procesu nepÄrtrauktai atjauninÄjumu piegÄdei klientu serveriem, un vÄlamies dalÄ«ties ar Å”o pieredzi.
SÄkumÄ mÄs izstrÄdÄjÄm tieÅ”saistes sistÄmu klientam un izvietojÄm to savÄ Kubernetes klasterÄ«. Tagad mÅ«su augstas slodzes risinÄjums ir pÄrvietots uz klienta platformu, kurai esam iestatÄ«juÅ”i pilnÄ«bÄ automÄtisku nepÄrtrauktas ievieÅ”anas procesu. Pateicoties tam, mÄs paÄtrinÄjÄm laiku lÄ«dz tirgum - izmaiÅu piegÄdi produktu vidÄ.
Å ajÄ rakstÄ mÄs runÄsim par visiem nepÄrtrauktas izvietoÅ”anas (CD) procesa posmiem vai atjauninÄjumu piegÄdi klienta platformai:
- KÄ Å”is process sÄkas?
- sinhronizÄcija ar klienta Git repozitoriju,
- aizmugursistÄmas un priekÅ”gala montÄža,
- automÄtiska lietojumprogrammu izvietoÅ”ana testa vidÄ,
- automÄtiska izvietoÅ”ana uz Prod.
MÄs dalÄ«simies ar iestatÄ«Å”anas informÄciju.
1. SÄciet CD
NepÄrtraukta izvietoÅ”ana sÄkas ar to, ka izstrÄdÄtÄjs veic izmaiÅas mÅ«su Git repozitorija izlaiduma filiÄlÄ.
MÅ«su lietojumprogramma darbojas mikropakalpojumu arhitektÅ«rÄ, un visas tÄs sastÄvdaļas tiek glabÄtas vienÄ repozitorijÄ. Pateicoties tam, tiek apkopoti un instalÄti visi mikropakalpojumi, pat ja kÄds no tiem ir mainÄ«jies.
MÄs organizÄjÄm darbu caur vienu repozitoriju vairÄku iemeslu dÄļ:
- IzstrÄdes vienkÄrŔība - lietojumprogramma aktÄ«vi attÄ«stÄs, lai jÅ«s varÄtu strÄdÄt ar visu kodu vienlaikus.
- Viens CI/CD cauruļvads, kas garantÄ, ka lietojumprogramma kÄ viena sistÄma iztur visus testus un tiek piegÄdÄta klienta ražoÅ”anas vidÄ.
- MÄs novÄrÅ”am neskaidrÄ«bas versijÄs - mums nav jÄuzglabÄ mikropakalpojumu versiju karte un jÄapraksta tÄs konfigurÄcija katram mikropakalpojumam Helm skriptos.
2. SinhronizÄcija ar klienta avota koda Git repozitoriju
VeiktÄs izmaiÅas tiek automÄtiski sinhronizÄtas ar klienta Git repozitoriju. Tur tiek konfigurÄts lietojumprogrammas komplekts, kas tiek palaists pÄc filiÄles atjauninÄÅ”anas un izvietoÅ”anas uz turpinÄjumu. Abi procesi rodas savÄ vidÄ no Git repozitorija.
MÄs nevaram strÄdÄt tieÅ”i ar klienta repozitoriju, jo mums ir nepiecieÅ”ama mÅ«su paÅ”u vide izstrÄdei un testÄÅ”anai. Å iem nolÅ«kiem mÄs izmantojam savu Git repozitoriju ā tas ir sinhronizÄts ar viÅu Git repozitoriju. TiklÄ«dz izstrÄdÄtÄjs ievieto izmaiÅas attiecÄ«gajÄ mÅ«su repozitorija filiÄlÄ, GitLab nekavÄjoties nosÅ«ta Ŕīs izmaiÅas klientam.
PÄc tam jums jÄveic montÄža. Tas sastÄv no vairÄkiem posmiem: backend un frontend montÄža, testÄÅ”ana un piegÄde uz ražoÅ”anu.
3. AizmugursistÄmas un priekÅ”gala salikÅ”ana
AizmugursistÄmas un priekÅ”gala izveide ir divi paralÄli uzdevumi, kas tiek veikti GitLab Runner sistÄmÄ. TÄs sÄkotnÄjÄ montÄžas konfigurÄcija atrodas tajÄ paÅ”Ä repozitorijÄ.
GitLab Runner paÅem kodu no vajadzÄ«gÄ repozitorija, saliek to ar Java lietojumprogrammas veidoÅ”anas komandu un nosÅ«ta to Docker reÄ£istram. Å eit mÄs saliekam aizmuguri un priekÅ”galu, iegÅ«stam Docker attÄlus, kurus ievietojam repozitorijÄ klienta pusÄ. Lai pÄrvaldÄ«tu Docker attÄlus, mÄs izmantojam
MÄs sinhronizÄjam mÅ«su attÄlu versijas ar izlaiduma versiju, kas tiks publicÄta pakalpojumÄ Docker. Lai nodroÅ”inÄtu vienmÄrÄ«gu darbÄ«bu, esam veikuÅ”i vairÄkus pielÄgojumus:
1. Konteineri netiek pÄrbÅ«vÄti starp testa vidi un ražoÅ”anas vidi. MÄs veicÄm parametrizÄciju, lai viens un tas pats konteiners varÄtu strÄdÄt ar visiem iestatÄ«jumiem, vides mainÄ«gajiem un pakalpojumiem gan testa vidÄ, gan ražoÅ”anÄ bez pÄrbÅ«ves.
2. Lai atjauninÄtu lietojumprogrammu, izmantojot Helm, jÄnorÄda tÄs versija. MÄs veidojam backend, frontend un atjauninÄm lietojumprogrammu ā tie ir trÄ«s dažÄdi uzdevumi, tÄpÄc ir svarÄ«gi visur izmantot vienu un to paÅ”u aplikÄcijas versiju. Å im uzdevumam mÄs izmantojam datus no Git vÄstures, jo mÅ«su K8S klastera konfigurÄcija un lietojumprogrammas atrodas tajÄ paÅ”Ä Git repozitorijÄ.
MÄs iegÅ«stam lietojumprogrammas versiju no komandas izpildes rezultÄtiem
git describe --tags --abbrev=7
.
4. AutomÄtiska visu izmaiÅu izvietoÅ”ana testa vidÄ (UAT)
NÄkamais solis Å”ajÄ bÅ«vÄÅ”anas skriptÄ ir automÄtiski atjauninÄt K8S klasteru. Tas notiek ar nosacÄ«jumu, ka visa lietojumprogramma ir izveidota un visi artefakti ir publicÄti Docker reÄ£istrÄ. PÄc tam sÄkas testa vides atjauninÄÅ”ana.
Tiek sÄkta klastera atjauninÄÅ”ana
MÄs piegÄdÄjam K8S klastera konfigurÄciju kopÄ ar montÄžu. TÄpÄc nÄkamais solis ir tÄ atjauninÄÅ”ana: konfigurÄcijas kartes, izvietoÅ”ana, pakalpojumi, noslÄpumi un visas citas K8S konfigurÄcijas, kuras esam mainÄ«juÅ”i.
PÄc tam Helm testa vidÄ palaiž paÅ”as lietojumprogrammas RollOut atjauninÄjumu. Pirms lietojumprogrammas izvietoÅ”anas ražoÅ”anÄ. Tas tiek darÄ«ts, lai lietotÄji varÄtu manuÄli pÄrbaudÄ«t biznesa funkcijas, kuras mÄs ievietojam testa vidÄ.
5. AutomÄtiska visu Prod izmaiÅu izvietoÅ”ana
Lai izvietotu atjauninÄjumu ražoÅ”anas vidÄ, jums vienkÄrÅ”i jÄnoklikŔķina uz vienas pogas GitLab ā un konteineri nekavÄjoties tiek piegÄdÄti ražoÅ”anas vidÄ.
Viena un tÄ pati lietojumprogramma var darboties dažÄdÄs vidÄs ā testÄÅ”anas un ražoÅ”anas vidÄ ā bez pÄrbÅ«ves. MÄs izmantojam tos paÅ”us artefaktus, neko nemainot lietojumprogrammÄ, un parametrus iestatÄm ÄrÄji.
ElastÄ«ga lietojumprogrammas iestatÄ«jumu parametru noteikÅ”ana ir atkarÄ«ga no vides, kurÄ programma tiks izpildÄ«ta. MÄs esam pÄrvietojuÅ”i visus vides iestatÄ«jumus ÄrÄji: viss tiek parametrizÄts, izmantojot K8S konfigurÄciju un Helm parametrus. Kad Helm testÄÅ”anas vidÄ izvieto komplektu, tai tiek lietoti testa iestatÄ«jumi un produkta iestatÄ«jumi tiek lietoti ražoÅ”anas videi.
SarežģītÄkais bija parametrizÄt visus izmantotos pakalpojumus un mainÄ«gos, kas ir atkarÄ«gi no vides, un pÄrvÄrst tos vides mainÄ«gajos un vides parametru aprakstos-konfigurÄcijÄs Helm.
Lietojumprogrammu iestatÄ«jumos tiek izmantoti vides mainÄ«gie. To vÄrtÄ«bas tiek iestatÄ«tas konteineros, izmantojot K8S konfigurÄcijas karti, kas tiek veidota, izmantojot Go veidnes. PiemÄram, vides mainÄ«gÄ iestatÄ«Å”anu domÄna nosaukumam var izdarÄ«t Å”Ädi:
APP_EXTERNAL_DOMAIN: {{ (pluck .Values.global.env .Values.app.properties.app_external_domain | first) }}
.Values.global.env ā Å”is mainÄ«gais saglabÄ vides nosaukumu (prod, stage, UAT).
.Values.app.properties.app_external_domain ā Å”ajÄ mainÄ«gajÄ mÄs iestatÄm vÄlamo domÄnu .Values.yaml failÄ
Atjauninot lietojumprogrammu, Helm no veidnÄm izveido failu configmap.yaml un aizpilda APP_EXTERNAL_DOMAIN vÄrtÄ«bu ar vÄlamo vÄrtÄ«bu atkarÄ«bÄ no vides, kurÄ sÄkas lietojumprogrammas atjauninÄÅ”ana. Å is mainÄ«gais jau ir iestatÄ«ts konteinerÄ. Tam var piekļūt no lietojumprogrammas, tÄpÄc katrai lietojumprogrammas videi Å”im mainÄ«gajam bÅ«s atŔķirÄ«ga vÄrtÄ«ba.
SalÄ«dzinoÅ”i nesen Spring Cloud parÄdÄ«jÄs K8S atbalsts, tostarp darbs ar configMaps:
KopÄ
TÄtad nepÄrtrauktÄ izvietoÅ”ana ir konfigurÄta un darbojas. Visi atjauninÄjumi notiek ar vienu taustiÅu. IzmaiÅu piegÄde produkta vidÄ notiek automÄtiski. Un, kas ir svarÄ«gi, atjauninÄjumi neaptur sistÄmu.
NÄkotnes plÄni: automÄtiska datu bÄzes migrÄcija
MÄs domÄjÄm par datu bÄzes jauninÄÅ”anu un iespÄju Ŕīs izmaiÅas atsaukt. Galu galÄ vienlaikus darbojas divas dažÄdas lietojumprogrammas versijas: darbojas vecÄ, un jaunÄ ir izveidota. Un mÄs izslÄgsim veco tikai tad, kad bÅ«sim pÄrliecinÄti, ka jaunÄ versija darbojas. Datu bÄzes migrÄcijai jÄļauj strÄdÄt ar abÄm lietojumprogrammas versijÄm.
TÄpÄc mÄs nevaram vienkÄrÅ”i mainÄ«t kolonnas nosaukumu vai citus datus. Bet mÄs varam izveidot jaunu kolonnu, iekopÄt tajÄ datus no vecÄs kolonnas un ierakstÄ«t trigerus, kas, atjauninot datus, vienlaikus tos kopÄs un atjauninÄs citÄ kolonnÄ. Un pÄc veiksmÄ«gas jaunÄs lietojumprogrammas versijas izvietoÅ”anas, pÄc palaiÅ”anas atbalsta perioda, mÄs varÄsim izdzÄst veco kolonnu un aktivizÄtÄju, kas ir kļuvis nevajadzÄ«gs.
Ja jaunÄ lietojumprogrammas versija nedarbojas pareizi, mÄs varam atgriezties pie iepriekÅ”ÄjÄs versijas, ieskaitot iepriekÅ”Äjo datu bÄzes versiju. ÄŖsÄk sakot, mÅ«su veiktÄs izmaiÅas ļaus jums strÄdÄt vienlaikus ar vairÄkÄm lietojumprogrammas versijÄm.
PlÄnojam automatizÄt datu bÄzes migrÄciju caur K8S darbu, integrÄjot to CD procesÄ. Un mÄs noteikti dalÄ«simies Å”ajÄ pieredzÄ HabrĆ©.
Avots: www.habr.com