Барчасп кардани мундариҷа дар коллектори werf: чаро ва чӣ тавр он кор мекунад?

Барчасп кардани мундариҷа дар коллектори werf: чаро ва чӣ тавр он кор мекунад?

верф Утили кушодаи GitOps CLI барои сохтан ва расонидани барномаҳо ба Kubernetes мебошад. ДАР барориши v1.1 дар коллектори тасвирҳо хусусияти нав ҷорӣ карда шуд: барчасп кардани тасвирҳо аз рӯи мундариҷа ё барчасп дар асоси мундариҷа. То ба ҳол, схемаи маъмулии барчаспкунӣ дар werf тамғагузории тасвирҳои Docker бо теги Git, филиали Git ё Git commit буд. Аммо ҳамаи ин схемаҳо камбудиҳо доранд, ки бо стратегияи нави барчаспҳо комилан ҳал карда мешаванд. Тафсилот дар бораи он ва чаро он хеле хуб аст, дар зери набуред.

Интишори маҷмӯи микросервисҳо аз як анбори Git

Вазъият аксар вақт рух медиҳад, ки барнома ба хидматҳои бештар ё камтар мустақил тақсим карда мешавад. Нашри ин хидматҳо метавонанд мустақилона ба амал оянд: як ё якчанд хидмат метавонад дар як вақт бароварда шавад, дар ҳоле ки боқимондаҳо бояд бидуни тағирот кор кунанд. Аммо аз нуқтаи назари нигоҳдории кодҳо ва идоракунии лоиҳа, нигоҳ доштани чунин хидматҳои барномавӣ дар як репозиторий қулайтар аст.

Ҳолатҳое вуҷуд доранд, ки хидматҳо воқеан мустақиланд ва бо як барнома алоқаманд нестанд. Дар ин ҳолат, онҳо дар лоиҳаҳои алоҳида ҷойгир карда мешаванд ва баровардани онҳо тавассути равандҳои алоҳидаи CI/CD дар ҳар як лоиҳа амалӣ карда мешавад.

Бо вуҷуди ин, дар асл, таҳиягарон аксар вақт як барномаро ба якчанд микросервисҳо тақсим мекунанд, аммо эҷоди як анбор ва лоиҳаи алоҳида барои ҳар як... як чизи аз ҳад зиёд аст. Маҳз ин вазъият минбаъд баррасӣ хоҳад шуд: якчанд чунин микросервисҳо дар як анбори лоиҳа ҷойгиранд ва релизҳо тавассути як раванди ягона дар CI/CD ба амал меоянд.

Барчаспкунӣ аз ҷониби филиали Git ва теги Git

Биёед бигӯем, ки стратегияи маъмултарини тамғагузорӣ истифода мешавад - тег ё филиал. Барои шохаҳои Git, тасвирҳо бо номи филиал нишон дода мешаванд, барои як филиал дар як вақт танҳо як тасвири нашршуда бо номи он филиал мавҷуд аст. Барои барчаспҳои Git, тасвирҳо мувофиқи номи тегҳо қайд карда мешаванд.

Вақте ки теги нави Git сохта мешавад, масалан, вақте ки версияи нав бароварда мешавад, теги нави Docker барои ҳама тасвирҳои лоиҳа дар Реестри 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

Ин номҳои нави тасвирҳо тавассути қолибҳои Helm ба конфигуратсияи Kubernetes интиқол дода мешаванд. Ҳангоми оғоз кардани ҷойгиркунӣ бо фармон werf deploy майдон нав карда мешавад image дар манбаи Kubernetes манифест ва аз нав оғоз кардани захираҳои мувофиқ бо сабаби тағир додани номи тасвир.

проблема: дар ҳолате, ки дар асл, мундариҷаи тасвир пас аз паҳншавии қаблӣ тағир наёфта бошад (теги Git), балки танҳо теги Docker он, ин рӯй медиҳад иловагӣ бозоғоз кардани ин барнома ва мувофиқан, каме бекорӣ имконпазир аст. Ҳарчанд ягон сабаби воқеӣ барои иҷрои ин бозсозӣ вуҷуд надошт.

Дар натиҷа, бо схемаи ҷории барчаспкунӣ якчанд анбори алоҳидаи Git-ро девор кардан лозим аст ва мушкили ташкили паҳнкунии ин якчанд анборҳо ба миён меояд. Умуман, чунин схема аз ҳад зиёд ва мураккаб мегардад. Беҳтар аст, ки бисёр хидматҳоро дар як репозиторий муттаҳид кунед ва тегҳои Docker эҷод кунед, то аз нав оғоз кардани нолозим вуҷуд надошта бошад.

