Tag ki baze sou kontni nan werf builder: poukisa ak ki jan li travay?

Tag ki baze sou kontni nan werf builder: poukisa ak ki jan li travay?

werf se sous ouvè GitOps CLI sèvis piblik nou an pou bati ak livrezon aplikasyon pou Kubernetes. NAN lage v1.1 yon nouvo karakteristik te prezante nan pèseptè a imaj: tag imaj pa kontni oswa etikèt ki baze sou kontni. Jiska kounye a, konplo tagging tipik nan werf te enplike balisage imaj Docker pa Git tag, Git branch oswa Git commit. Men, tout rapid sa yo gen dezavantaj ki konplètman rezoud pa nouvo estrateji tagging la. Detay sou li ak poukisa li tèlman bon yo anba koupe a.

Woule yon seri mikwosèvis ki soti nan yon sèl repozitwa Git

Yon sitiyasyon souvan rive lè yon aplikasyon divize an plizyè sèvis plis oswa mwens endepandan. Lage sèvis sa yo ka fèt poukont yo: youn oswa plizyè sèvis yo ka lage alafwa, pandan y ap rès yo dwe kontinye travay san okenn chanjman. Men, nan pwen de vi nan depo kòd ak jesyon pwojè, li pi pratik kenbe sèvis aplikasyon sa yo nan yon depo sèl.

Gen sitiyasyon kote sèvis yo vrèman endepandan epi yo pa asosye ak yon sèl aplikasyon. Nan ka sa a, yo pral lokalize nan pwojè separe epi yo pral lage yo dwe fèt atravè pwosesis CI/CD separe nan chak nan pwojè yo.

Sepandan, an reyalite, devlopè yo souvan divize yon sèl aplikasyon an plizyè mikwosèvis, men kreye yon depo separe ak pwojè pou chak ... se yon twòp klè. Se sitiyasyon sa a ki pral diskite pi lwen: plizyè mikwosèvis sa yo sitiye nan yon sèl depo pwojè ak degaje yo fèt atravè yon sèl pwosesis nan CI/CD.

Tagging pa Git branch ak Git tag

Ann di yo itilize estrateji tagging ki pi komen an - tag-oswa-branch. Pou branch Git, imaj yo make ak non branch lan, pou yon branch nan yon moman gen sèlman yon imaj pibliye pa non branch sa a. Pou tag Git, imaj yo make dapre non tag la.

Lè yo kreye yon nouvo tag Git—pa egzanp, lè yo pibliye yon nouvo vèsyon—yo pral kreye yon nouvo tag Docker pou tout imaj pwojè ki nan Rejis Docker:

  • 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

Nouvo non imaj sa yo pase nan modèl Helm nan konfigirasyon Kubernetes la. Lè kòmanse deplwaman an ak lòd la werf deploy jaden an ap mete ajou image nan Kubernetes manifeste resous ak rekòmanse resous korespondan yo akòz non imaj la chanje.

pwoblèm: nan ka a lè, an reyalite, sa ki nan imaj la pa chanje depi deplwaye anvan an (Git tag), men sèlman tag Docker li yo, sa rive. siplemantè rekòmanse aplikasyon sa a epi, kòmsadwa, gen kèk D 'se posib. Malgre ke pa te gen okenn rezon reyèl pou fè rekòmanse sa a.

Kòm yon rezilta, ak konplo balisage aktyèl la li nesesè pou klotire plizyè depo Git separe ak pwoblèm nan rive nan òganize deplwaman sa yo plizyè depo. An jeneral, tankou yon konplo vire soti yo dwe twò chaje ak konplèks. Li pi bon pou konbine anpil sèvis nan yon sèl repozitwa epi kreye tags Docker pou pa gen okenn rekòmanse nesesè.

Tagging pa Git komèt

werf tou gen yon estrateji tagging ki asosye ak Git commits.

Git-commit se yon idantifyan pou sa ki nan yon repozitwa Git epi li depann de istwa a edite nan dosye ki nan repozitwa Git la, kidonk li sanble lojik yo sèvi ak li pou make imaj nan Rejis Docker la.

Sepandan, tag pa Git commit gen menm dezavantaj ak tag pa Git branch oswa Git tags:

  • Yo ka kreye yon komite vid ki pa chanje okenn dosye, men tag Docker imaj la pral chanje.
  • Yo ka kreye yon komèt fizyon ki pa chanje dosye yo, men tag Docker imaj la pral chanje.
  • Yo ka fè yon komèt ki chanje dosye sa yo nan Git ki pa enpòte nan imaj la, epi tag Docker imaj la pral chanje ankò.

Tagging Git non branch pa reflete vèsyon imaj la

Gen yon lòt pwoblèm ki asosye ak estrateji tagging pou branch Git.

Tagging pa non branch travay toutotan komèt yo sou branch sa yo kolekte sekans nan lòd kwonolojik.

Si nan konplo aktyèl la itilizatè a kòmanse rebati yon ansyen komite ki asosye ak yon branch sèten, Lè sa a, werf pral reekri imaj la lè l sèvi avèk tag Docker ki koresponn lan ak yon vèsyon ki fèk bati nan imaj la pou ansyen komite a. Deplwaman ki sèvi ak tag sa a depi kounye a gen risk pou yo rale yon vèsyon diferan nan imaj la lè rekòmanse gous, kòm yon rezilta aplikasyon nou an ap pèdi koneksyon ak sistèm CI a epi yo vin desincronize.

