{"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\/sq\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet","title":{"rendered":"Etiketimi me baz\u00eb p\u00ebrmbajtjeje n\u00eb mbledh\u00ebsin werf: p\u00ebrse dhe si funksionon?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Etiketimi me baz\u00eb p\u00ebrmbajtjeje n\u00eb mbledh\u00ebsin werf: p\u00ebrse dhe si funksionon?\" 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 nuestra herramienta CLI de GitOps de c\u00f3digo abierto para la construcci\u00f3n y entrega de aplicaciones en Kubernetes. En <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">la versi\u00f3n v1.1<\/a><\/noindex> se introdujo una nueva funcionalidad en el constructor de im\u00e1genes: etiquetado de im\u00e1genes por contenido o <i>content-based tagging<\/i>. Hasta ahora, el esquema t\u00edpico de etiquetado en werf implicaba etiquetar im\u00e1genes de Docker seg\u00fan la etiqueta de Git, la rama de Git o el commit de Git. Pero todos estos esquemas tienen desventajas que se resuelven completamente con la nueva estrategia de etiquetado. Detalles sobre ella y por qu\u00e9 es tan buena se presentan a continuaci\u00f3n.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Despliegue de un conjunto de microservicios desde un \u00fanico repositorio de Git<\/h2>\n<p>\nA menudo se da la situaci\u00f3n en la que una aplicaci\u00f3n est\u00e1 dividida en m\u00faltiples servicios m\u00e1s o menos independientes. Las versiones de estos servicios pueden ocurrir de forma independiente: se puede lanzar una o varias versiones a la vez, mientras que los dem\u00e1s deben seguir funcionando sin cambios. Sin embargo, desde el punto de vista del almacenamiento de c\u00f3digo y la gesti\u00f3n del proyecto, resulta m\u00e1s conveniente mantener tales servicios de la aplicaci\u00f3n en un \u00fanico repositorio.<\/p>\n<p>Hay situaciones en las que los servicios son realmente independientes y no est\u00e1n relacionados con una sola aplicaci\u00f3n. En ese caso, estar\u00e1n ubicados en proyectos separados y su lanzamiento se realizar\u00e1 a trav\u00e9s de diferentes procesos de CI\/CD en cada uno de los proyectos.<\/p>\n<p>Sin embargo, en la pr\u00e1ctica, los desarrolladores a menudo descomponen una \u00fanica aplicaci\u00f3n en varios microservicios, pero crear un repositorio y proyecto separados para cada uno... es un exceso evidente. De esto es de lo que se tratar\u00e1 a continuaci\u00f3n: varios de estos microservicios residen en un \u00fanico repositorio de proyecto y los lanzamientos se realizan a trav\u00e9s de un \u00fanico proceso en CI\/CD.<\/p>\n<h3>Etiquetado por rama de Git y etiqueta de Git<\/h3>\n<p>\nSupongamos que se utiliza la estrategia de etiquetado m\u00e1s com\u00fan \u2014 <i>tag-or-branch<\/i>. Para las ramas de Git, las im\u00e1genes se etiquetan con el nombre de la rama, para una \u00fanica rama en un momento dado existe solo una imagen publicada con el nombre de esa rama. Para las etiquetas de Git, las im\u00e1genes se etiquetan con el nombre de la etiqueta correspondiente.<\/p>\n<p>Al crear una nueva etiqueta de Git \u2014 por ejemplo, al lanzar una nueva versi\u00f3n \u2014 para todas las im\u00e1genes del proyecto en Docker Registry se crear\u00e1 una nueva etiqueta de Docker:<\/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>\nEstos nuevos nombres de imagen llegan a la configuraci\u00f3n de Kubernetes a trav\u00e9s de plantillas de Helm. Al ejecutar el despliegue con el comando <code>werf deploy<\/code> se actualiza el campo <code>image<\/code> en los manifiestos de recursos de Kubernetes y se reinician los recursos correspondientes debido al cambio en el nombre de la imagen.<\/p>\n<p><b>Problemi<\/b>: en el caso de que realmente no se haya cambiado el contenido de la imagen desde el despliegue anterior (etiqueta de Git), sino solo su etiqueta de Docker, ocurre <i>un reinicio<\/i> extra de esta aplicaci\u00f3n y, por lo tanto, puede haber un cierto tiempo de inactividad. Aunque no hubo razones reales para realizar este reinicio.<\/p>\n<p>Si p\u00ebrfundim, me skem\u00ebn aktuale t\u00eb etiketimit \u00ebsht\u00eb e nevojshme t\u00eb krijohen disa depove t\u00eb ndara Git, dhe ndodhet problemi i organizimit t\u00eb lansimit t\u00eb k\u00ebtyre depove t\u00eb shumta. N\u00eb p\u00ebrgjith\u00ebsi, nj\u00eb skem\u00eb e till\u00eb rezulton e mbushur dhe e komplikuar. \u00cbsht\u00eb m\u00eb mir\u00eb t\u00eb bashkohen shum\u00eb sh\u00ebrbime n\u00eb nj\u00eb depo t\u00eb vetme dhe t\u00eb krijohen etiketa Docker n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb mos ket\u00eb rinisje t\u00eb panevojshme.<\/p>\n<h3>Etiketimi sipas Git-commit<\/h3>\n<p>\nN\u00eb werf gjithashtu ekziston nj\u00eb strategji etiketimi e lidhur me Git-commit.<\/p>\n<p>Git-commit \u00ebsht\u00eb identifikuesi i p\u00ebrmbajtjes s\u00eb depozit\u00ebs Git dhe varet nga historia e ndryshimeve t\u00eb skedave n\u00eb depozit\u00ebn Git, prandaj duket logjik t\u00eb p\u00ebrdoret p\u00ebr etiketimin e imazheve n\u00eb Docker Registry.<\/p>\n<p>Megjithat\u00eb, etiketimi sipas Git-commit ka t\u00eb nj\u00ebjtat disavantazhe si ai sipas deg\u00ebve Git ose etiketave Git:<\/p>\n<ul>\n<li> Mund t\u00eb jet\u00eb krijuar nj\u00eb kommit bosh, i cili nuk ndryshon skedar\u00ebt, dhe Docker-etiketimi i imazhit do t\u00eb ndryshohet.<\/li>\n<li> Mund t\u00eb jet\u00eb krijuar nj\u00eb kommit bashkues, i cili nuk ndryshon skedar\u00ebt, dhe Docker-etiketimi i imazhit do t\u00eb ndryshohet.<\/li>\n<li> Mund t\u00eb jet\u00eb krijuar nj\u00eb kommit, i cili ndryshon ato skedar\u00eb n\u00eb Git, q\u00eb nuk importohen n\u00eb imazh, dhe Docker-etiketimi i imazhit do t\u00eb ndryshohet p\u00ebrs\u00ebri.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Etiketimi sipas emrit t\u00eb deg\u00ebs Git nuk reflekton versionin e imazhit<\/h2>\n<p>\nKa edhe nj\u00eb problem tjet\u00ebr q\u00eb lidhet me strategjin\u00eb e etiketimit sipas deg\u00ebve Git.<\/p>\n<p>Etiketimi sipas emrit t\u00eb deg\u00ebs funksionon derisa kommitet e k\u00ebsaj dege t\u00eb mblidhen me radh\u00eb n\u00eb rend kronologjik.<\/p>\n<p>N\u00ebse p\u00ebrdoruesi n\u00eb skem\u00ebn e tanishme nis ri-nd\u00ebrtimin e nj\u00eb komenti t\u00eb vjet\u00ebr t\u00eb lidhur me nj\u00eb deg\u00eb, at\u00ebher\u00eb werf do t\u00eb mbuloj imazhin me versionin e sapo nd\u00ebrtuar t\u00eb imazhit p\u00ebr koment t\u00eb vjet\u00ebr duke p\u00ebrdorur tagun p\u00ebrkat\u00ebs Docker. Deploymet q\u00eb p\u00ebrdorin k\u00ebt\u00eb tag nga ky moment rrezikojn\u00eb gjat\u00eb rifillimit t\u00eb pod-ve t\u00eb \u00e7ojn\u00eb n\u00eb nj\u00eb pull t\u00eb versionit tjet\u00ebr t\u00eb imazhit, duke rezultuar q\u00eb aplikacioni yn\u00eb t\u00eb humbas\u00eb lidhjen me sistemin CI, t\u00eb asinkronizohet.<\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, gjat\u00eb protrudimeve radh\u00ebs n\u00eb nj\u00eb deg\u00eb me nj\u00eb distanc\u00eb t\u00eb vog\u00ebl kohe mes tyre, kommiti i vjet\u00ebr mund t\u00eb nd\u00ebrtohet m\u00eb von\u00eb se ai m\u00eb i ri: versioni i vjet\u00ebr i imazhit do t\u00eb mbivendos\u00eb versionin e ri sipas etiket\u00ebs Git. K\u00ebto probleme mund t\u00eb zgjidhen nga sistemi CI\/CD (p.sh., n\u00eb GitLab CI p\u00ebr nj\u00eb seri kommitesh fillon pipeline i fundit). Megjithat\u00eb, kjo nuk mb\u00ebshtetet nga t\u00eb gjith\u00eb sistemet dhe duhet t\u00eb ket\u00eb nj\u00eb m\u00ebnyr\u00eb m\u00eb t\u00eb besueshme p\u00ebr t\u00eb parandaluar nj\u00eb problem kaq themelor.<\/p>\n<h2>\u00c7far\u00eb \u00ebsht\u00eb etiketimi i bazuar n\u00eb p\u00ebrmbajtje?<\/h2>\n<p>\nPra, \u00e7far\u00eb \u00ebsht\u00eb etiketimi i bazuar n\u00eb p\u00ebrmbajtje \u2014 etiketimi i imazheve sipas p\u00ebrmbajtjes.<\/p>\n<p>P\u00ebr krijimin e etiketave Docker p\u00ebrdoren jo primitiv\u00ebt e Git-it (dega Git, etiketa Git\u2026), por nj\u00eb kontroll mbi shum\u00ebn e lidhur me:<\/p>\n<ul>\n<li> <i>p\u00ebrmbajtjen e imazhit<\/i>. Identifikuesi-etiket\u00eb i imazhit reflekton p\u00ebrmbajtjen e tij. Gjat\u00eb nd\u00ebrtimit t\u00eb nj\u00eb versioni t\u00eb ri ky identifikues nuk do t\u00eb ndryshoj\u00eb, n\u00ebse n\u00eb imazh nuk jan\u00eb ndryshuar skedar\u00ebt;<\/li>\n<li> <i>historin\u00eb e krijimit t\u00eb k\u00ebtij imazhi n\u00eb Git<\/i>. Imazhet q\u00eb lidhen me deg\u00eb t\u00eb ndryshme Git dhe histori t\u00eb ndryshme nd\u00ebrtimi p\u00ebrmes werf, do t\u00eb ken\u00eb etiketa-identifikues t\u00eb ndryshme.<\/li>\n<\/ul>\n<p>\nNj\u00eb etiket\u00eb identifikimi e till\u00eb \u00ebsht\u00eb e njohur si <b>firma e fazave t\u00eb imazhit<\/b>.<\/p>\n<p>\u00c7do imazh p\u00ebrb\u00ebhet nga nj\u00eb grup fazash: <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> etj. \u00c7do faz\u00eb ka nj\u00eb identifikues q\u00eb reflekton p\u00ebrmbajtjen e saj, \u2014 <b>firma e faz\u00ebs<\/b> <i>(stage signature)<\/i>.<\/p>\n<p>Imazhi p\u00ebrfundimtar, i p\u00ebrb\u00ebr\u00eb nga k\u00ebto faza, etiketohet me firm\u00ebn e ashtuquajtur t\u00eb grupit t\u00eb k\u00ebtyre fazave \u2014 <b>stages signature<\/b>, \u2014 e cila \u00ebsht\u00eb nj\u00eb p\u00ebrmbledhje p\u00ebr t\u00eb gjitha fazat e imazhit.<\/p>\n<p>\u00c7do imazh nga konfigurimi <code>werf.yaml<\/code> n\u00eb rregull do t\u00eb ket\u00eb nj\u00eb t\u00eb till\u00eb firm\u00eb dhe, p\u00ebr pasoj\u00eb, nj\u00eb etiket\u00eb Docker.<\/p>\n<p>Firma e fazave zgjidh t\u00eb gjitha problemet e p\u00ebrmendura:<\/p>\n<ul>\n<li> \u00cbsht\u00eb e q\u00ebndrueshme ndaj komiteteve t\u00eb zbraz\u00ebta Git.<\/li>\n<li> \u00cbsht\u00eb e q\u00ebndrueshme ndaj komiteteve Git q\u00eb ndryshojn\u00eb skedar\u00ebt, q\u00eb nuk jan\u00eb relevanc\u00eb p\u00ebr imazhin.<\/li>\n<li> Nuk shkakton nj\u00eb problem me mbivendosjen e versionit aktual t\u00eb imazhit kur rinisni nd\u00ebrtimet p\u00ebr komitetet e vjetra Git t\u00eb deg\u00ebs.<\/li>\n<\/ul>\n<p>\nTani kjo \u00ebsht\u00eb strategjia e rekomanduar p\u00ebr etiketimin dhe p\u00ebrdoret si parazgjedhje n\u00eb werf p\u00ebr t\u00eb gjitha sistemet CI.<\/p>\n<h2>Si t\u00eb aktivizoni dhe p\u00ebrdorni n\u00eb werf<\/h2>\n<p>\nOpsioni p\u00ebrkat\u00ebs u shfaq n\u00eb komand\u00ebn <code>werf publish<\/code>: <code>--tag-by-stages-signature=true|false<\/code><\/p>\n<p>N\u00eb sistemin CI, strategjia e etiketimit p\u00ebrcaktohet nga komanda <code>werf ci-env<\/code>. M\u00eb par\u00eb, p\u00ebr t\u00eb \u00ebsht\u00eb p\u00ebrcaktuar parametri <code>werf ci-env --tagging-strategy=tag-or-branch<\/code>. Tani, n\u00ebse e specifikoni <code>werf ci-env --tagging-strategy=stages-signature<\/code> apo nuk e specifikoni k\u00ebt\u00eb opsion, werf do t\u00eb p\u00ebrdor\u00eb si parazgjedhje strategjin\u00eb e etiketimit <code>stages-signature<\/code>. Komanda <code>werf ci-env<\/code> do t\u00eb vendos\u00eb automatikisht flag-at e nevojsh\u00ebm p\u00ebr komand\u00ebn <code>werf build-and-publish<\/code> (ose <code>werf publish<\/code>), prandaj nuk \u00ebsht\u00eb e nevojshme t\u00eb jepni opsione shtes\u00eb p\u00ebr k\u00ebto komanda.<\/p>\n<p>P\u00ebr shembull, komanda:<\/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 mund t\u00eb krijoj\u00eb imazhe t\u00eb m\u00ebposhtme:<\/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>\nK\u00ebtu <code>4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d<\/code> \u2014 \u00ebsht\u00eb firma e fazave t\u00eb imazhit <code>backend<\/code>, dhe <code>f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6<\/code> \u2014 firma e fazave t\u00eb imazhit <code>frontend<\/code>.<\/p>\n<p>Duke p\u00ebrdorur funksione speciale <code>werf_container_image<\/code> dhe <code>werf_container_env<\/code> n\u00eb shabllonat Helm nuk ka nevoj\u00eb t\u00eb ndryshoni asgj\u00eb: k\u00ebto funksione do t\u00eb krijojn\u00eb automatikisht emrat e sakt\u00eb t\u00eb imazheve.<\/p>\n<p>Shembulli i konfigurimit n\u00eb sistemin CI:<\/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>\nM\u00eb shum\u00eb informacion n\u00eb lidhje me konfigurimin \u00ebsht\u00eb i disponuesh\u00ebm n\u00eb dokumentacion:<\/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\">Manuali \u2192 Publikimi (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\">Puna me CI\/CD \u2192 P\u00ebrgjith\u00ebsime \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\">Integrimi me GitLab CI\/CD \u2192 .gitlab-ci.yml<\/a><\/noindex>.<\/li>\n<\/ul>\n<p><\/p>\n<h2>N\u00eb p\u00ebrfundim<\/h2>\n<p><\/p>\n<ul>\n<li> Mund\u00ebsi e re <code>werf publish --tag-by-stages-signature=true|false<\/code>.<\/li>\n<li> Vlera e re e opsionit <code>werf ci-env --tagging-strategy=stages-signature|tag-or-branch<\/code> (n\u00ebse nuk e spesifikoni, at\u00ebher\u00eb parazgjedhja do t\u00eb jet\u00eb <code>stages-signature<\/code>).<\/li>\n<li> N\u00ebse deri tani ishin p\u00ebrdorur opsione etiketimi sipas komiteteve Git (<code>WERF_TAG_GIT_COMMIT<\/code> apo opsioni <code>werf publish --tag-git-commit COMMIT<\/code>), at\u00ebher\u00eb \u00ebsht\u00eb e domosdoshme t\u00eb kaloni n\u00eb strategjin\u00eb e etiketimit <i>stages-signature<\/i>.<\/li>\n<li> Projektet e reja \u00ebsht\u00eb mir\u00eb t'i kaloni menj\u00ebher\u00eb n\u00eb skem\u00ebn e re t\u00eb etiketimit.<\/li>\n<li> Projektet e vjetra, kur kaloni n\u00eb werf 1.1, \u00ebsht\u00eb e d\u00ebshirueshme t'i kaloni n\u00eb skem\u00ebn e re t\u00eb etiketimit, por e vjetra <i>tag-or-branch<\/i> ndihmohet akoma.<\/li>\n<\/ul>\n<p>\nEtiketime e bazuar n\u00eb p\u00ebrmbajtje zgjidh t\u00eb gjitha problemet e p\u00ebrmendura n\u00eb artikull:<\/p>\n<ul>\n<li> Q\u00ebndrueshm\u00ebria e emrit t\u00eb tag-\u00ebve Docker ndaj komiteteve bosh t\u00eb Git.<\/li>\n<li> Q\u00ebndrueshm\u00ebria e emrit t\u00eb tag-\u00ebve Docker ndaj komiteteve t\u00eb Git q\u00eb ndryshojn\u00eb skedar\u00ebt e par\u00ebnd\u00ebsish\u00ebm p\u00ebr imazhin.<\/li>\n<li> Nuk shkakton nj\u00eb problem me mbingarkimin e versionit aktual t\u00eb imazhit kur rilansohet nd\u00ebrtimi p\u00ebr komitetet e vjetra t\u00eb Git p\u00ebr deg\u00ebt e Git.<\/li>\n<\/ul>\n<p>\nP\u00ebrdorni! Dhe mos harroni t\u00eb na vizitoni n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">GitHub<\/a><\/noindex>, p\u00ebr t\u00eb krijuar nj\u00eb issue ose p\u00ebr t\u00eb gjetur nj\u00eb t\u00eb ekzistuesh\u00ebm, p\u00ebr t\u00eb vendosur nj\u00eb plus, p\u00ebr t\u00eb krijuar nj\u00eb PR ose thjesht p\u00ebr t\u00eb ndjekur zhvillimin e projektit.<\/p>\n<h2>P.S.<\/h2>\n<p>\nLexoni gjithashtu n\u00eb blogun ton\u00eb:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/493170\/\">L\u00ebshimi i werf 1.1: p\u00ebrmir\u00ebsime n\u00eb mbledh\u00ebs sot dhe planet p\u00ebr t\u00eb ardhmen<\/a><\/noindex>\u00bb<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/481306\/\">Paraqesim werf 1.0 stabile: \u00e7far\u00eb ka t\u00eb b\u00ebj\u00eb me GitOps, statusi dhe planet<\/a><\/noindex>\u00bb<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)<\/a><\/noindex>\u00bb;<\/li>\n<li> Cikli i sh\u00ebnimeve mbi risit\u00eb n\u00eb werf:\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/476646\/\">3-way merge n\u00eb werf: shp\u00ebrndarja n\u00eb Kubernetes me Helm \"n\u00eb steroide\"<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/468049\/\">P\u00ebrdorimi i werf p\u00ebr shp\u00ebrndarjen e chart-eve komplekse t\u00eb Helm<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/465131\/\">P\u00ebrkrahja e monorepo dhe multirepo n\u00eb werf dhe \u00e7far\u00eb lidhje ka me Docker Registry<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/463613\/\">Tani \u00ebsht\u00eb e mundur t\u00eb nd\u00ebrtosh imazhe Docker n\u00eb werf edhe p\u00ebrmes Dockerfile standard<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Burimi: <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.0.1 - 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\/sq\/blog\/administrirovanie\/content-based-tagging-v-sborshhike-werf-zachem-i-kak-eto-rabotaet\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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\udd47Etiketime e bazuar n\u00eb p\u00ebrmbajtje n\u00eb mbledh\u00ebsin werf: pse dhe si funksionon? | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sq\/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":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/76769","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=76769"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/76769\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/76770"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=76769"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=76769"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=76769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}