Satura marÄ·ÄÅ”ana werf savÄcÄjÄ: kÄpÄc un kÄ tÄ darbojas?
werf ir mÅ«su atvÄrtÄ pirmkoda GitOps CLI utilÄ«ta lietojumprogrammu izveidei un piegÄdei Kubernetes. IN laidiens v1.1 attÄlu savÄcÄjÄ tika ieviesta jauna funkcija: attÄlu atzÄ«mÄÅ”ana pÄc satura vai uz saturu balstÄ«ta marÄ·ÄÅ”ana. LÄ«dz Å”im tipiskÄ werf marÄ·ÄÅ”anas shÄma ietvÄra Docker attÄlu marÄ·ÄÅ”anu, izmantojot Git tag, Git branch vai Git commit. TaÄu visÄm Ŕīm shÄmÄm ir trÅ«kumi, kurus pilnÄ«bÄ atrisina jaunÄ marÄ·ÄÅ”anas stratÄÄ£ija. SÄ«kÄka informÄcija par to un to, kÄpÄc tas ir tik labs, ir atrodams.
Mikropakalpojumu kopas izvÄrÅ”ana no viena Git repozitorija
Bieži rodas situÄcija, kad lietojumprogramma tiek sadalÄ«ta daudzos vairÄk vai mazÄk neatkarÄ«gos servisos. Å o pakalpojumu izlaiÅ”ana var notikt neatkarÄ«gi: vienu vai vairÄkus pakalpojumus var izlaist vienlaikus, bet pÄrÄjiem jÄturpina darboties bez izmaiÅÄm. Bet no koda glabÄÅ”anas un projektu vadÄ«bas viedokļa Å”Ädus lietojumprogrammu pakalpojumus ir ÄrtÄk turÄt vienÄ repozitorijÄ.
PastÄv situÄcijas, kad pakalpojumi ir patiesi neatkarÄ«gi un nav saistÄ«ti ar vienu pieteikumu. Å ajÄ gadÄ«jumÄ tie tiks izvietoti atseviŔķos projektos un to izlaiÅ”ana tiks veikta, izmantojot atseviŔķus CI/CD procesus katrÄ no projektiem.
TomÄr patiesÄ«bÄ izstrÄdÄtÄji nereti sadala vienu aplikÄciju vairÄkos mikropakalpojumos, taÄu katram izveidot atseviŔķu repozitoriju un projektu... ir nepÄrprotama pÄrpÅ«le. TieÅ”i Ŕī situÄcija tiks apspriesta tÄlÄk: vairÄki Å”Ädi mikropakalpojumi atrodas vienÄ projektu repozitorijÄ, un izlaidumi notiek, izmantojot vienu procesu CI/CD.
AtzÄ«mÄÅ”ana pÄc Git filiÄles un Git taga
PieÅemsim, ka tiek izmantota visizplatÄ«tÄkÄ marÄ·ÄÅ”anas stratÄÄ£ija. tag-vai-zars. Git filiÄlÄm attÄli tiek atzÄ«mÄti ar filiÄles nosaukumu, vienai filiÄlei vienlaikus ir tikai viens publicÄts attÄls ar Ŕīs filiÄles nosaukumu. Git tagiem attÄli tiek marÄ·Äti atbilstoÅ”i taga nosaukumam.
Kad tiek izveidots jauns Git tags, piemÄram, kad tiek izlaista jauna versija, visiem projekta attÄliem Docker reÄ£istrÄ tiks izveidots jauns Docker tags:
myregistry.org/myproject/frontend:v1.1.10
myregistry.org/myproject/myservice1:v1.1.10
myregistry.org/myproject/myservice2:v1.1.10
myregistry.org/myproject/myservice3:v1.1.10
myregistry.org/myproject/myservice4:v1.1.10
myregistry.org/myproject/myservice5:v1.1.10
myregistry.org/myproject/database:v1.1.10
Å ie jaunie attÄlu nosaukumi caur Helm veidnÄm tiek nodoti Kubernetes konfigurÄcijai. UzsÄkot izvietoÅ”anu ar komandu werf deploy lauks tiek atjauninÄts image Kubernetes resursa manifestos un atbilstoÅ”o resursu restartÄÅ”anu mainÄ«tÄ attÄla nosaukuma dÄļ.
problÄma: gadÄ«jumÄ, ja faktiski attÄla saturs nav mainÄ«jies kopÅ” iepriekÅ”ÄjÄs izlaiÅ”anas (Git tags), bet tikai tÄ Docker tags, tas notiek papildus restartÄjot Å”o lietojumprogrammu, un attiecÄ«gi ir iespÄjama dÄ«kstÄve. Lai gan nebija Ä«sta iemesla veikt Å”o restartÄÅ”anu.
RezultÄtÄ ar paÅ”reizÄjo marÄ·ÄÅ”anas shÄmu ir nepiecieÅ”ams norobežot vairÄkas atseviŔķas Git repozitorijus, un rodas problÄma, organizÄjot Å”o vairÄku krÄtuvju izlaiÅ”anu. KopumÄ Å”Äda shÄma izrÄdÄs pÄrslogota un sarežģīta. LabÄk ir apvienot daudzus pakalpojumus vienÄ repozitorijÄ un izveidot Docker tagus, lai nebÅ«tu nevajadzÄ«gu restartÄÅ”anu.
AtzÄ«mÄÅ”ana, izmantojot Git commit
werf ir arÄ« marÄ·ÄÅ”anas stratÄÄ£ija, kas saistÄ«ta ar Git saistÄ«bÄm.
Git-commit ir Git repozitorija satura identifikators un ir atkarÄ«gs no failu rediÄ£ÄÅ”anas vÄstures Git repozitorijÄ, tÄpÄc Ŕķiet loÄ£iski to izmantot attÄlu marÄ·ÄÅ”anai Docker reÄ£istrÄ.
TomÄr atzÄ«mÄÅ”anai ar Git commit ir tÄdi paÅ”i trÅ«kumi kÄ atzÄ«mÄÅ”anai ar Git filiÄlÄm vai Git tagiem:
Var izveidot tukÅ”u apÅemÅ”anos, kas nemaina nevienu failu, bet attÄla Docker tags tiks mainÄ«ts.
Var izveidot sapludinÄÅ”anas apÅemÅ”anos, kas nemaina failus, bet attÄla Docker tags tiks mainÄ«ts.
Var tikt izveidota apÅemÅ”anÄs, kas maina tos Git failus, kas nav importÄti attÄlÄ, un attÄla Docker tags tiks mainÄ«ts vÄlreiz.
Git filiÄles nosaukuma atzÄ«mÄÅ”ana neatspoguļo attÄla versiju
Ir vÄl viena problÄma, kas saistÄ«ta ar Git filiÄļu marÄ·ÄÅ”anas stratÄÄ£iju.
AtzÄ«mÄÅ”ana pÄc filiÄles nosaukuma darbojas tik ilgi, kamÄr Ŕīs filiÄles saistÄ«bas tiek apkopotas secÄ«gi hronoloÄ£iskÄ secÄ«bÄ.
Ja paÅ”reizÄjÄ shÄmÄ lietotÄjs sÄk atjaunot veco apÅemÅ”anos, kas saistÄ«ta ar noteiktu atzaru, tad werf pÄrrakstÄ«s attÄlu, izmantojot atbilstoÅ”o Docker tagu ar jaunizveidotu attÄla versiju vecajai izpildei. Izvietojot Å”o tagu, turpmÄk pastÄv risks, ka, restartÄjot aplikumus, tiks izvilkta cita attÄla versija, kÄ rezultÄtÄ mÅ«su lietojumprogramma zaudÄs savienojumu ar CI sistÄmu un tiks desinhronizÄta.
TurklÄt, veicot secÄ«gus virzienus vienÄ zarÄ ar Ä«su laika periodu starp tiem, vecÄ apÅemÅ”anÄs var tikt apkopota vÄlÄk nekÄ jaunÄkÄ: vecÄ attÄla versija pÄrrakstÄ«s jauno, izmantojot Git filiÄles tagu. Å Ädas problÄmas var atrisinÄt, izmantojot CI/CD sistÄmu (piemÄram, GitLab CI tiek palaists pÄdÄjÄs konveijera izpildes sÄrija). TomÄr ne visas sistÄmas to atbalsta, un ir jÄbÅ«t uzticamÄkam veidam, kÄ novÄrst Å”Ädu bÅ«tisku problÄmu.
Kas ir uz saturu balstÄ«ta marÄ·ÄÅ”ana?
TÄtad, kas ir uz saturu balstÄ«ta tagu pievienoÅ”ana - attÄlu atzÄ«mÄÅ”ana pÄc satura.
Lai izveidotu Docker tagus, tiek izmantoti nevis Git primitÄ«vi (Git filiÄle, Git tags...), bet gan kontrolsumma, kas saistÄ«ta ar:
attÄla saturu. AttÄla ID tags atspoguļo tÄ saturu. Veidojot jaunu versiju, Å”is identifikators nemainÄ«sies, ja attÄla faili nav mainÄ«juÅ”ies;
Ŕī attÄla izveides vÄsture programmÄ Git. AttÄliem, kas saistÄ«ti ar dažÄdÄm Git filiÄlÄm un atŔķirÄ«gu bÅ«vÄÅ”anas vÄsturi, izmantojot werf, bÅ«s atŔķirÄ«gi ID tagi.
Å Äds identifikatora tags ir tÄ sauktais attÄla skatuves paraksts.
Katrs attÄls sastÄv no vairÄkiem posmiem: from, before-install, git-archive, install, imports-after-install, before-setup, ... git-latest-patch utt. Katram posmam ir identifikators, kas atspoguļo tÄ saturu ā skatuves paraksts(skatuves paraksts).
GalÄ«gais attÄls, kas sastÄv no Å”iem posmiem, ir atzÄ«mÄts ar tÄ saukto Å”o posmu kopas parakstu - posmu paraksts, - kas ir vispÄrinoÅ”s visiem attÄla posmiem.
Katram attÄlam no konfigurÄcijas werf.yaml vispÄrÄ«gÄ gadÄ«jumÄ bÅ«s savs paraksts un attiecÄ«gi Docker tags.
Skatuves paraksts atrisina visas Ŕīs problÄmas:
IzturÄ«gs pret tukÅ”Äm Git saistÄ«bÄm.
IzturÄ«gs pret Git saistÄ«bÄm, kas maina failus, kas nav saistÄ«ti ar attÄlu.
Neizraisa problÄmas, kas saistÄ«tas ar paÅ”reizÄjÄs attÄla versijas pÄrskatÄ«Å”anu, restartÄjot bÅ«vÄjumus vecajÄm filiÄles Git saistÄ«bÄm.
Tagad Ŕī ir ieteicamÄ marÄ·ÄÅ”anas stratÄÄ£ija, un tÄ ir noklusÄjuma werf vÄrtÄ«ba visÄm CI sistÄmÄm.
KÄ iespÄjot un izmantot werf
Komandai tagad ir atbilstoŔa opcija werf publish: --tag-by-stages-signature=true|false
CI sistÄmÄ marÄ·ÄÅ”anas stratÄÄ£iju nosaka komanda werf ci-env. IepriekÅ” tam tika noteikts parametrs werf ci-env --tagging-strategy=tag-or-branch. Tagad, ja norÄdÄt werf ci-env --tagging-strategy=stages-signature vai nenorÄdiet Å”o opciju, werf pÄc noklusÄjuma izmantos marÄ·ÄÅ”anas stratÄÄ£iju stages-signature. Komanda werf ci-env automÄtiski iestatÄ«s komandai nepiecieÅ”amos karogus werf build-and-publish (Vai werf publish), tÄpÄc Ŕīm komandÄm nav jÄnorÄda papildu opcijas.
Å eit 4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d ir attÄla posmu paraksts backendUn f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6 - attÄla posmu paraksts frontend.
Izmantojot Ä«paÅ”as funkcijas werf_container_image Šø werf_container_env Helm veidnÄs nekas nav jÄmaina: Ŕīs funkcijas automÄtiski Ä£enerÄs pareizos attÄlu nosaukumus.
KonfigurÄcijas piemÄrs CI sistÄmÄ:
type multiwerf && source <(multiwerf use 1.1 beta)
type werf && source <(werf ci-env gitlab)
werf build-and-publish|deploy
PlaÅ”Äka informÄcija par konfigurÄciju ir pieejama dokumentÄcijÄ:
Jauna iespÄja werf publish --tag-by-stages-signature=true|false.
Jauna opcijas vÄrtÄ«ba werf ci-env --tagging-strategy=stages-signature|tag-or-branch (ja nav norÄdÄ«ts, noklusÄjuma vÄrtÄ«ba bÅ«s stages-signature).
Ja iepriekÅ” izmantojÄt atzÄ«mÄÅ”anas opcijas Git saistÄ«bÄm (WERF_TAG_GIT_COMMIT vai opcija werf publish --tag-git-commit COMMIT), pÄc tam noteikti pÄrslÄdzieties uz atzÄ«mÄÅ”anas stratÄÄ£iju posmi-paraksts.
LabÄk ir nekavÄjoties pÄrslÄgt jaunus projektus uz jauno marÄ·ÄÅ”anas shÄmu.
PÄrejot uz werf 1.1, vecos projektus vÄlams pÄrslÄgt uz jauno marÄ·ÄÅ”anas shÄmu, bet veco tag-vai-zars joprojÄm tiek atbalstÄ«ts.
Satura marÄ·ÄÅ”ana atrisina visas rakstÄ aplÅ«kotÄs problÄmas:
Docker taga nosaukuma izturÄ«ba pret tukÅ”Äm Git saistÄ«bÄm.
Docker taga nosaukuma noturÄ«ba pret Git apÅemas mainÄ«t failus, kas nav saistÄ«ti ar attÄlu.
Neizraisa problÄmas, kas saistÄ«tas ar paÅ”reizÄjÄs attÄla versijas pÄrskatÄ«Å”anu, restartÄjot veco Git saistÄ«bu bÅ«vÄjumus Git filiÄlÄm.
Lieto to! Un neaizmirstiet mÅ«s apmeklÄt plkst GitHubizveidot problÄmu vai atrast esoÅ”u, ielikt plusu, izveidot PR vai vienkÄrÅ”i vÄrot projekta attÄ«stÄ«bu.