{"id":76769,"date":"2020-04-04T13:42:27","date_gmt":"2020-04-04T11:42:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet"},"modified":"2020-04-04T13:42:27","modified_gmt":"2020-04-04T11:42:27","slug":"content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet","title":{"rendered":"Sisu p\u00f5hine m\u00e4rgistamine werf kogujas: miks ja kuidas see t\u00f6\u00f6tab?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Sisu p\u00f5hine m\u00e4rgistamine werf kogujas: miks ja kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2020\/04\/494346bbee96cc2b6c838491ba1c67fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/werf.io\/\">werf<\/a><\/noindex> \u2014 meie GitOps CLI t\u00f6\u00f6riist, millel on avatud kood, et ehitada ja tarnida rakendusi Kubernetesesse. V <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">v\u00e4ljalaskes v1.1<\/a><\/noindex> tutvustati uut funktsiooni piltide koostamisel: piltide m\u00e4rgistamine sisu v\u00f5i <i>sisu p\u00f5hine m\u00e4rgistamine<\/i>. Varasemalt eeldas t\u00fc\u00fcpiline m\u00e4rgistamisplaan werf'is, et Docker-pilte m\u00e4rgistatakse Git'i sildi, Git'i haru v\u00f5i Git'i commit'e j\u00e4rgi. Kuid k\u00f5igil neil skeemidel on puudused, mille lahendab t\u00e4ielikult uus m\u00e4rgistamisstrateegia. \u00dcksikasjad sellest ja miks see on nii hea \u2014 allpool.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Mikroteenuste komplekti v\u00e4ljat\u00f6\u00f6tamine \u00fchest Git-repositoriumist<\/h2>\n<p>\nSageli esineb olukord, kus rakendus on jagatud mitmeks enam-v\u00e4hem iseseiliseks teenuseks. Nende teenuste v\u00e4ljalaskmine v\u00f5ib toimuda iseseisvalt: korraga v\u00f5ib v\u00e4lja lasta \u00fche v\u00f5i mitu teenust, samal ajal kui teised peavad j\u00e4tkama t\u00f6\u00f6d ilma muudatusteta. Kuid koodi salvestamise ja projekti juhtimise seisukohalt on mugavam hoida selliseid rakenduse teenuseid \u00fches repos.<\/p>\n<p>On olukordi, kus teenused on t\u00f5eliselt iseseisvad ja ei ole seotud \u00fche rakendusega. Sel juhul asuvad need eraldi projektides ning nende v\u00e4ljaandmine toimub iga projekti kaudu eraldi CI\/CD protsesside kaudu.<\/p>\n<p>Kuid tegelikkuses jagavad arendajad sageli \u00fchte rakendust mitmeks mikroteenuseks, kuid iga\u00fche jaoks eraldi hoidla ja projekti loomine\u2026 on ilmselge \u00fcleliialdus. Just sellest olukorrast juttu tuleb: mitu sellist mikroteenust asub \u00fches projektis ja v\u00e4ljaanded toimuvad l\u00e4bi \u00fchtse CI\/CD protsessi.<\/p>\n<h3>Tegimine Git haru ja Git sildiga<\/h3>\n<p>\nOletame, et kasutatakse k\u00f5ige levinumat sildistamisstrateegiat \u2014 <i>tag-or-branch<\/i>. Git harude puhul sildistatakse pildid haru nimega, \u00fche haru kohta eksisteerib hetkel ainult \u00fcks avaldatud pilt selle haru nimega. Git siltide puhul sildistatakse pildid vastavalt sildi nimega.<\/p>\n<p>Uue Git-sildi loomisel \u2014 n\u00e4iteks uue versiooni v\u00e4ljalaskmisel \u2014 luuakse k\u00f5igi projekti piltide jaoks Docker Registry's uus Docker-silt:<\/p>\n<ul>\n<li> <code>myregistry.org\/myproject\/frontend:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/myservice1:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/myservice2:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/myservice3:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/myservice4:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/myservice5:v1.1.10<\/code><\/li>\n<li> <code>myregistry.org\/myproject\/database:v1.1.10<\/code><\/li>\n<\/ul>\n<p>\nNeed uurde uued pildid sekod Helem malli kaudu Kubernetes'i konfiguratsiooni. K\u00e4ivitamisel deployment'i k\u00e4suga <code>werf deploy<\/code> uuendatakse <code>pilt<\/code> Kubernetes'i ressursimainetes ja vastavate ressursside taask\u00e4ivitamine seoses pildi nime muutumisega.<\/p>\n<p><b>Probleem<\/b>: juhul, kui eelmisest v\u00e4ljalaskmisest (Git-silt) ei muutu pildi sisu, vaid ainult selle Docker-silt, toimub <i>liigne<\/i> taask\u00e4ivitamine ning vastavalt on v\u00f5imalik m\u00f5ningane lihtne. Kuigi pole olnud reaalseid p\u00f5hjuseid selle taask\u00e4ivitamise tegemiseks.<\/p>\n<p>Seet\u00f5ttu, praeguse silti-m\u00e4\u00e4ramise skeemi korral tuleb kasutada mitut eraldi Git-repositooriumi ja tekib mitme repositooriumi v\u00e4ljalaskmise korraldamise probleem. \u00dcldiselt on selline skeem \u00fclekoormatud ja keeruline. Parim on \u00fchendada mitmed teenused \u00fchte repositooriumisse ja teha selliseid Docker-silte, et v\u00e4ltida liigseid taask\u00e4ivitamisi.<\/p>\n<h3>Siltimine Git-kommi kaudu<\/h3>\n<p>\nWerf'is on samuti silti-m\u00e4\u00e4ramise strateegia, mis on seotud Git-kommidega.<\/p>\n<p>Git commit on Git-repo sisu identifikaator ja s\u00f5ltub Git-reposi failide muudatuste ajaloost, seega tundub loogiline kasutada seda Docker Registry piltide m\u00e4rgistamiseks.<\/p>\n<p>Kuid Git commit'il p\u00f5hinev m\u00e4rgistamine omab samu puudusi kui Git harude v\u00f5i Git t\u00e4histe puhul:<\/p>\n<ul>\n<li> V\u00f5ib olla loodud t\u00fchi commit, mis ei muuda faile, ja Docker-pildi silt muutub.<\/li>\n<li> V\u00f5ib olla loodud merge commit, mis ei muuda faile, ja Docker-pildi silt muutub.<\/li>\n<li> V\u00f5ib olla loodud commit, mis muudab Git'is faile, mis ei impordita pildile, ja Docker-pildi silt muutub j\u00e4lle.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Harunime p\u00f5hinev m\u00e4rgistamine ei kajasta pildi versiooni.<\/h2>\n<p>\nOn veel \u00fcks probleem, mis on seotud harunime p\u00f5hise m\u00e4rgistamisstrateegiaga.<\/p>\n<p>Harunime p\u00f5hine m\u00e4rgistamine t\u00f6\u00f6tab seni, kuni selle haru commit'id kogutakse j\u00e4rjestikku kronoloogilises j\u00e4rjekorras.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0445\u0435\u043c\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u043f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0443 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0435\u0442\u043a\u043e\u0439, \u0442\u043e werf \u043f\u0435\u0440\u0435\u0442\u0440\u0435\u0442 \u043e\u0431\u0440\u0430\u0437 \u043f\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 Docker-\u0442\u0435\u0433\u0443 \u0432\u043d\u043e\u0432\u044c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 \u044d\u0442\u043e\u0442 \u0442\u0435\u0433 Deployment&#8217;\u044b \u0441 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0440\u0438\u0441\u043a\u0443\u044e\u0442 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 pod&#8217;\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u0442\u044c pull \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043e\u0431\u0440\u0430\u0437\u0430, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0447\u0435\u0433\u043e \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0435\u0442 \u0441\u0432\u044f\u0437\u044c \u0441 CI-\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u0440\u0430\u0441\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>Lisaks, kui \u00fchte haru surutakse j\u00e4rjestikku l\u00fchikese ajavahega, v\u00f5ib vana commit tulla v\u00e4lja hiljem kui uuem: vana pildi versioon asendab uue Git-haru sildi j\u00e4rgi. Selliseid probleeme v\u00f5ib lahendada CI\/CD-s\u00fcsteem (n\u00e4iteks GitLab CI puhul k\u00e4ivitub viimasest commit'st pipeline). Kuid mitte k\u00f5ik s\u00fcsteemid ei toeta seda ning peab olema usaldusv\u00e4\u00e4rsem viis selliste p\u00f5hiprobleemide v\u00e4ltimiseks.<\/p>\n<h2>Mis on sisup\u00f5hine sildistamine?<\/h2>\n<p>\nNii et mis on sisup\u00f5hine sildistamine \u2014 piltide sildistamine sisu alusel.<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Docker-\u0442\u0435\u0433\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b Git&#8217;\u0430 (Git-\u0432\u0435\u0442\u043a\u0430, Git-\u0442\u0435\u0433\u2026), \u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441:<\/p>\n<ul>\n<li> <i>pildi sisuga<\/i>. Pildi identifikaatori silt kajastab selle sisu. Uue versiooni koostamisel ei muutu see identifikaator, kui pildis ei ole faile muudetud;<\/li>\n<li> <i>selle pildi loomise ajalooga Git<\/i>. Erinevatest Git-haarudest ja erineva koostamise ajalooga seotud pildid werf'i kaudu saavad erinevad sildid-identifikaatorid.<\/li>\n<\/ul>\n<p>\nSellise identifikaatori silt on nii kutsutud <b>staadiumi allkiri<\/b>.<\/p>\n<p>Iga pilt koosneb staadiumide kogumist: <code>from<\/code>, <code>before-install<\/code>, <code>git-archive<\/code>, <code>install<\/code>, <code>imports-after-install<\/code>, <code>before-setup<\/code>,\u2026 <code>git-latest-patch<\/code> jne. Igal staadiumil on identifikaator, mis kajastab selle sisu, \u2014 <b>staadiumi allkiri<\/b> <i>(stage signature)<\/i>.<\/p>\n<p>L\u00f5plik pilt, mis koosneb nendest staadiumidest, sildistatakse nii nimetatud staadiumite kogumi allkirjaga \u2014 <b>stages signature<\/b>, \u2014 mis on \u00fcldistav k\u00f5igi pildi staadiumide jaoks.<\/p>\n<p>Igal pildil, mis on saadud konfiguratsioonist <code>werf.yaml<\/code> , on tavaliselt oma selline allkiri ja seega ka Docker-silt.<\/p>\n<p>Staadiumi allkiri lahendab k\u00f5ik eespool nimetatud probleemid:<\/p>\n<ul>\n<li> On vastupidav t\u00fchjade Git-commit'ide suhtes.<\/li>\n<li> On vastupidav Git-commit'ide suhtes, mis muudavad faile, mis ei ole pildile asjakohased.<\/li>\n<li> Ei p\u00f5hjusta probleemi hetke pildi versiooni kattumisega vanade Git-kommiteede harude kogumite taask\u00e4ivitamisel.<\/li>\n<\/ul>\n<p>\nSee on n\u00fc\u00fcd soovitatav sildistamise strateegia ja seda kasutatakse vaikimisi werf'is k\u00f5ikides CI-s\u00fcsteemides.<\/p>\n<h2>Kuidas werf'is sisse l\u00fclitada ja kasutada<\/h2>\n<p>\nSeotud valik ilmnes k\u00e4sule <code>werf publish<\/code>: <code>--tag-by-stages-signature=true|false<\/code><\/p>\n<p>CI-s\u00fcsteemis m\u00e4\u00e4ratakse sildistamise strateegia k\u00e4suga <code>werf ci-env<\/code>. Varasemalt m\u00e4\u00e4rati selle jaoks parameeter <code>werf ci-env --tagging-strategy=tag-or-branch<\/code>. N\u00fc\u00fcd, kui m\u00e4\u00e4rata <code>werf ci-env --tagging-strategy=stages-signature<\/code> v\u00f5i seda valikut mitte m\u00e4\u00e4rata, kasutab werf vaikimisi sildistamise strateegiat <code>stages-signature<\/code>. K\u00e4sk <code>werf ci-env<\/code> seadistab automaatselt vajalikud lipud k\u00e4sule <code>werf build-and-publish<\/code> (v\u00f5i <code>werf publish<\/code>), seega ei ole nende k\u00e4skude jaoks vaja t\u00e4iendavaid valikuid m\u00e4\u00e4rata.<\/p>\n<p>N\u00e4iteks k\u00e4sk:<\/p>\n<pre><code class=\"plaintext\">werf publish --stages-storage :local --images-repo registry.hello.com\/web\/core\/system --tag-by-stages-signature<\/code><\/pre>\n<p>\n\u2026 v\u00f5ib luua j\u00e4rgmised pildid:<\/p>\n<ul>\n<li> <code>registry.hello.com\/web\/core\/system\/backend:4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d<\/code><\/li>\n<li> <code>registry.hello.com\/web\/core\/system\/frontend:f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6<\/code><\/li>\n<\/ul>\n<p>\nSiit <code>4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d<\/code> \u2014 on pildi etappide allkiri <code>tagaosa<\/code>, ja <code>f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6<\/code> \u2014 pildi etappide allkiri <code>eesmine<\/code>.<\/p>\n<p>Kasutades spetsiaalseid funktsioone <code>werf_container_image<\/code> ja <code>werf_container_env<\/code> Helmi mallides ei ole muudatusi vajalikke: need funktsioonid genereerivad automaatselt \u00f5iged pildinimed.<\/p>\n<p>Konfiguratsiooni n\u00e4ide CI-s\u00fcsteemis:<\/p>\n<pre><code class=\"plaintext\">type multiwerf &amp;&amp; source &lt;(multiwerf use 1.1 beta)\ntype werf &amp;&amp; source &lt;(werf ci-env gitlab)\nwerf build-and-publish|deploy<\/code><\/pre>\n<p>\nRohkem teavet seadistamise kohta on saadaval dokumentatsioonis:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/v1.1\/documentation\/reference\/publish_process.html#%D1%82%D0%B5%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BE%D0%B1%D1%80%D0%B0%D0%B7%D0%BE%D0%B2-%D0%BF%D0%BE-%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%BC%D1%83\">K\u00e4siraamat \u2192 Avaldamine (publish)<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/v1.1\/documentation\/reference\/plugging_into_cicd\/overview.html#stages-signature\">CI\/CD-ga t\u00f6\u00f6tamine \u2192 \u00dclevaade \u2192 stages-signature<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.werf.io\/v1.1\/documentation\/guides\/gitlab_ci_cd_integration.html#gitlab-ciyml\">Integratsioon GitLab CI\/CD \u2192 .gitlab-ci.yml<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Kokku<\/h2>\n<p><\/p>\n<ul>\n<li> Uus valik <code>werf publish --tag-by-stages-signature=true|false<\/code>.<\/li>\n<li> Uue valiku v\u00e4\u00e4rtus <code>werf ci-env --tagging-strategy=stages-signature|tag-or-branch<\/code> (kui ei ole m\u00e4\u00e4ratud, siis vaikimisi on <code>stages-signature<\/code>).<\/li>\n<li> Kui enne oli kasutusel Git-commitide p\u00f5hine sildistamine (<code>WERF_TAG_GIT_COMMIT<\/code> v\u00f5i valik <code>werf publish --tag-git-commit COMMIT<\/code>), siis tuleb kindlasti vahetada sildistamistrateegiale <i>stages-signature<\/i>.<\/li>\n<li> Uued projektid on parem kohe uuele sildistamisskeemile \u00fcle viia.<\/li>\n<li> Vanad projektid tasub werf 1.1 kasutusele v\u00f5ttes \u00fcle viia uuele sildistamisskeemile, kuid vana <i>tag-or-branch<\/i> on endiselt toetatud.<\/li>\n<\/ul>\n<p>\nSisu p\u00f5hine sildistamine lahendab k\u00f5ik artiklis k\u00e4sitletud probleemid:<\/p>\n<ul>\n<li> Docker-tagi nime vastupidavus t\u00fchi Git-commitide suhtes.<\/li>\n<li> Docker-tagi nimi p\u00fcsivus Git-commit'ide suhtes, mis muudavad konteineriga mitte seotud faile.<\/li>\n<li> Ei p\u00f5hjusta probleeme olemasoleva konteineri versiooni \u00fcle kirjutamisega vanemate Git-commit'ide v\u00f5i Git-harude ehituste kordamisel.<\/li>\n<\/ul>\n<p>\nKasutage julgelt! Ja \u00e4rge unustage meie juurde vaadata <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">GitHub<\/a><\/noindex>, et luua probleem v\u00f5i leida juba olemasolev, anda plusspoole, esitada PR v\u00f5i lihtsalt j\u00e4lgida projekti arengut.<\/p>\n<h2>P.S.<\/h2>\n<p>\nLugege ka meie blogist:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">Werf 1.1 v\u00e4ljaanne: t\u00e4na parendused ehitajas ja tulevikuplaanid<\/a><\/noindex>\u00bb<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/481306\/\">Esitleme werf 1.0 stable: mis on GitOps'i, staatuse ja plaanide seos<\/a><\/noindex>\u00bb<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 meie CI\/CD t\u00f6\u00f6riist Kubernetesis (\u00fclevaade ja videoettekanne)<\/a><\/noindex>\u00bb;<\/li>\n<li> Werfi uuenduste ring:\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/476646\/\">3-way merge werf'is: Kubernetes'i deploy Helmiga \"steroidide peal\"<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/468049\/\">Werfi kasutamine keerukate Helm-chart'ide v\u00e4lja toomiseks<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">Monorepo ja multirepo tugi werf'is ja kuidas siia sobib Docker Registry<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">Docker-iltide kogumist werfis saab n\u00fc\u00fcd teha ka tavalise Dockerfile'i abil<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/495112\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>werf \u2014 \u043d\u0430\u0448\u0430 GitOps CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 Kubernetes. \u0412 \u0440\u0435\u043b\u0438\u0437\u0435 v1.1 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432: \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u0438\u043b\u0438 content-based tagging. \u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 werf \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0430 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e Git-\u0442\u0435\u0433\u0443, Git-\u0432\u0435\u0442\u043a\u0435 \u0438\u043b\u0438 Git-\u043a\u043e\u043c\u043c\u0438\u0442\u0443. \u041d\u043e \u0443 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0441\u0445\u0435\u043c \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":76770,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-76769","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"werf \u2014 \u043d\u0430\u0448\u0430 GitOps CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 Kubernetes. \u0412 \u0440\u0435\u043b\u0438\u0437\u0435 v1.1 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432: \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u0438\u043b\u0438 content-based tagging. \u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 werf \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0430 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e Git-\u0442\u0435\u0433\u0443, Git-\u0432\u0435\u0442\u043a\u0435 \u0438\u043b\u0438 Git-\u043a\u043e\u043c\u043c\u0438\u0442\u0443. \u041d\u043e \u0443 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0441\u0445\u0435\u043c \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438,\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Content-based tagging \u0432 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0435 werf: \u0437\u0430\u0447\u0435\u043c \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"werf \u2014 \u043d\u0430\u0448\u0430 GitOps CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 Kubernetes. \u0412 \u0440\u0435\u043b\u0438\u0437\u0435 v1.1 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432: \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u0438\u043b\u0438 content-based tagging. \u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 werf \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0430 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e Git-\u0442\u0435\u0433\u0443, Git-\u0432\u0435\u0442\u043a\u0435 \u0438\u043b\u0438 Git-\u043a\u043e\u043c\u043c\u0438\u0442\u0443. \u041d\u043e \u0443 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0441\u0445\u0435\u043c \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438,\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-04T11:42:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-04T11:42:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Sisup\u00f5hine sildistamine werf'i ehitajas: miks ja kuidas see t\u00f6\u00f6tab? | ProHoster","description":"werf on meie avatud l\u00e4htekoodiga GitOps CLI-utiliit, et ehitada ja tarnida rakendusi Kubernetes'i. v1.1 v\u00e4ljaandes tutvustati uut v\u00f5imalust pildi koostamisel: piltide sildistamine sisu p\u00f5hjal ehk content-based tagging. Senine t\u00fc\u00fcpiline sildistamis skeem werf'is t\u00e4hendas Docker-piltide sildistamist Git-sildi, Git-haru v\u00f5i Git-commiti j\u00e4rgi. Kuid k\u00f5igil neil skeemidel on puudused,","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Content-based tagging \u0432 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0435 werf: \u0437\u0430\u0447\u0435\u043c \u0438 \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? | ProHoster","og:description":"werf \u2014 \u043d\u0430\u0448\u0430 GitOps CLI-\u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 Kubernetes. \u0412 \u0440\u0435\u043b\u0438\u0437\u0435 v1.1 \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432: \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u0438\u043b\u0438 content-based tagging. \u0414\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 werf \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u0430 \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e Git-\u0442\u0435\u0433\u0443, Git-\u0432\u0435\u0442\u043a\u0435 \u0438\u043b\u0438 Git-\u043a\u043e\u043c\u043c\u0438\u0442\u0443. \u041d\u043e \u0443 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0441\u0445\u0435\u043c \u0435\u0441\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438,","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-04T11:42:27+00:00","article:modified_time":"2020-04-04T11:42:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"76769","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:30:22","updated":"2022-09-28 05:59:33"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/76769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=76769"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/76769\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/76770"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=76769"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=76769"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=76769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}