Барчаспкунӣ аз ҷониби Git commit

werf инчунин стратегияи барчаспҳои марбут ба Git commits дорад.

Git-commit идентификатор барои мундариҷаи анбори Git аст ва аз таърихи таҳрири файлҳо дар анбори Git вобаста аст, аз ин рӯ истифодаи он барои барчасп кардани тасвирҳо дар Реестри Docker мантиқӣ ба назар мерасад.

Бо вуҷуди ин, барчаспгузорӣ аз ҷониби Git commit дорои нуқсонҳои якхелаест, ки нишонгузорӣ аз шохаҳои Git ё барчаспҳои Git дорад:

  • Уҳдадории холӣ эҷод кардан мумкин аст, ки ягон файлро тағир намедиҳад, аммо теги Docker тасвир тағир дода мешавад.
  • Уҳдадории муттаҳидсозӣ метавон эҷод кард, ки файлҳоро тағир намедиҳад, аммо теги Docker дар тасвир тағир дода мешавад.
  • Уҳдадор шудан мумкин аст, ки он файлҳоро дар Git тағир диҳад, ки ба тасвир ворид карда нашудаанд ва теги Docker тасвир дубора тағир дода мешавад.

Барчасп кардани номи филиали Git версияи тасвирро инъикос намекунад

Мушкилоти дигаре вуҷуд дорад, ки бо стратегияи барчасп барои филиалҳои Git алоқаманд аст.

Барчаспкунӣ аз рӯи номи филиал то он даме, ки ӯҳдадориҳо дар ин филиал бо тартиби хронологӣ ҷамъоварӣ карда мешаванд, кор мекунад.

Агар дар нақшаи ҷорӣ корбар ба барқарор кардани ӯҳдадории кӯҳнае, ки бо як шохаи муайян алоқаманд аст, оғоз кунад, werf тасвирро бо истифода аз теги мувофиқи Docker бо версияи нав сохташудаи тасвир барои ӯҳдадории кӯҳна аз нав менависад. Ҷойгиркуниҳо бо истифода аз ин тег аз ин ба баъд хатари кашидани версияи дигари тасвирро ҳангоми бозоғозкунии подкҳо ба вуҷуд меорад, ки дар натиҷа замимаи мо алоқаи худро бо системаи CI гум мекунад ва ҳамсинхронӣ мешавад.

Илова бар ин, бо телаҳои пайдарпай ба як шоха бо муддати кӯтоҳи байни онҳо, ӯҳдадории кӯҳна метавонад дертар аз навтар тартиб дода шавад: версияи кӯҳнаи тасвир бо истифода аз теғи филиали Git навашро аз нав менависад. Чунин мушкилотро тавассути системаи CI/CD ҳал кардан мумкин аст (масалан, дар GitLab CI лӯлаи охирин барои як қатор супоришҳо ба кор андохта мешавад). Аммо, на ҳама системаҳо инро дастгирӣ мекунанд ва бояд роҳи боэътимоди пешгирии чунин мушкилоти асосӣ вуҷуд дошта бошад.

Барчаспкунии бар асоси мундариҷа чист?

Пас, барчаспҳои бар асоси мундариҷа чист - барчасп кардани тасвирҳо аз рӯи мундариҷа.

Барои эҷоди тегҳои Docker, на примитивҳои Git (шӯъбаи Git, теги Git...) истифода мешаванд, балки маблағи назоратӣ бо:

  • мазмуни тасвир. Теги ID тасвир мундариҷаи онро инъикос мекунад. Ҳангоми сохтани версияи нав, ин идентификатор тағир намеёбад, агар файлҳои тасвир тағир наёфта бошанд;
  • таърихи эҷоди ин тасвир дар Git. Тасвирҳое, ки бо шохаҳои гуногуни Git алоқаманданд ва таърихи гуногуни сохтмон тавассути werf дорои барчаспҳои гуногуни ID мебошанд.

Чунин теги муайянкунанда ба ном аст имзои саҳнаи тасвир.

Ҳар як тасвир аз маҷмӯи марҳилаҳо иборат аст: from, before-install, git-archive, install, imports-after-install, before-setup... git-latest-patch ва ғайра. Ҳар як марҳила идентификатор дорад, ки мундариҷаи онро инъикос мекунад - имзои саҳна (имзои марҳила).

