{"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\/cs\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet","title":{"rendered":"Tagov\u00e1n\u00ed zalo\u017een\u00e9 na obsahu ve sb\u011brn\u00e9m n\u00e1stroji werf: pro\u010d a jak to funguje?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Tagov\u00e1n\u00ed zalo\u017een\u00e9 na obsahu ve sb\u011brn\u00e9m n\u00e1stroji werf: pro\u010d a jak to funguje?\" 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 na\u0161e GitOps CLI n\u00e1stroje s otev\u0159en\u00fdm zdrojov\u00fdm k\u00f3dem pro sestaven\u00ed a doru\u010dov\u00e1n\u00ed aplikac\u00ed do Kubernetes. V <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">verzi v1.1<\/a><\/noindex> byla p\u0159edstavena nov\u00e1 funkce v n\u00e1stroji pro vytv\u00e1\u0159en\u00ed obraz\u016f: \u0161t\u00edtkov\u00e1n\u00ed obraz\u016f podle obsahu nebo <i>content-based tagging<\/i>. Dosud typick\u00e1 sch\u00e9ma \u0161t\u00edtkov\u00e1n\u00ed v werf p\u0159edpokl\u00e1dala \u0161t\u00edtkov\u00e1n\u00ed Docker obraz\u016f podle Git tagu, Git v\u011btve nebo Git commitu. Ale v\u0161echny tyto sch\u00e9mata maj\u00ed nev\u00fdhody, kter\u00e9 nov\u00e1 strategie \u0161t\u00edtkov\u00e1n\u00ed zcela \u0159e\u0161\u00ed. Podrobnosti o n\u00ed a pro\u010d je tak dobr\u00e1 \u2014 n\u00ed\u017ee.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Nasazen\u00ed sady mikroslu\u017eeb z jednoho Git repozit\u00e1\u0159e<\/h2>\n<p>\n\u010casto se setk\u00e1v\u00e1me se situac\u00ed, kdy je aplikace rozd\u011blena na v\u00edce \u010di m\u00e9n\u011b nez\u00e1visl\u00fdch slu\u017eeb. Uvoln\u011bn\u00ed t\u011bchto slu\u017eeb m\u016f\u017ee prob\u00edhat nez\u00e1visle: najednou m\u016f\u017ee b\u00fdt uvoln\u011bna jedna nebo v\u00edce slu\u017eeb, zat\u00edmco ostatn\u00ed by m\u011bly pokra\u010dovat v provozu bez jak\u00fdchkoli zm\u011bn. Ale z pohledu uchov\u00e1v\u00e1n\u00ed k\u00f3du a spr\u00e1vy projektu je v\u00fdhodn\u011bj\u0161\u00ed dr\u017eet takov\u00e9 slu\u017eby aplikace v jednom repozit\u00e1\u0159i.<\/p>\n<p>Jsou situace, kdy jsou slu\u017eby skute\u010dn\u011b nez\u00e1visl\u00e9 a nejsou spojeny s jednou aplikac\u00ed. V takov\u00e9m p\u0159\u00edpad\u011b budou um\u00edst\u011bny v odd\u011blen\u00fdch projektech a jejich uvoln\u011bn\u00ed bude realizov\u00e1no prost\u0159ednictv\u00edm samostatn\u00fdch proces\u016f CI\/CD v ka\u017ed\u00e9m projektu.<\/p>\n<p>Ve skute\u010dnosti v\u0161ak v\u00fdvoj\u00e1\u0159i \u010dasto rozd\u011bluj\u00ed jednu aplikaci na n\u011bkolik mikroslu\u017eeb, ale vytv\u00e1\u0159en\u00ed zvl\u00e1\u0161tn\u00edho repozit\u00e1\u0159e a projektu pro ka\u017edou z nich\u2026 je zjevn\u00fd overkill. O t\u00e9to situaci se bude d\u00e1le hovo\u0159it: n\u011bkolik takov\u00fdch mikroslu\u017eeb le\u017e\u00ed v jednom repozit\u00e1\u0159i projektu a uvoln\u011bn\u00ed prob\u00edh\u00e1 prost\u0159ednictv\u00edm jedin\u00e9ho procesu v CI\/CD.<\/p>\n<h3>\u0160t\u00edtkov\u00e1n\u00ed podle Git v\u011btve a Git tagu<\/h3>\n<p>\nP\u0159edpokl\u00e1dejme, \u017ee se pou\u017e\u00edv\u00e1 nejroz\u0161\u00ed\u0159en\u011bj\u0161\u00ed strategie \u0161t\u00edtkov\u00e1n\u00ed \u2014 <i>tag-or-branch<\/i>. Pro Git v\u011btve jsou obrazy \u0161t\u00edtkov\u00e1ny n\u00e1zvem v\u011btve, pro jednu v\u011btev v jeden okam\u017eik existuje pouze jeden publikovan\u00fd obraz se jm\u00e9nem t\u00e9to v\u011btve. Pro Git tagy jsou obrazy \u0161t\u00edtkov\u00e1ny podle n\u00e1zvu tagu.<\/p>\n<p>P\u0159i vytv\u00e1\u0159en\u00ed nov\u00e9ho Git tagu \u2014 nap\u0159\u00edklad p\u0159i vyd\u00e1n\u00ed nov\u00e9 verze \u2014 pro v\u0161echny obrazy projektu v Docker Registry bude vytvo\u0159en nov\u00fd Docker tag:<\/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>\nTato nov\u00e1 jm\u00e9na obraz\u016f jsou p\u0159es Helm \u0161ablony integrov\u00e1na do konfigurace Kubernetes. P\u0159i spu\u0161t\u011bn\u00ed nasazen\u00ed p\u0159\u00edkazem <code>werf deploy<\/code> doch\u00e1z\u00ed k aktualizaci pole <code>obr\u00e1zek<\/code> v manifestech prost\u0159edk\u016f Kubernetes a restartu odpov\u00eddaj\u00edc\u00edch prost\u0159edk\u016f kv\u016fli zm\u011bn\u011bn\u00e9mu jm\u00e9nu obrazu.<\/p>\n<p><b>Probl\u00e9m<\/b>: v p\u0159\u00edpad\u011b, \u017ee se skute\u010dn\u011b obsah obrazu z p\u0159edchoz\u00edho nasazen\u00ed (Git tagu) nezm\u011bnil, pouze jeho Docker tag, dojde k <i>zbyte\u010dn\u00e9mu<\/i> restartu t\u00e9to aplikace a t\u00edm p\u00e1dem je mo\u017en\u00fd ur\u010dit\u00fd prostoj. A\u010dkoli nebyly \u017e\u00e1dn\u00e9 skute\u010dn\u00e9 d\u016fvody pro prov\u00e1d\u011bn\u00ed tohoto restartu.<\/p>\n<p>V d\u016fsledku aktu\u00e1ln\u00edho sch\u00e9matu ozna\u010dov\u00e1n\u00ed je nutn\u00e9 vytvo\u0159it n\u011bkolik samostatn\u00fdch Git repozit\u00e1\u0159\u016f a vzn\u00e1\u0161\u00ed se probl\u00e9m organizace nasazov\u00e1n\u00ed t\u011bchto n\u011bkolika repozit\u00e1\u0159\u016f. Celkov\u011b je takov\u00e9 sch\u00e9ma ne\u00fam\u011brn\u011b slo\u017eit\u00e9 a komplikovan\u00e9. Je lep\u0161\u00ed spojit v\u00edce slu\u017eeb do jednoho repozit\u00e1\u0159e a vytvo\u0159it takov\u00e9 Docker tagy, aby nedoch\u00e1zelo k zbyte\u010dn\u00fdm restart\u016fm.<\/p>\n<h3>Ozna\u010dov\u00e1n\u00ed podle Git commitu<\/h3>\n<p>\nV werf je tak\u00e9 p\u0159\u00edtomna strategie ozna\u010dov\u00e1n\u00ed spojen\u00e1 s Git commity.<\/p>\n<p>Git commit je identifik\u00e1tor obsahu Git repozit\u00e1\u0159e a z\u00e1vis\u00ed na historii \u00faprav soubor\u016f v Git repozit\u00e1\u0159i, proto se zd\u00e1 logick\u00e9 pou\u017e\u00edt jej k ozna\u010dov\u00e1n\u00ed obraz\u016f v Docker Registry.<\/p>\n<p>Nicm\u00e9n\u011b ozna\u010dov\u00e1n\u00ed podle Git commitu m\u00e1 stejn\u00e9 nev\u00fdhody jako ozna\u010dov\u00e1n\u00ed podle Git v\u011btv\u00ed nebo Git tag\u016f:<\/p>\n<ul>\n<li> Mohlo b\u00fdt vytvo\u0159eno pr\u00e1zdn\u00e9 commit, kter\u00fd nem\u011bn\u00ed soubory, ale Docker tag obraz bude zm\u011bn\u011bn.<\/li>\n<li> Mohlo b\u00fdt vytvo\u0159eno merge commit, kter\u00fd nem\u011bn\u00ed soubory, ale Docker tag obraz bude zm\u011bn\u011bn.<\/li>\n<li> Mohlo bylo vytvo\u0159eno commit, kter\u00fd m\u011bn\u00ed soubory v Git, kter\u00e9 nejsou importov\u00e1ny do obrazu, a Docker tag obraz bude op\u011bt zm\u011bn\u011bn.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Ozna\u010dov\u00e1n\u00ed podle jm\u00e9na Git v\u011btve neodr\u00e1\u017e\u00ed verzi obrazu<\/h2>\n<p>\nExistuje tak\u00e9 dal\u0161\u00ed probl\u00e9m spojen\u00fd se strategi\u00ed ozna\u010dov\u00e1n\u00ed podle Git v\u011btv\u00ed.<\/p>\n<p>Ozna\u010dov\u00e1n\u00ed podle jm\u00e9na v\u011btve funguje, dokud jsou commity t\u00e9to v\u011btve shroma\u017e\u010fov\u00e1ny v chronologick\u00e9m po\u0159ad\u00ed.<\/p>\n<p>Pokud u\u017eivatel v aktu\u00e1ln\u00edm sch\u00e9matu spust\u00ed p\u0159estavbu star\u00e9ho commitu spojen\u00e9ho s ur\u010ditou v\u011btv\u00ed, werf p\u0159ep\u00ed\u0161e obraz podle odpov\u00eddaj\u00edc\u00edho Docker tagu nov\u011b sestavenou verz\u00ed obrazu pro star\u00fd commit. Nasazen\u00ed, kter\u00e1 tento tag pou\u017e\u00edvaj\u00ed, od t\u00e9to chv\u00edle riskuj\u00ed, \u017ee b\u011bhem restartu pod\u016f st\u00e1hnou jinou verzi obrazu, v d\u016fsledku \u010deho\u017e na\u0161e aplikace ztrat\u00ed spojen\u00ed s CI syst\u00e9mem a dojde k desynchronizaci.<\/p>\n<p>Krom\u011b toho, p\u0159i s\u00e9riov\u00fdch pushech do jedn\u00e9 v\u011btve s mal\u00fdm \u010dasov\u00fdm odstupem mezi nimi, m\u016f\u017ee b\u00fdt star\u00fd commit sestaven pozd\u011bji ne\u017e nov\u011bj\u0161\u00ed: star\u00e1 verze obrazu p\u0159ep\u00ed\u0161e novou podle tagu Git v\u011btve. Tyto probl\u00e9my m\u016f\u017ee vy\u0159e\u0161it CI\/CD syst\u00e9m (nap\u0159\u00edklad v GitLab CI se pro s\u00e9rii commit\u016f spou\u0161t\u00ed pipeline posledn\u00edho). Av\u0161ak ne v\u0161echny syst\u00e9my tuto funkci podporuj\u00ed a m\u011blo by existovat spolehliv\u011bj\u0161\u00ed zp\u016fsob, jak p\u0159edch\u00e1zet takov\u00e9 z\u00e1kladn\u00ed problematice.<\/p>\n<h2>Co je to ozna\u010dov\u00e1n\u00ed na z\u00e1klad\u011b obsahu?<\/h2>\n<p>\nTak\u017ee, co je to ozna\u010dov\u00e1n\u00ed na z\u00e1klad\u011b obsahu \u2014 ozna\u010dov\u00e1n\u00ed obraz\u016f podle obsahu.<\/p>\n<p>Pro vytvo\u0159en\u00ed Docker tag\u016f se pou\u017e\u00edvaj\u00ed nikoli primitiva Git (Git-v\u011btev, Git-tag\u2026), ale kontroln\u00ed sou\u010det spojen\u00fd s:<\/p>\n<ul>\n<li> <i>obsahem obrazu<\/i>. Identifik\u00e1tor-tag obrazu odr\u00e1\u017e\u00ed jeho obsah. P\u0159i sestaven\u00ed nov\u00e9 verze se tento identifik\u00e1tor nezm\u011bn\u00ed, pokud se v obrazu nezm\u011bnily soubory;<\/li>\n<li> <i>historie vytv\u00e1\u0159en\u00ed tohoto obrazu v Git<\/i>. Obrazy spojen\u00e9 s r\u016fzn\u00fdmi Git v\u011btvemi a r\u016fznou histori\u00ed sestaven\u00ed p\u0159es werf budou m\u00edt r\u016fzn\u00e9 tagy-identifik\u00e1tory.<\/li>\n<\/ul>\n<p>\nJako takov\u00fd tag-identifik\u00e1tor slou\u017e\u00ed tzv. <b>podpis f\u00e1z\u00ed obrazu<\/b>.<\/p>\n<p>Ka\u017ed\u00fd obraz se skl\u00e1d\u00e1 z \u0159ady f\u00e1z\u00ed: <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> atd. Ka\u017ed\u00e1 f\u00e1ze m\u00e1 identifik\u00e1tor, kter\u00fd odr\u00e1\u017e\u00ed jej\u00ed obsah, \u2014 <b>podpis f\u00e1ze<\/b> <i>(stage signature)<\/i>.<\/p>\n<p>Fin\u00e1ln\u00ed obraz, kter\u00fd se skl\u00e1d\u00e1 z t\u011bchto f\u00e1z\u00ed, je ozna\u010den tzv. podpisem souboru t\u011bchto f\u00e1z\u00ed \u2014 <b>stages signature<\/b>, \u2014 kter\u00fd je obecn\u00fd pro v\u0161echny f\u00e1ze obrazu.<\/p>\n<p>Ka\u017ed\u00fd obraz z konfigurace <code>werf.yaml<\/code> bude m\u00edt obecn\u011b sv\u016fj vlastn\u00ed takov\u00fd podpis a odpov\u00eddaj\u00edc\u00ed Docker tag.<\/p>\n<p>Podpis f\u00e1z\u00ed \u0159e\u0161\u00ed v\u0161echny uveden\u00e9 probl\u00e9my:<\/p>\n<ul>\n<li> Je odoln\u00fd v\u016f\u010di pr\u00e1zdn\u00fdm Git commit\u016fm.<\/li>\n<li> Je odoln\u00fd v\u016f\u010di Git commit\u016fm, kter\u00e9 m\u011bn\u00ed soubory, kter\u00e9 nejsou relevantn\u00ed pro obraz.<\/li>\n<li> Nedoch\u00e1z\u00ed k probl\u00e9mu s p\u0159episov\u00e1n\u00edm aktu\u00e1ln\u00ed verze obrazu p\u0159i restartov\u00e1n\u00ed sestaven\u00ed pro star\u00e9 Git commity v\u011btve.<\/li>\n<\/ul>\n<p>\nNyn\u00ed je to doporu\u010den\u00e1 strategie ozna\u010dov\u00e1n\u00ed a ve v\u00fdchoz\u00edm nastaven\u00ed se pou\u017e\u00edv\u00e1 v werf pro v\u0161echny CI syst\u00e9my.<\/p>\n<h2>Jak zapnout a pou\u017e\u00edvat v werf<\/h2>\n<p>\nOdpov\u00eddaj\u00edc\u00ed mo\u017enost byla p\u0159id\u00e1na do p\u0159\u00edkazu <code>werf publish<\/code>: <code>--tag-by-stages-signature=true|false<\/code><\/p>\n<p>Ve CI syst\u00e9mu se strategie ozna\u010dov\u00e1n\u00ed ur\u010duje p\u0159\u00edkazem <code>werf ci-env<\/code>. D\u0159\u00edve se pro n\u011bj ur\u010doval parametr <code>werf ci-env --tagging-strategy=tag-or-branch<\/code>. Nyn\u00ed, pokud zad\u00e1te <code>werf ci-env --tagging-strategy=stages-signature<\/code> nebo nezkontrolujete tuto mo\u017enost, werf ve v\u00fdchoz\u00edm nastaven\u00ed pou\u017eije strategii ozna\u010dov\u00e1n\u00ed <code>stages-signature<\/code>. P\u0159\u00edkaz <code>werf ci-env<\/code> automaticky nastav\u00ed pot\u0159ebn\u00e9 p\u0159\u00edznaky pro p\u0159\u00edkaz <code>werf build-and-publish<\/code> (nebo <code>werf publish<\/code>), proto nen\u00ed t\u0159eba pro tyto p\u0159\u00edkazy uv\u00e1d\u011bt \u017e\u00e1dn\u00e9 dal\u0161\u00ed mo\u017enosti.<\/p>\n<p>Nap\u0159\u00edklad p\u0159\u00edkaz:<\/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 m\u016f\u017ee vytvo\u0159it n\u00e1sleduj\u00edc\u00ed obrazy:<\/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>\nZde <code>4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d<\/code> \u2014 to je signatura f\u00e1z\u00ed obrazu <code>backend<\/code>, a <code>f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6<\/code> \u2014 signatura f\u00e1z\u00ed obrazu <code>frontend<\/code>.<\/p>\n<p>P\u0159i pou\u017eit\u00ed speci\u00e1ln\u00edch funkc\u00ed <code>werf_container_image<\/code> a <code>werf_container_env<\/code> v \u0161ablon\u00e1ch Helm nen\u00ed t\u0159eba nic m\u011bnit: tyto funkce automaticky generuj\u00ed spr\u00e1vn\u00e1 jm\u00e9na obraz\u016f.<\/p>\n<p>P\u0159\u00edklad konfigurace v CI syst\u00e9mu:<\/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>\nV\u00edce informac\u00ed o nastaven\u00ed je k dispozici v dokumentaci:<\/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\">P\u0159\u00edru\u010dka \u2192 Publikace (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\">Pr\u00e1ce s CI\/CD \u2192 Obecn\u00e9 informace \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\">Integrace s GitLab CI\/CD \u2192 .gitlab-ci.yml<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Celkem<\/h2>\n<p><\/p>\n<ul>\n<li> Nov\u00e1 mo\u017enost <code>werf publish --tag-by-stages-signature=true|false<\/code>.<\/li>\n<li> Nov\u00e1 hodnota mo\u017enosti <code>werf ci-env --tagging-strategy=stages-signature|tag-or-branch<\/code> (pokud nen\u00ed uvedeno, pak ve v\u00fdchoz\u00edm nastaven\u00ed bude <code>stages-signature<\/code>).<\/li>\n<li> Pokud d\u0159\u00edve byly pou\u017eity mo\u017enosti ozna\u010dov\u00e1n\u00ed podle Git commit\u016f (<code>WERF_TAG_GIT_COMMIT<\/code> nebo mo\u017enost <code>werf publish --tag-git-commit COMMIT<\/code>), je nutn\u00e9 p\u0159epnout na strategii ozna\u010dov\u00e1n\u00ed <i>stages-signature<\/i>.<\/li>\n<li> Nov\u00e9 projekty je lep\u0161\u00ed hned p\u0159epnout na nov\u00e9 sch\u00e9ma ozna\u010dov\u00e1n\u00ed.<\/li>\n<li> Star\u00e9 projekty p\u0159i p\u0159echodu na werf 1.1 je vhodn\u00e9 p\u0159epnout na nov\u00e9 sch\u00e9ma ozna\u010dov\u00e1n\u00ed, av\u0161ak star\u00e9 <i>tag-or-branch<\/i> je st\u00e1le podporov\u00e1no.<\/li>\n<\/ul>\n<p>\nOzna\u010dov\u00e1n\u00ed na z\u00e1klad\u011b obsahu \u0159e\u0161\u00ed v\u0161echny v \u010dl\u00e1nku uveden\u00e9 probl\u00e9my:<\/p>\n<ul>\n<li> Odolnost n\u00e1zvu Docker tagu v\u016f\u010di pr\u00e1zdn\u00fdm Git commit\u016fm.<\/li>\n<li> Odolnost n\u00e1zvu Docker tagu v\u016f\u010di Git commit\u016fm, kter\u00e9 m\u011bn\u00ed pro obraz nerelevantn\u00ed soubory.<\/li>\n<li> Nedoch\u00e1z\u00ed k probl\u00e9mu s p\u0159episov\u00e1n\u00edm aktu\u00e1ln\u00ed verze obrazu p\u0159i restartov\u00e1n\u00ed sestaven\u00ed pro star\u00e9 Git commity pro Git v\u011btve.<\/li>\n<\/ul>\n<p>\nPou\u017e\u00edvejte! A nezapome\u0148te se k n\u00e1m pod\u00edvat na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">GitHub<\/a><\/noindex>, abyste vytvo\u0159ili issue nebo na\u0161li ji\u017e existuj\u00edc\u00ed, p\u0159idali plus, vytvo\u0159ili PR nebo jednodu\u0161e sledovali v\u00fdvoj projektu.<\/p>\n<h2>P.S.<\/h2>\n<p>\nP\u0159e\u010dt\u011bte si tak\u00e9 n\u00e1\u0161 blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">Vyd\u00e1n\u00ed werf 1.1: vylep\u0161en\u00ed ve sb\u011brn\u00e9m n\u00e1stroji dnes a pl\u00e1ny do budoucna<\/a><\/noindex>\u00bb<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/481306\/\">P\u0159edstavujeme werf 1.0 stable: co m\u00e1 spole\u010dn\u00e9ho s GitOps, stav a pl\u00e1ny<\/a><\/noindex>\u00bb<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 n\u00e1\u0161 n\u00e1stroj pro CI\/CD v Kubernetes (p\u0159ehled a video p\u0159edn\u00e1\u0161ky)<\/a><\/noindex>\u00bb;<\/li>\n<li> Cyklus pozn\u00e1mek o nov\u00fdch funkc\u00edch ve werf:\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/476646\/\">3-cestn\u00e9 slou\u010den\u00ed v werf: nasazen\u00ed v Kubernetes s Helmem \u201ena steroidech\u201c<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/468049\/\">Pou\u017eit\u00ed werf pro nasazen\u00ed komplexn\u00edch Helm chart\u016f<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">Podpora monorepo a multirepo v werf a jak to souvis\u00ed s Docker Registry<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">Sestavovat Docker obrazy v werf nyn\u00ed lze i podle b\u011b\u017en\u00e9ho Dockerfile<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Zdroj: <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 5.0.3 - aioseo.com -->\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\/cs\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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:url\" content=\"https:\/\/prohoster.info\/cs\/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\udd47Tagov\u00e1n\u00ed na z\u00e1klad\u011b obsahu ve sb\u011bra\u010di werf: pro\u010d a jak to funguje? | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/cs\/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":"cs_CZ","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:url":"https:\/\/prohoster.info\/cs\/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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/76769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=76769"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/76769\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/76770"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=76769"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=76769"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=76769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}