
â meie avatud lĂ€htekoodiga GitOps CLI tööriist rakenduste ehitamiseks ja tarnimiseks Kubernetesesse. V kasutusele vĂ”etud uus vĂ”imalus piltide kogujas: piltide mĂ€rgistamine sisu pĂ”hjal vĂ”i sisu pĂ”hine mĂ€rgistamine. Seni on werf'is tĂŒĂŒpiline mĂ€rgistamisstrateegia hĂ”lmanud Docker-piltide mĂ€rgistamist Git-tĂ€gi, Git-haru vĂ”i Git-commit'i jĂ€rgi. Kuid kĂ”igil neil skeemidel on puudused, mida uus mĂ€rgistamisstrateegia tĂ€ielikult lahendab. Ăksikasjad selle kohta ja miks see nii hea on â allpool.
Mikroteenuste komplekti vĂ€ljalaskmine ĂŒhest Git-repositaariumist
Sageli esineb olukordi, kus rakendus on jagatud paljude enam-vĂ€hem iseseisvate teenuste vahel. Nende teenuste versioonid vĂ”ivad toimuda iseseisvalt: korraga vĂ”ib vĂ€lja tulla ĂŒks vĂ”i mitu teenust, samas kui teised peavad jĂ€tkama tööd ilma muudatusteta. Kuid koodi hoidmise ja projekti haldamise seisukohalt on mugavam hoida selliseid rakenduse teenuseid ĂŒhes repos.
On olukordi, kus teenused on tĂ”eliselt iseseisvad ja ei ole seotud ĂŒhe rakendusega. Sellisel juhul asuvad nad erinevates projektides ja nende vĂ€ljalaskmine toimub iga projekti eraldi CI/CD protsesside kaudu.
Kuid reaalsuses jagavad arendajad sageli ĂŒhte rakendust mitmeks mikroteenuseks, kuid igaĂŒhe jaoks eraldi reposse ja projekti rakendamine ... oleks kindlasti ĂŒle jĂ”u kĂ€iv. Just sellest olukorrast juttu ongi: mitmed sellised mikroteenused asuvad ĂŒhes projektirepos ja vĂ€ljalaskmine toimub ĂŒhtse CI/CD protsessi kaudu.
MÀrgistamine Git-haru ja Git-tÀgi jÀrgi
Oletame, et kasutatakse kĂ”ige levinumat mĂ€rgistamisstrateegiat â tag-or-branch. Git-harude puhul mĂ€rgistatakse pildid haru nime jĂ€rgi, ĂŒhel ajal on ĂŒhe haru nime jĂ€rgi avaldatud ainult ĂŒks pilt. Git-tĂ€gi puhul mĂ€rgistatakse pildid vastavalt tĂ€gi nimele.
Uue Git-tĂ€gi loomisel â nĂ€iteks uue versiooni vĂ€ljaandmisel â luuakse kĂ”igi projekti piltide jaoks Docker Registry's uus Docker-tĂ€gi:
-
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
Need uued nimed jÔuavad Helm-mallide kaudu Kubernetes'i konfiguratsiooni. Deployment'i kÀivitamisel kÀsuga werf deploy toimub vÀlja muude vÀljade vÀrskendamine image Kubernetes'i ressursimaaniifestides ja vastavate ressursside taaskÀivitamine seoses pildi nime muutumisega.
Probleem: juhul, kui eelmisest vÀljaandest (Git-tÀgi) ei ole pildi sisu tegelikult muutunud, vaid ainult selle Docker-tÀgi, toimub liigne taaskÀivitamine, ning seega on vÔimalik mÔningane hÀirivus. Kuigi selleks ei olnud tegelikke pÔhjusi.
Tulemusena, praeguse sildistamisstrateegiaga tuleb luua mitu eraldi Git-repositooriumit ning kerkib ĂŒles mitu repositooriumi vĂ€ljaandmise korraldamise probleem. Ăldiselt on selline sĂŒsteem ĂŒlekoormatud ja keeruline. Paremini oleks ĂŒhendada mitu teenust ĂŒhte repositooriumisse ja luua selliseid Docker-tĂ€gesid, et vĂ€ltida liigseid taaskĂ€ivitamisi.
Sildistamine Git-commitâi jĂ€rgi
Werfis on samuti olemas sildistamistrateegia, mis on seotud Git-commit'idega.
Git-commit on Git-repositooriumi sisu identifikaator ja sÔltub failide redigeerimise ajaloost Git-repositooriumis, seega tundub loogiline seda kasutada piltide sildistamiseks Docker Registry's.
Siiski, sildistamine Git-commitâi jĂ€rgi omab samu puudusi, mis Git-haru vĂ”i Git-tĂ€he puhul:
- VĂ”ib olla loodud tĂŒhi commit, mis ei muuda faile, ja Docker-tĂ€gi muutub.
- VÔib olla loodud merge-commit, mis ei muuda faile, ja Docker-tÀgi muutub.
- VÔib olla loodud commit, mis muudab Git'is faile, mida pildiga ei impordita, ja Docker-tÀgi muutub taas.
Sildistamine Git-haru nime jÀrgi ei peegelda pildi versiooni
On veel ĂŒks probleem, mis on seotud Git-harude sildistamisstrateegiaga.
Haru nime jÀrgi sildistamine töötab seni, kuni selle haru commit'id kogutakse jÀrjestikku ajaliselt.
Kui kasutaja kĂ€ivitab praeguses skeemis vana commit'i, mis on seotud teatud harudega, vĂ€rskendab werf vastava Docker-sildi koos uue ehitatud versiooniga vana commit'i jaoks. Selles etapis seonduvad Deployment'id riskivad, et pod'ide taaskĂ€ivitamisel tĂ”mmatakse erinev versioon ja meie rakendus kaotab ĂŒhenduse CI-sĂŒsteemiga ning desĂŒnkroniseeritakse.
Lisaks, kui jĂ€rjestikused push'id teevad ĂŒhte haru, mille vahel on vĂ€ike ajavahemik, vĂ”ib vana commit ehitada hiljem kui uuem: vana versioon katab uue Git-haru sildi alla. Sellised probleemid vĂ”ivad lahendada CI/CD-sĂŒsteem (nt GitLab CI, kus jĂ€rjestikuste commit'ide jaoks kĂ€ivitatakse torujuhe viimase jaoks). Kuid mitte kĂ”ik sĂŒsteemid ei toetada seda ja peaks olema usaldusvÀÀrsem viis selliste fundamentaalsete probleemide vĂ€ltimiseks.
Mis on sisu pÔhine sildistamine?
Nii et, mis on sisu pĂ”hine sildistamine â sildistamine sisu pĂ”hjal.
Docker-siltide loomiseks kasutatakse mitte Git'i primitiive (Git-haru, Git-silt...), vaid kontrollsumma, mis on seotud:
- pildi sisuga. Pildi sildi identifikaator peegeldab selle sisu. Uue versiooni ehitamisel ei muutu see identifikaator, kui pildis ei muutu failid;
- selle pildi loomise ajalooga Git'is. Erinevatesse Git-harudesse ja erineva ehitusajaloo kaudu werf seotud pildid omavad erinevaid sildi identifikaatoreid.
Sellise identifikaatori sildina esindab nii öeldud etapi allkiri.
Iga pilt koosneb etappide kogumist: from, before-install, git-archive, install, imports-after-install, before-setup,⊠git-latest-patch jne. Igal etapil on identifikaator, mis peegeldab selle sisu â etapi allkiri (etapi allkiri).
LĂ”plik pilt, mis koosneb nendest etappidest, on sildistatud nii öeldud etappide kogumi allkirja â etappide allkiri, â mis on ĂŒldine kĂ”igi pildi etappide jaoks.
Igal pildil konfigureerimise jÀrgi werf.yaml on tavaliselt oma selline allkiri ja vastavalt Docker-silt.
Etapi allkiri lahendab kÔik eeltoodud probleemid:
- On resistentne tĂŒhi Git-commit'ide suhtes.
- On resistentne Git-commit'ide suhtes, mis muudavad faile, mis ei ole pildile asjakohased.
- Ei too kaasa probleemi kehtiva pildi versiooni katmisest, kui taaskÀivitada ehitusi vanade Git-commit'ide jaoks harust.
NĂŒĂŒd on see soovitatav mĂ€rgistamisstrateegia ja seda kasutatakse vaikimisi werf'is kĂ”igis CI-sĂŒsteemides.
Kuidas lubada ja kasutada werf'is
Tegelikult sai see valik meeskonna poolt werf publish: --tag-by-stages-signature=true|false
CI-sĂŒsteemis mÀÀratakse mĂ€rgistamisstrateegia kĂ€suga werf ci-env. Varem mÀÀrati selle jaoks parameeter werf ci-env --tagging-strategy=tag-or-branch. NĂŒĂŒd, kui nĂ€idatakse werf ci-env --tagging-strategy=stages-signature vĂ”i ei nĂ€idata seda valikut, siis werf kasutab vaikimisi mĂ€rgistamisstrateegiat stages-signature. KĂ€sk werf ci-env seadistab automaatselt vajalikud lipud kĂ€sule werf build-and-publish (vĂ”i werf publish), seega ei ole nende kĂ€skude jaoks tĂ€iendavaid valikuid vaja nĂ€idata.
NÀiteks kÀsk:
werf publish --stages-storage :local --images-repo registry.hello.com/web/core/system --tag-by-stages-signature⊠vÔib luua jÀrgmised kujutised:
-
registry.hello.com/web/core/system/backend:4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d -
registry.hello.com/web/core/system/frontend:f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6
Siin 4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d â see on pildistamise etapi signatuur backend, vaid f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6 â etapi signatuur pildi jaoks frontend.
Kasutades spetsiaalseid funktsioone werf_container_image ja werf_container_env Helmi mallides ei pea midagi muutma: need funktsioonid genereerivad automaatselt Ôiged pildinimed.
NĂ€ide CI-sĂŒsteemi konfiguratsioonist:
type multiwerf && source <(multiwerf use 1.1 beta)
type werf && source <(werf ci-env gitlab)
werf build-and-publish|deployRohkema teabe jaoks seadistamise kohta on saadaval dokumentatsioon:
- ;
- ;
- .
KokkuvÔttes
- Uus valik
werf publish --tag-by-stages-signature=true|false. - Uue valiku vÀÀrtus
werf ci-env --tagging-strategy=stages-signature|tag-or-branch(kui ei nÀidata, siis kasutatakse vaikimisistages-signature). - Kui varem kasutati Git-kinnitustega mÀrgistamisvalikuid (
WERF_TAG_GIT_COMMITvĂ”i valikutwerf publish --tag-git-commit COMMIT), peab kindlasti ĂŒle minema mĂ€rgistamisstrateegiale stages-signature. - Uued projektid on parem kohe uuele mĂ€rgistamisstruktuurile ĂŒle viia.
- Vanad projektid oleks soovitatav viia over werf 1.1, kuid vana tag-or-branch jÀtkub endiselt.
Sisu pÔhine mÀrgistamine lahendab artiklis kÀsitletud kÔik probleemid:
- Docker-tagi nime vastupidavus tĂŒhjade Git-kinnituste suhtes.
- Docker-tagi nime vastupidavus Git-kinnituste suhtes, mis muudavad mitteolulisi faile pildile.
- Ei tekita probleeme, kui vana Git-commitide jaoks kÀivitate ehitusi ja versiooni pildistamine ei toimi.
Kasutage! Ja Ă€rge unustage meid kĂŒlastada , et luua issue vĂ”i leida juba olemasolev, anda pluss, luua PR vĂ”i lihtsalt jĂ€lgida projekti arengut.
P.S.
Lugege ka meie blogist:
- «»
- «»
- «»;
- Uuenduste mĂ€rkmete tsĂŒkkel werf-is:
- «»;
- «»;
- «»;
- «».
Allikas: habr.com