Тасвири ниҳоӣ, ки аз ин марҳилаҳо иборат аст, бо ба истилоҳ имзои маҷмӯи ин марҳилаҳо нишон дода мешавад - марҳилаи имзо, - ки барои хамаи мархалахои тасвир умумият медихад.

Барои ҳар як тасвир аз конфигуратсия werf.yaml дар сурати умумӣ, имзои худ ва мутаносибан теги Docker хоҳад буд.

Имзои саҳна ҳамаи ин мушкилотро ҳал мекунад:

  • Ба супоришҳои холии Git тобовар аст.
  • Муқовимат ба Git ӯҳдадор мешавад, ки файлҳоеро, ки ба тасвир мувофиқ нестанд, тағир медиҳад.
  • Ҳангоми аз нав оғоз кардани сохтмонҳо барои супоридани Git-и кӯҳнаи филиал, ин ба мушкилоти азнавсозии версияи ҷории тасвир оварда намерасонад.

Ин ҳоло стратегияи тавсияшудаи барчаспкунӣ аст ва дар werf барои ҳама системаҳои CI пешфарз аст.

Чӣ тавр дар werf фаъол кардан ва истифода бурдан мумкин аст

Фармон ҳоло варианти мувофиқ дорад werf publish: --tag-by-stages-signature=true|false

Дар системаи CI, стратегияи барчаспкунӣ бо фармон муайян карда мешавад werf ci-env. Пештар, барои он параметр муайян карда шуда буд werf ci-env --tagging-strategy=tag-or-branch. Акнун, агар шумо муайян кунед werf ci-env --tagging-strategy=stages-signature ё ин интихобро муайян накунед, werf стратегияи барчаспро ба таври нобаёнӣ истифода мебарад stages-signature. Дастаи werf ci-env барои фармон ба таври худкор байракҳои заруриро муқаррар мекунад werf build-and-publishwerf publish), бинобар ин барои ин фармонҳо ягон имконоти иловагӣ лозим нест.

Масалан, фармон:

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

... метавонад тасвирҳои зеринро эҷод кунад:

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

Ин аст, 4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d имзои мархалахои образ мебошад backendва f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6 - имзои марҳилаҳои тасвир frontend.

Ҳангоми истифодаи функсияҳои махсус werf_container_image и werf_container_env Дар қолибҳои Helm тағир додани чизе лозим нест: ин функсияҳо ба таври худкор номҳои дурусти тасвирро тавлид мекунанд.

Намунаи конфигуратсия дар системаи CI:

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

Маълумоти бештар дар бораи конфигуратсия дар ҳуҷҷатҳо дастрас аст:

Ҳамагӣ

  • Варианти нав werf publish --tag-by-stages-signature=true|false.
  • Арзиши варианти нав werf ci-env --tagging-strategy=stages-signature|tag-or-branch (агар муайян нашуда бошад, пешфарз хоҳад буд stages-signature).
  • Агар шумо қаблан имконоти барчаспро барои Git истифода бурда бошед (WERF_TAG_GIT_COMMIT ё вариант werf publish --tag-git-commit COMMIT), пас боварӣ ҳосил кунед, ки ба стратегияи барчаспҳо гузаред марҳилаҳо-имзо.
  • Беҳтар аст, ки фавран лоиҳаҳои навро ба схемаи нави тамғагузорӣ гузаред.
  • Ҳангоми интиқол ба werf 1.1, тавсия дода мешавад, ки лоиҳаҳои кӯҳна ба схемаи нави барчаспҳо гузаред, аммо кӯҳна тег ё филиал то ҳол дастгирӣ карда мешавад.

Барчаспкунии ба мундариҷа асосёфта ҳамаи мушкилоти дар мақола овардашударо ҳал мекунад:

  • Муқовимати номи теги Docker ба супоришҳои холии Git.
  • Муқовимати номи барчаспҳои Docker ба Git ӯҳдадор мешавад, ки файлҳои ба тасвир номувофиқро тағир медиҳанд.
  • Ҳангоми аз нав оғоз кардани сохтмонҳо барои супоридани Git кӯҳна барои шохаҳои Git, ба мушкилоти азнавсозии версияи ҷории тасвир оварда намерасонад.

Онро истифода баред! Ва фаромӯш накунед, ки ба мо ташриф оред GitHubБарои эҷод кардани масъала ё пайдо кардани масъалаи мавҷуда, илова кардани плюс, эҷод кардани PR ё танҳо таҳияи лоиҳаро тамошо кунед.

PS

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