Anplis de sa, ak pouse siksesif nan yon sèl branch ak yon peryòd tan kout ant yo, ansyen komèt la ka konpile pita pase yon sèl la ki pi nouvo: vèsyon an ansyen nan imaj la pral ranplase nouvo a lè l sèvi avèk tag la Git branch. Pwoblèm sa yo ka rezoud pa yon sistèm CI/CD (pa egzanp, nan GitLab CI tiyo lèt la te lanse pou yon seri de komèt). Sepandan, se pa tout sistèm sipòte sa a epi yo dwe gen yon fason ki pi serye pou anpeche yon pwoblèm fondamantal konsa.

Ki sa ki baze sou kontni tag?

Se konsa, ki sa ki baze sou kontni tag - tag imaj pa kontni.

Pou kreye tags Docker, se pa primitif Git (branch Git, tag Git...) yo itilize, men yon sòm chèk ki asosye ak:

  • sa ki nan imaj la. Tag ID imaj la reflete kontni li yo. Lè w ap bati yon nouvo vèsyon, idantifyan sa a pa pral chanje si dosye yo nan imaj la pa chanje;
  • istwa nan kreye imaj sa a nan Git. Imaj ki asosye ak diferan branch Git ak diferan istwa bati atravè werf pral gen tag ID diferan.

Tankou yon tag idantifyan se sa yo rele an siyati etap imaj.

Chak imaj konsiste de yon seri etap: from, before-install, git-archive, install, imports-after-install, before-setup, ... git-latest-patch elatriye. Chak etap gen yon idantifyan ki reflete sa li yo - siyati etap la (siyati etap).

Imaj final la, ki fòme ak etap sa yo, make ak siyati sa yo rele seri etap sa yo - etap siyati, - ki se jeneralize pou tout etap nan imaj la.

Pou chak imaj ki soti nan konfigirasyon an werf.yaml an ka jeneral, pral gen siyati pwòp li yo ak, kòmsadwa, yon tag Docker.

Siyati etap la rezoud tout pwoblèm sa yo:

  • Rezistan nan komèt Git vid.
  • Rezistan a Git komèt ki chanje dosye ki pa gen rapò ak imaj la.
  • Pa mennen nan pwoblèm nan ekzamine vèsyon aktyèl la nan imaj la lè rekòmanse bati pou ansyen Git komèt nan yon branch.

Sa a se kounye a estrateji tagging rekòmande epi li se default nan werf pou tout sistèm CI.

Ki jan yo pèmèt ak itilize nan werf

Kòmandman an kounye a gen yon opsyon korespondan werf publish: --tag-by-stages-signature=true|false

Nan yon sistèm CI, kòmandman an espesifye estrateji tagging la werf ci-env. Précédemment, paramèt la te defini pou li werf ci-env --tagging-strategy=tag-or-branch. Koulye a, si ou presize werf ci-env --tagging-strategy=stages-signature oswa pa presize opsyon sa a, werf pral sèvi ak estrateji nan tag pa default stages-signature. Ekip werf ci-env pral otomatikman mete drapo ki nesesè pou lòd la werf build-and-publish (Oswa werf publish), kidonk pa gen okenn opsyon adisyonèl bezwen espesifye pou kòmandman sa yo.

Pou egzanp, kòmandman an:

werf publish --stages-storage :local --images-repo registry.hello.com/web/core/system --tag-by-stages-signature

... ka kreye imaj sa yo:

  • registry.hello.com/web/core/system/backend:4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d
  • registry.hello.com/web/core/system/frontend:f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6

Isit la 4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d se yon siyati etap yo nan imaj la backendAk f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6 - siyati etap imaj yo frontend.

Lè w ap itilize fonksyon espesyal werf_container_image и werf_container_env Pa gen okenn nesesite pou chanje anyen nan modèl Helm yo: fonksyon sa yo pral otomatikman jenere non imaj kòrèk yo.

Egzanp konfigirasyon nan yon sistèm CI:

type multiwerf && source <(multiwerf use 1.1 beta)
type werf && source <(werf ci-env gitlab)
werf build-and-publish|deploy

Gen plis enfòmasyon sou konfigirasyon ki disponib nan dokiman an:

Nan total

  • Nouvo opsyon werf publish --tag-by-stages-signature=true|false.
  • Nouvo valè opsyon werf ci-env --tagging-strategy=stages-signature|tag-or-branch (si yo pa espesifye, default la pral stages-signature).
  • Si ou te deja itilize opsyon tag pou Git commits (WERF_TAG_GIT_COMMIT oswa opsyon werf publish --tag-git-commit COMMIT), Lè sa a, asire w ke ou chanje nan estrateji nan balisage etap-siyati.
  • Li pi bon imedyatman chanje nouvo pwojè nan nouvo konplo tagging la.
  • Lè w transfere nan werf 1.1, li rekòmande pou chanje ansyen pwojè yo nan nouvo konplo tagging la, men ansyen an. tag-oswa-branch se toujou sipòte.

Tag ki baze sou kontni rezoud tout pwoblèm ki kouvri nan atik la:

  • Docker tag non rezistans nan komèt Git vid.
  • Rezilyans nan non tag Docker nan Git komèt ki chanje dosye ki pa enpòtan pou imaj la.
  • Pa mennen nan pwoblèm nan ekzamine vèsyon aktyèl la nan imaj la lè rekòmanse bati pou ansyen Git komèt pou branch Git.

Itilize l! Epi pa bliye vizite nou nan GitHubpou kreye yon pwoblèm oswa jwenn yon ki egziste deja, ajoute yon plis, kreye yon PR oswa tou senpleman gade devlopman nan pwojè a.

PS

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè