{"id":36754,"date":"2019-10-31T22:13:37","date_gmt":"2019-10-31T19:13:37","guid":{"rendered":"https:\/\/prohoster.info\/blog\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada\/"},"modified":"2019-10-31T22:13:37","modified_gmt":"2019-10-31T19:13:37","slug":"werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","title":{"rendered":"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>M\u00eb 27 maj n\u00eb sall\u00ebn kryesore t\u00eb konferenc\u00ebs DevOpsConf 2019, q\u00eb zhvillohet brenda festivalit <noindex><a rel=\"nofollow\" href=\"http:\/\/ritfest.ru\/2019\/\">RIT++ 2019<\/a><\/noindex>, n\u00eb seksionin \"\u00c7doher\u00eb n\u00eb D\u00ebrges\u00eb\", u prezantua referati \"werf - mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes\". Aty diskutohet p\u00ebr <b>problemet dhe sfidat me t\u00eb cilat p\u00ebrballet \u00e7do njeri gjat\u00eb d\u00ebrgimit n\u00eb Kubernetes<\/b>, po ashtu si dhe p\u00ebr nuancat q\u00eb mund t\u00eb mos duken menj\u00ebher\u00eb. Duke analizuar mund\u00ebsit\u00eb e zgjidhjes, ne tregojm\u00eb se si \u00ebsht\u00eb realizuar n\u00eb mjetin Open Source <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>.<\/p>\n<p>Q\u00eb nga ajo paraqitje, utilitari yn\u00eb (m\u00eb par\u00eb i njohur si dapp) ka kaluar pragun historik t\u00eb <b>1000 yjeve n\u00eb GitHub<\/b> \u2014 shpresojm\u00eb se komuniteti n\u00eb rritje i p\u00ebrdoruesve do t'i leht\u00ebsoj\u00eb jet\u00ebn shum\u00eb inxhinier\u00ebve DevOps.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/c2d1ad5133c0de944b60ae37e3dbe598.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPra, prezantojm\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=cK3ackGUTLw\"><b>video me referatin<\/b><\/a><\/noindex> (~47 minuta, shum\u00eb m\u00eb informuese se nj\u00eb artikull) dhe nj\u00eb p\u00ebrmbledhje t\u00eb saj n\u00eb form\u00eb tekstuale. Le t\u00eb fillojm\u00eb!<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>D\u00ebrgimi i kodit n\u00eb Kubernetes<\/h2>\n<p>\nN\u00eb k\u00ebt\u00eb referat, do t\u00eb flitet m\u00eb s\u00eb shumti jo p\u00ebr werf, por p\u00ebr CI\/CD n\u00eb Kubernetes, duke supozuar se softi yn\u00eb \u00ebsht\u00eb paketuar n\u00eb konteiner\u00eb Docker <i>(p\u00ebr k\u00ebt\u00eb kam folur n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/322686\/\">referatin e vitit 2016<\/a><\/noindex>)<\/i>, dhe K8s do t\u00eb p\u00ebrdoret p\u00ebr ta nisur n\u00eb prodhim <i>(p\u00ebr k\u00ebt\u00eb \u2014 n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/331188\/\">vitin 2017<\/a><\/noindex>)<\/i>.<\/p>\n<p>Si duket d\u00ebrgimi n\u00eb Kubernetes?<\/p>\n<ul>\n<li> Ekziston nj\u00eb repo Git me kodin dhe udh\u00ebzimet p\u00ebr nd\u00ebrtimin e tij. Aplikacioni nd\u00ebrtohet n\u00eb nj\u00eb imazh Docker dhe publikohet n\u00eb Docker Registry.<\/li>\n<li> N\u00eb t\u00eb nj\u00ebjt\u00ebn repo ka udh\u00ebzime gjithashtu p\u00ebr si t\u00eb d\u00ebrgohet dhe t\u00eb nis\u00eb aplikacioni. N\u00eb faz\u00ebn e d\u00ebrgimit, k\u00ebto udh\u00ebzime d\u00ebrgohen n\u00eb Kubernetes, i cili merr imazhin e nevojsh\u00ebm nga registry dhe e nis at\u00eb.<\/li>\n<li> P\u00ebr m\u00eb tep\u00ebr, zakonisht ka teste. Disa prej tyre mund t\u00eb ekzekutohen gjat\u00eb publikimit t\u00eb imazhit. Gjithashtu, mund t\u00eb (sip\u00ebrmarr\u00eb nga t\u00eb nj\u00ebjtat udh\u00ebzime) t\u00eb zhvillohet nj\u00eb kopje t\u00eb aplikacionit (n\u00eb nj\u00eb hap\u00ebsir\u00eb emrash K8s ose nj\u00eb klas\u00ebr t\u00eb ve\u00e7ant\u00eb) dhe t\u00eb ekzekutohen testet aty.<\/li>\n<li> \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0443\u0436\u043d\u0430 CI-\u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437 Git&#8217;\u0430 (\u0438\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a) \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u0434\u0438\u0438: build, publish, deploy, test.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/ec0d1fd1bf1a68cca92badf7cf1affe1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nK\u00ebtu jan\u00eb disa v\u00ebrejtje t\u00eb r\u00ebnd\u00ebsishme:<\/p>\n<ol>\n<li> Pasi kemi nj\u00eb infrastruktur\u00eb t\u00eb pandryshueshme <i>(infrastructure e pandryshueshme)<\/i>, imazhi i aplikacionit, q\u00eb p\u00ebrdoret n\u00eb t\u00eb gjitha fazat (staging, prodhim, etj.), <b>duhet t\u00eb jet\u00eb nj\u00eb<\/b>. <i>P\u00ebr m\u00eb shum\u00eb rreth k\u00ebsaj dhe me shembuj, kam folur <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/324274\/\">k\u00ebtu<\/a><\/noindex>.<\/i><\/li>\n<li> Pasi ndjekim qasjen e infrastruktur\u00ebs si kod <i>(IaC)<\/i>, kodi i aplikacionit, udh\u00ebzimet p\u00ebr nd\u00ebrtimin dhe nisjen e tij duhet t\u00eb jen\u00eb <b>pik\u00ebrisht n\u00eb nj\u00eb repo<\/b>. <i>P\u00ebr m\u00eb shum\u00eb rreth k\u00ebsaj \u2014 shihni n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/324274\/\">at\u00eb referat<\/a><\/noindex>.<\/i><\/li>\n<li> T\u00eb gjitha fazat e d\u00ebrgimit <i>(delivery)<\/i> ne zakonisht i shohim si t\u00eb tilla: aplikacioni u nd\u00ebrtua, u testua, u publikua <i>(faz\u00ebn e publikimit)<\/i> dhe kjo \u2014 d\u00ebrgimi u realizua. Por n\u00eb t\u00eb v\u00ebrtet\u00eb, p\u00ebrdoruesi merr at\u00eb q\u00eb ju nxorr\u00ebt, <b>nuk<\/b> at\u00ebher\u00eb kur ju e d\u00ebrguat n\u00eb prodhim, dhe kur ai arriti t\u00eb hyj\u00eb atje dhe ai prodhim funksiononte. Prandaj, un\u00eb mendoj se zinxhiri i d\u00ebrgimit p\u00ebrfundon <b>vet\u00ebm n\u00eb faz\u00ebn e operimit<\/b> <i>(running)<\/i>, dhe n\u00ebse flasim me sakt\u00ebsi, edhe n\u00eb momentin kur kodi u hoq nga prodhimi (duke e z\u00ebvend\u00ebsuar at\u00eb me nj\u00eb t\u00eb ri).<\/li>\n<\/ol>\n<p>\nLe t\u00eb kthehemi n\u00eb skem\u00ebn e d\u00ebrgimit n\u00eb Kubernetes t\u00eb p\u00ebrmendur m\u00eb lart: ajo nuk \u00ebsht\u00eb shpikur vet\u00ebm nga ne, por nga \u00e7do njeri q\u00eb \u00ebsht\u00eb marr\u00eb me k\u00ebt\u00eb problem. Faktikisht, ky model tani njihet si GitOps <i>(p\u00ebr m\u00eb shum\u00eb rreth termit dhe ideve q\u00eb q\u00ebndrojn\u00eb pas tij, mund t\u00eb lexoni <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/458878\/\">k\u00ebtu<\/a><\/noindex>)<\/i>. Le t\u00eb shikojm\u00eb fazat e skem\u00ebs.<\/p>\n<h2>Faza e nd\u00ebrtimit<\/h2>\n<p>\n\u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432 2019 \u0433\u043e\u0434\u0443 \u043f\u0440\u043e \u0441\u0431\u043e\u0440\u043a\u0443 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0443\u043c\u0435\u044e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c Dockerfile&#8217;\u044b \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c <code>docker build<\/code>?.. \u0412\u043e\u0442 \u043d\u044e\u0430\u043d\u0441\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435:<\/p>\n<ol>\n<li> <b>Duket se \u00e7far\u00eb mund t\u00eb thuhet n\u00eb vitin 2019 rreth nd\u00ebrtimit t\u00eb imazheve Docker, kur t\u00eb gjith\u00eb din\u00eb t\u00eb shkruajn\u00eb Dockerfile dhe t\u00eb ekzekutojn\u00eb<\/b> Pesha e imazhit <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/develop\/develop-images\/multistage-build\/\">ka r\u00ebnd\u00ebsi, prandaj p\u00ebrdorni<\/a><\/noindex>multi-stage<\/li>\n<li> <b>, p\u00ebr t\u00eb l\u00ebn\u00eb vet\u00ebm ata q\u00eb jan\u00eb v\u00ebrtet t\u00eb nevojsh\u00ebm p\u00ebr funksionimin e aplikacionit.<\/b> Numri i shtresave <code>RUN<\/code>duhet t\u00eb jet\u00eb minimal, duke bashkuar zinxhir\u00ebt e<\/li>\n<li> komandave sipas kuptimit. <b>Megjithat\u00eb, kjo sjell probleme<\/b>gjat\u00eb depurimit<\/li>\n<li> <b>, pasi kur ndodhin gabime n\u00eb nd\u00ebrtim, \u00ebsht\u00eb e nevojshme t\u00eb gjendet komand\u00eb t\u00eb caktuar nga zinxhiri q\u00eb shkaktoi problemin.<\/b> Shpejt\u00ebsia e nd\u00ebrtimit<\/li>\n<li> \u00ebsht\u00eb e r\u00ebnd\u00ebsishme, sepse ne duam t\u00eb nxjerrim shpejt ndryshimet dhe t\u00eb shohim rezultatet. P\u00ebr shembull, nuk d\u00ebshirojm\u00eb t\u00eb rib\u00ebjm\u00eb var\u00ebsit\u00eb n\u00eb bibliotekat e gjuh\u00ebs me \u00e7do nd\u00ebrtim t\u00eb aplikacionit. <b>Shpesh nga nj\u00eb repo Git k\u00ebrkohen<\/b>, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0438\u0437 Dockerfile&#8217;\u043e\u0432 (\u0438\u043b\u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0430\u0434\u0438\u044f\u043c\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435) \u0438 Bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0441 \u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439.<\/li>\n<\/ol>\n<p>\n, q\u00eb mund t\u00eb zgjidhet me nj\u00eb grup Dockerfile-in (ose me etapa t\u00eb em\u00ebrtuara brenda nj\u00eb skedari) dhe me skript Bash p\u00ebr nd\u00ebrtimin e tyre n\u00eb radh\u00eb.<\/p>\n<ol>\n<li> Kjo ishte vet\u00ebm maja e ajsbergut, me t\u00eb cilin p\u00ebrballen t\u00eb gjith\u00eb. Por ka edhe probleme t\u00eb tjera, ve\u00e7an\u00ebrisht: <b>Shpesh gjat\u00eb faz\u00ebs s\u00eb nd\u00ebrtimit kemi nevoj\u00eb t\u00eb<\/b> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0442\u0438\u043f\u0430 apt&#8217;\u0430 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e).<\/li>\n<li> (p\u00ebr shembull, p\u00ebr t\u00eb ruajtur rezultatin e komand\u00ebs si apt n\u00eb nj\u00eb direktore t\u00eb jashtme). <b>Ansible<\/b> \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 shell&#8217;\u0435.<\/li>\n<li> (p\u00ebr shembull, p\u00ebr t\u00eb ruajtur rezultatin e komand\u00ebs si apt n\u00eb nj\u00eb direktore t\u00eb jashtme). <b>t\u00eb vendosim p\u00ebr t\u00eb shkruar n\u00eb Shell,<\/b> t\u00eb nd\u00ebrtojm\u00eb pa Docker<\/li>\n<li> <b>(pse t\u00eb kemi nj\u00eb makin\u00eb virtuale t\u00eb tep\u00ebrt, ku duhet t\u00eb konfigurohen t\u00eb gjitha p\u00ebr k\u00ebt\u00eb, kur \u00ebsht\u00eb nj\u00eb klas\u00ebr Kubernetes q\u00eb mund t\u00eb nis\u00eb konteiner\u00ebt?).<\/b>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443: \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u0437 Dockerfile (\u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f multi-stage), \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e Dockerfile&#8217;\u043e\u0432.<\/li>\n<li> <b>, i cili mund t\u00eb kuptohet n\u00eb m\u00ebnyra t\u00eb ndryshme: komanda t\u00eb ndryshme nga Dockerfile (n\u00ebse p\u00ebrdoret multi-stage), disa komitete nga nj\u00eb repo, disa Dockerfile.<\/b>: \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432 pod&#8217;\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u00ab\u044d\u0444\u0435\u043c\u0435\u0440\u043d\u044b\u043c\u0438\u00bb, \u0442.\u043a. \u0443 \u043d\u0438\u0445 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043a\u044d\u0448, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u2014 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0433\u0434\u0435-\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/li>\n<li> S\u00eb fundmi, e quajta kulmin e d\u00ebshirave <b>automagji<\/b>: do t\u00eb ishte ideale t\u00eb hysh n\u00eb depo, t\u00eb shkruash nj\u00eb komand\u00eb dhe t\u00eb marr\u00ebsh nj\u00eb imazh t\u00eb gatsh\u00ebm, t\u00eb nd\u00ebrtuar me kuptimin e asaj si duhet b\u00ebr\u00eb. Megjithat\u00eb, personalisht nuk jam i sigurt se t\u00eb gjitha nuancat mund t\u00eb parashikohen k\u00ebshtu.<\/li>\n<\/ol>\n<p>\nDhe k\u00ebshtu ka projekte:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moby\/buildkit\">moby\/buildkit<\/a><\/noindex> \u2014 nj\u00eb nd\u00ebrtues nga kompania Docker Inc (q\u00eb tashm\u00eb \u00ebsht\u00eb integruar n\u00eb versionet aktuale t\u00eb Docker), e cila p\u00ebrpiqet t\u00eb zgjidh\u00eb t\u00eb gjitha k\u00ebto probleme;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/kaniko\">kaniko<\/a><\/noindex> \u2014 nj\u00eb nd\u00ebrtues nga Google, q\u00eb lejon nd\u00ebrtimin pa Docker;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/buildpacks.io\/\">Buildpacks.io<\/a><\/noindex> \u2014 p\u00ebrpjekja e CNCF p\u00ebr t\u00eb b\u00ebr\u00eb automagji dhe, n\u00eb ve\u00e7anti, nj\u00eb zgjidhje interesante me rebase p\u00ebr shtresa;<\/li>\n<li> dhe shum\u00eb utilitete t\u00eb tjera si <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/containers\/buildah\">buildah<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/genuinetools\/img\">genuinetools\/img<\/a><\/noindex>\u2026<\/li>\n<\/ul>\n<p>\n\u2026 dhe shikoni sa yje kan\u00eb n\u00eb GitHub. Pra, nga nj\u00ebra an\u00eb, <code>docker build<\/code> ka dhe mund t\u00eb b\u00ebj\u00eb di\u00e7ka, por n\u00eb t\u00eb v\u00ebrtet\u00eb <b>pyetja nuk \u00ebsht\u00eb zgjidhur plot\u00ebsisht<\/b> \u2014 nj\u00eb prov\u00eb p\u00ebr k\u00ebt\u00eb \u00ebsht\u00eb zhvillimi paralel i nd\u00ebrtuesve alternativ\u00eb, secili prej t\u00eb cil\u00ebve zgjidh nj\u00eb pjes\u00eb t\u00eb problemeve.<\/p>\n<h2>Nd\u00ebrtimi n\u00eb werf<\/h2>\n<p>\nK\u00ebshtu arrit\u00ebm tek <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex> <i>(m\u00eb par\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/333682\/\">i njohur<\/a><\/noindex> si dapp)<\/i> \u2014 Open Source-\u0443\u0442\u0438\u043b\u0438\u0442\u0435 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u00ab\u0424\u043b\u0430\u043d\u0442\u00bb, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0443\u0436\u0435 \u043c\u043d\u043e\u0433\u043e \u043b\u0435\u0442. \u041d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0432\u0441\u0451 \u043b\u0435\u0442 5 \u043d\u0430\u0437\u0430\u0434 \u0441 Bash-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u0441\u0431\u043e\u0440\u043a\u0443 Dockerfile&#8217;\u043e\u0432, \u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 3 \u0433\u043e\u0434\u0430 \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u043e \u0441\u0432\u043e\u0438\u043c Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c <i>(fillimisht n\u00eb Ruby, dhe m\u00eb pas <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/437044\/\">u riprogramua<\/a><\/noindex> n\u00eb Go, dhe po ashtu u riem\u00ebrua)<\/i>. Cilat probleme nd\u00ebrtimi zgjidhen n\u00eb werf?<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/ab6aa8831b49977a419fd4cc3543eb83.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProblemet e theksuara me t\u00eb bluara jan\u00eb realizuar, nd\u00ebrtimi paralel \u00ebsht\u00eb b\u00ebr\u00eb brenda nj\u00eb hosti, nd\u00ebrsa pyetjet e theksuara me t\u00eb verdh\u00eb planifikojm\u00eb t'i p\u00ebrfundojm\u00eb deri n\u00eb fund t\u00eb ver\u00ebs.<\/p>\n<h2>Faza e publikimit n\u00eb registry (publish)<\/h2>\n<p>\nKemi marr\u00eb <code>docker push<\/code>\u2026 \u2014 \u00e7far\u00eb mund t\u00eb ket\u00eb t\u00eb v\u00ebshtir\u00eb n\u00eb ngarkimin e nj\u00eb imazhi n\u00eb registry? Dhe k\u00ebtu lind pyetja: \u00abCili tag duhet t'i vihet imazhit?\u00bb Kjo lind p\u00ebr shkak se kemi <b>Gitflow<\/b> (\u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f Git&#8217;\u0430) \u0438 Kubernetes, \u0430 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044f \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0432 Kubernetes \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u043e \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0432 Git. \u0412\u0435\u0434\u044c Git \u2014 \u043d\u0430\u0448 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0440\u0430\u0432\u0434\u044b.<\/p>\n<p>\u00c7far\u00eb \u00ebsht\u00eb e v\u00ebshtir\u00eb n\u00eb k\u00ebt\u00eb? <b>T\u00eb garantojm\u00eb riprodhueshm\u00ebrin\u00eb<\/b>: nga commit-i n\u00eb Git, i cili natyrsh\u00ebm \u00ebsht\u00eb i pandryshuesh\u00ebm <i>(immutable)<\/i>, deri n\u00eb imazhin Docker, i cili duhet t\u00eb mbetet i nj\u00ebjt\u00eb.<\/p>\n<p>\u00cbsht\u00eb gjithashtu e r\u00ebnd\u00ebsishme p\u00ebr ne <b>t\u00eb p\u00ebrcaktojm\u00eb origjin\u00ebn<\/b>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0431\u044b\u043b\u043e \u0441\u043e\u0431\u0440\u0430\u043d\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0435 \u0432 Kubernetes (\u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c diff&#8217;\u044b \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0432\u0435\u0449\u0438).<\/p>\n<h3>Strategjit\u00eb e tag-imit<\/h3>\n<p>\nE para \u00ebsht\u00eb e thjesht\u00eb <b>git tag.<\/b>Kemi nj\u00eb registry me nj\u00eb imazh, i tag-uar si <code>1.0<\/code>. N\u00eb Kubernetes ka stage dhe production, ku ky imazh \u00ebsht\u00eb shkarkuar. N\u00eb Git ne b\u00ebjm\u00eb commit-e dhe n\u00eb nj\u00eb moment i vendosim nj\u00eb tag <code>2.0<\/code>. E nd\u00ebrtuam at\u00eb sipas udh\u00ebzimeve nga depoja dhe e vendos\u00ebm n\u00eb registry me tag-un <code>2.0<\/code>. E shtojm\u00eb n\u00eb stage dhe, n\u00ebse gjith\u00e7ka shkon mir\u00eb, at\u00ebher\u00eb n\u00eb production.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/8545b84bfa63a91773f0d7dc1c2bd49f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nProblemi me k\u00ebt\u00eb qasje \u00ebsht\u00eb se ne fillimisht vendos\u00ebm nj\u00eb tag, dhe pastaj e testuam dhe e publikuan. Pse? S\u00eb pari, kjo \u00ebsht\u00eb thjesht e pakuptimt\u00eb: ne l\u00ebshojm\u00eb nj\u00eb version t\u00eb softuerit q\u00eb nuk e kemi kontrolluar ende (nuk mund ta b\u00ebjm\u00eb ndryshe, sepse p\u00ebr ta verifikuar, k\u00ebrkohet t\u00eb vendosim nj\u00eb tag). S\u00eb dyti, ky rrug\u00eb nuk p\u00ebrputhet me Gitflow.<\/p>\n<p>Variant i dyt\u00eb \u2014 <b>git commit + tag.<\/b>N\u00eb deg\u00ebn master ka nj\u00eb tag <code>1.0<\/code>; p\u00ebr t\u00eb n\u00eb registry \u2014 nj\u00eb imazh, i vendosur n\u00eb production. P\u00ebrve\u00e7 k\u00ebsaj, n\u00eb Kubernetes-kluster ka konture preview dhe staging. M\u00eb pas ne ndjekim Gitflow: n\u00eb deg\u00ebn kryesore p\u00ebr zhvillim (<code>develop<\/code>) b\u00ebjm\u00eb funksionalitete t\u00eb reja, q\u00eb rezultojn\u00eb n\u00eb nj\u00eb commit me identifikuesin <code>#c1<\/code>. Ne e nd\u00ebrtuam at\u00eb dhe e publikojm\u00eb n\u00eb registry, duke p\u00ebrdorur k\u00ebt\u00eb identifikues (<code>#c1<\/code>). Me t\u00eb nj\u00ebjtin identifikues e publikohet n\u00eb preview. N\u00eb m\u00ebnyr\u00eb t\u00eb ngjashme e b\u00ebjm\u00eb me commit-et <code>#c2<\/code> dhe <code>#c3<\/code>.<\/p>\n<p>Kur kuptuam se ka mjaft funksionalitete, fillojm\u00eb t\u00eb stabilizojm\u00eb gjith\u00e7ka. N\u00eb Git krijojm\u00eb nj\u00eb deg\u00eb <code>release_1.1<\/code> (n\u00eb baz\u00eb t\u00eb <code>#c3<\/code> nga <code>develop<\/code>). Nuk do t\u00eb nevojitet nd\u00ebrtimi i k\u00ebtij rrelease, pasi kjo \u00ebsht\u00eb b\u00ebr\u00eb n\u00eb faz\u00ebn e kaluar. Prandaj mund t\u00eb thjesht e publikojm\u00eb at\u00eb n\u00eb staging. Rregullojm\u00eb bugs n\u00eb <code>#c4<\/code> dhe po ashtu e publikojm\u00eb n\u00eb staging. N\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb po vazhdon zhvillimi n\u00eb <code>develop<\/code>, ku her\u00eb pas here kopjohen ndryshime nga <code>release_1.1<\/code>. N\u00eb nj\u00eb moment ne kemi nj\u00eb commit t\u00eb nd\u00ebrtuar dhe t\u00eb l\u00ebshuar n\u00eb staging, t\u00eb cilin jemi t\u00eb k\u00ebnaqur me (<code>#c25<\/code>).<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c merge (\u0441 fast-forward&#8217;\u043e\u043c) \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u0438 (<code>release_1.1<\/code>) n\u00eb master. Vendosim nj\u00eb tag n\u00eb k\u00ebt\u00eb commit me versionin e ri (<code>1.1<\/code>). Por ky imazh tashm\u00eb \u00ebsht\u00eb nd\u00ebrtuar n\u00eb registry, prandaj, p\u00ebr t\u00eb mos e nd\u00ebrtuar at\u00eb s\u00ebrish, ne thjesht shtojm\u00eb nj\u00eb tag t\u00eb dyt\u00eb n\u00eb imazhin ekzistues (tani ai n\u00eb registry ka tag-\u00ebt <code>#c25<\/code> dhe <code>1.1<\/code>). Pas k\u00ebsaj e publikojm\u00eb n\u00eb production.<\/p>\n<p>Ka nj\u00eb mang\u00ebsi q\u00eb n\u00eb staging \u00ebsht\u00eb shkarkuar nj\u00eb imazh (<code>#c25<\/code>), nd\u00ebrsa n\u00eb production \u2014 dikush tjet\u00ebr (<code>1.1<\/code>), por ne e dim\u00eb q\u00eb \u00abfizikisht\u00bb ky \u00ebsht\u00eb i nj\u00ebjti imazh nga registry.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/b3fa2c34442aa401d1e7b30eb593be9a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0436\u0435 \u043c\u0438\u043d\u0443\u0441 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 merge commit&#8217;\u043e\u0432, \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c fast-forward.<\/p>\n<p>Mund t\u00eb shkojm\u00eb p\u00ebrpara dhe t\u00eb b\u00ebjm\u00eb nj\u00eb truk... Le t\u00eb shqyrtojm\u00eb shembullin e nj\u00eb Dockerfile t\u00eb thjesht\u00eb:<\/p>\n<pre><code class=\"plaintext\">FROM ruby:2.3 as assets\nRUN mkdir -p \/app\nWORKDIR \/app\nCOPY . .\/\nRUN gem install bundler &amp;&amp; bundle install\nRUN bundle exec rake assets:precompile\nCMD bundle exec puma -C config\/puma.rb\n\nFROM nginx:alpine\nCOPY --from=assets \/app\/public \/usr\/share\/nginx\/www\/public<\/code><\/pre>\n<p>\nDo t\u00eb nd\u00ebrtosh nj\u00eb skedar sipas k\u00ebtij parimi, q\u00eb do t\u00eb marrim:<\/p>\n<ul>\n<li> SHA256 nga identifikuesit e imazheve t\u00eb p\u00ebrdorura (<code>ruby:2.3<\/code> dhe <code>nginx:alpine<\/code>), q\u00eb jan\u00eb kontrollet e p\u00ebrmbajtjes s\u00eb tyre;<\/li>\n<li> t\u00eb gjitha komandat (<code>RUN<\/code>, <code>CMD<\/code> etj.);<\/li>\n<li> SHA256 nga skedar\u00ebt q\u00eb jan\u00eb shtuar.<\/li>\n<\/ul>\n<p>\n\u2026 dhe do t\u00eb marrim kontrollin e p\u00ebrmbajtjes (s\u00ebrish SHA256) nga nj\u00eb skedar t\u00eb till\u00eb. Kjo \u00ebsht\u00eb <b>n\u00ebnshkrimi<\/b> i gjith\u00e7kaje q\u00eb p\u00ebrcakton p\u00ebrmbajtjen e imazhit Docker.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/b2af0b7952eefe26ddbb145955e778e8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00eb kthehemi te skema dhe <b>n\u00eb vend t\u00eb komiteve do t\u00eb p\u00ebrdorim k\u00ebto n\u00ebnshkrime<\/b>, dmth. t\u00eb etiketojm\u00eb imazhet me n\u00ebnshkrime.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/115f290bd5951614c041b3d510fae38e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441&#8217;merge&#8217;\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u0440\u0435\u043b\u0438\u0437\u0430 \u0432 master, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 merge commit: \u0443 \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043d\u043e \u0442\u0430 \u0436\u0435 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430. \u0421 \u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0432\u044b\u043a\u0430\u0442\u0438\u043c \u043e\u0431\u0440\u0430\u0437 \u0438 \u043d\u0430 production.<\/p>\n<p>Disavantazhi \u00ebsht\u00eb se tani nuk do t\u00eb mund t\u00eb p\u00ebrcaktojm\u00eb se cilin komit e kemi hequr n\u00eb prodhim \u2014 kontrollet punojn\u00eb vet\u00ebm n\u00eb nj\u00eb drejtim. Ky problem zgjidhet me nj\u00eb shtres\u00eb shtes\u00eb me metadata \u2014 do t\u00eb flas m\u00eb shum\u00eb m\u00eb von\u00eb.<\/p>\n<h3>Etiketimi n\u00eb werf<\/h3>\n<p>\nN\u00eb werf kemi shkuar edhe m\u00eb tej dhe po p\u00ebrgatitemi p\u00ebr nd\u00ebrtim t\u00eb shp\u00ebrndar\u00eb me cache, i cili nuk ruhet n\u00eb nj\u00eb makin\u00eb vet\u00ebm\u2026 Pra, ne po nd\u00ebrtojm\u00eb imazhe Docker t\u00eb dy llojeve, q\u00eb i quajm\u00eb <i>stage<\/i> dhe <i>image<\/i>.<\/p>\n<p>N\u00eb repo Git t\u00eb werf ruhen instruksionet specifike p\u00ebr nd\u00ebrtim, q\u00eb p\u00ebrshkruajn\u00eb fazat e ndryshme t\u00eb nd\u00ebrtimit (<i>beforeInstall<\/i>, <i>install<\/i>, <i>beforeSetup<\/i>, <i>setup<\/i>). Faza e par\u00eb e imazhit e nd\u00ebrtuar ka n\u00ebnshkrimin e p\u00ebrcaktuar si kontrolli i hapave t\u00eb par\u00eb. M\u00eb pas shtojm\u00eb kodin burimor, p\u00ebr imazhin e ri t\u00eb faz\u00ebs e llogarisim kontrollin e tij\u2026 K\u00ebto operacione p\u00ebrs\u00ebriten p\u00ebr t\u00eb gjitha fazat, duke rezultuar n\u00eb nj\u00eb grup imazhesh t\u00eb fazave. M\u00eb pas krijojm\u00eb imazhin p\u00ebrfundimtar, i cili gjithashtu p\u00ebrmban metadata mbi prejardhjen e tij. Dhe ky imazh e etiketojm\u00eb n\u00eb m\u00ebnyra t\u00eb ndryshme (detaje m\u00eb von\u00eb).<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/22df8b6347b45be19ecb889c102b92b5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLe t\u00eb ndodh\u00eb pas k\u00ebsaj nj\u00eb komit i ri, n\u00eb t\u00eb cilin \u00ebsht\u00eb ndryshuar vet\u00ebm kodi i aplikacionit. \u00c7far\u00eb do t\u00eb ndodh\u00eb? P\u00ebr ndryshimet n\u00eb kod do t\u00eb krijohet nj\u00eb patch, do t\u00eb p\u00ebrgatitet nj\u00eb imazh i ri i faz\u00ebs. N\u00ebnshkrimi i tij do t\u00eb p\u00ebrcaktohet si kontrolli i imazhit t\u00eb vjet\u00ebr t\u00eb faz\u00ebs dhe patches t\u00eb ri. Nga ky imazh do t\u00eb formohet edhe nj\u00eb imazh i ri p\u00ebrfundimtar. Nj\u00eb sjellje e ngjashme do t\u00eb ndodh\u00eb p\u00ebr ndryshimet n\u00eb faza t\u00eb tjera.<\/p>\n<p>K\u00ebshtu, imazhet e fazave \u2014 jan\u00eb cache q\u00eb mund t\u00eb ruhen n\u00eb m\u00ebnyr\u00eb t\u00eb shp\u00ebrndar\u00eb, nd\u00ebrsa imazhet q\u00eb krijohen nga ato ngarkohen n\u00eb Docker Registry.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/35805eca81605bd64c6910b7965b567e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Pastrimi i registry<\/h3>\n<p>\nKjo nuk ka t\u00eb b\u00ebj\u00eb me ndalimin e shtresave q\u00eb mbeten t\u00eb varura pas etiketimeve t\u00eb fshir\u00eb \u2014 kjo \u00ebsht\u00eb nj\u00eb mund\u00ebsi standarde e vet\u00eb Docker Registry. Kjo ka t\u00eb b\u00ebj\u00eb me situat\u00ebn kur akumulojn\u00eb shum\u00eb etiketa Docker dhe ne kuptojm\u00eb se nj\u00eb pjes\u00eb e tyre nuk na nevojitet m\u00eb, por ato z\u00ebn\u00eb hap\u00ebsir\u00eb (dhe\/ose ne paguajm\u00eb p\u00ebr t\u00eb).<\/p>\n<p>Cilat jan\u00eb strategjit\u00eb e pastrimit?<\/p>\n<ol>\n<li> Mund t\u00eb mos b\u00ebsh asgj\u00eb <b>n\u00eb pastrim<\/b>. Ndonj\u00ebher\u00eb \u00ebsht\u00eb m\u00eb e thjesht\u00eb t\u00eb paguash pak p\u00ebr hap\u00ebsir\u00eb t\u00eb tep\u00ebrt sesa t\u00eb deshifrosh nj\u00eb kafaz t\u00eb madh me etiketa. Por kjo funksionon vet\u00ebm deri n\u00eb nj\u00eb pik\u00eb t\u00eb caktuar.<\/li>\n<li> <b>Rikthimi i plot\u00eb<\/b>. N\u00ebse fshihen t\u00eb gjitha imazhet dhe rind\u00ebrtohen vet\u00ebm ato aktuale n\u00eb sistemin CI, mund t\u00eb ndodh\u00eb nj\u00eb problem. N\u00ebse nj\u00eb kontejner ri-renditet n\u00eb prodhim, p\u00ebr t\u00eb do t\u00eb ngarkohet nj\u00eb imazh i ri \u2014 nj\u00eb q\u00eb nuk \u00ebsht\u00eb provuar nga askush. Kjo shkat\u00ebrron iden\u00eb e infrastruktur\u00ebs t\u00eb pakthyeshme.<\/li>\n<li> <b>Blue-green<\/b>. Nj\u00eb registry filloi t\u00eb mbushej \u2014 ngarkojm\u00eb imazhet n\u00eb nj\u00eb tjet\u00ebr. I nj\u00ebjti problem si n\u00eb m\u00ebnyr\u00ebn e m\u00ebparshme: n\u00eb cilin moment mund t\u00eb pastroni at\u00eb registry q\u00eb filloi t\u00eb mbushej?<\/li>\n<li> <b>N\u00eb koh\u00eb<\/b>. T\u00eb fshihen t\u00eb gjitha imazhet m\u00eb t\u00eb vjetra se 1 muaj? Por gjithmon\u00eb do t\u00eb ket\u00eb nj\u00eb sh\u00ebrbim q\u00eb nuk \u00ebsht\u00eb azhurnuar p\u00ebr nj\u00eb muaj\u2026<\/li>\n<li> <b>Dora dor\u00ebs<\/b> t\u00eb p\u00ebrcaktoj\u00eb se \u00e7far\u00eb mund t\u00eb fshihet.<\/li>\n<\/ol>\n<p>\n\u041f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0436\u0438\u0437\u043d\u0435\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0434\u0432\u0430: \u043d\u0435 \u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0438\u043b\u0438 \u0436\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0438\u0437 blue-green + \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0440\u0435\u0447\u044c \u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c: \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043f\u043e\u0440\u0430 \u043f\u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c registry, \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u0432\u0441\u0435 \u043d\u043e\u0432\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u0432 \u043d\u0435\u0433\u043e \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0435\u0441\u044f\u0446\u0430. \u0410 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0441\u044f\u0446 \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u043a\u0430\u043a\u0438\u0435 pod&#8217;\u044b \u0432 Kubernetes \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0442\u0430\u0440\u044b\u0439 registry, \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435 \u0438\u0445 \u0442\u043e\u0436\u0435 \u0432 \u043d\u043e\u0432\u044b\u0439 registry.<\/p>\n<p>K\u00ebnduam n\u00eb <b>werf<\/b>? \u041c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c:<\/p>\n<ol>\n<li> Git head: \u0432\u0441\u0435 \u0442\u0435\u0433\u0438, \u0432\u0441\u0435 \u0432\u0435\u0442\u043a\u0438, \u2014 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f, \u0447\u0442\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043f\u0440\u043e\u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 Git, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438 \u0432 \u043e\u0431\u0440\u0430\u0437\u0430\u0445 (\u0430 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043d\u0430\u0434\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432 \u0441\u0430\u043c\u043e\u043c Git&#8217;\u0435);<\/li>\n<li> \u0432\u0441\u0435 pod&#8217;\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043a\u0430\u0447\u0435\u043d\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 Kubernetes;<\/li>\n<li> \u0441\u0442\u0430\u0440\u044b\u0435 ReplicaSet&#8217;\u044b (\u0442\u043e, \u0447\u0442\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u043a\u0430\u0447\u0435\u043d\u043e), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c Helm-\u0440\u0435\u043b\u0438\u0437\u044b \u0438 \u043e\u0442\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u0442\u0430\u043c.<\/li>\n<\/ol>\n<p>\n\u2026 dhe t\u00eb b\u00ebjm\u00eb nj\u00eb list\u00eb t\u00eb zez\u00eb nga ky grup \u2014 nj\u00eb list\u00eb imazhesh q\u00eb nuk do t\u00eb fshijm\u00eb. T\u00eb gjitha t\u00eb tjerat i pastrojm\u00eb, dhe m\u00eb pas gjejm\u00eb imazhet e fazave jetim dhe i fshijm\u00eb ato gjithashtu.<\/p>\n<h2>Faza e ndarjes (deploy)<\/h2>\n<p><\/p>\n<h3>Deklarativitet i besuesh\u00ebm<\/h3>\n<p>\nMomentin e par\u00eb q\u00eb duam t\u00eb theksojm\u00eb n\u00eb deploi \u00ebsht\u00eb publikimi i konfiguracionit t\u00eb p\u00ebrmir\u00ebsuar t\u00eb burimeve, i shpallur n\u00eb m\u00ebnyr\u00eb deklarative. Dokumenti origjinal YAML me p\u00ebrshkrimin e burimeve Kubernetes gjithmon\u00eb diferon ndjesh\u00ebm nga rezultati, i cili funksionon realisht n\u00eb klaster. Kjo p\u00ebr shkak se Kubernetes shton n\u00eb konfigurim:<\/p>\n<ol>\n<li> identifikuesit;<\/li>\n<li> informacionin sh\u00ebrbim;<\/li>\n<li> shum\u00eb vlera t\u00eb paracaktuara;<\/li>\n<li> seksionin me statusin aktual;<\/li>\n<li> ndryshimet e b\u00ebra gjat\u00eb funksionimit t\u00eb admission webhook;<\/li>\n<li> rezultatin e pun\u00ebs s\u00eb kontrollor\u00ebve t\u00eb ndrysh\u00ebm (dhe planifikuesit).<\/li>\n<\/ol>\n<p>\nPrandaj, kur shfaqet nj\u00eb konfigurim i ri burimi (<i>e re<\/i>), nuk mund ta marrim dhe ta shkruajm\u00eb p\u00ebrs\u00ebri konfigurimin aktual, \"t\u00eb gjall\u00eb\", (<i>live<\/i>). P\u00ebr k\u00ebt\u00eb do t\u00eb na duhet t\u00eb krahasojm\u00eb <i>e re<\/i> me konfigurimin e kaluar t\u00eb aplikuar (<i>\"last-applied\"<\/i>) dhe t\u00eb aplikojm\u00eb <i>live<\/i> patch-in e marr\u00eb.<\/p>\n<p>Ky qasje quhet <b>\"2-way merge\"<\/b>. Ai p\u00ebrdoret, p\u00ebr shembull, n\u00eb Helm.<\/p>\n<p>Ka edhe nj\u00eb <b>\"3-way merge\"<\/b>, i cili ndryshon n\u00eb at\u00eb q\u00eb:<\/p>\n<ul>\n<li> duke krahasuar <i>\"last-applied\"<\/i> dhe <i>e re<\/i>, shikojm\u00eb \u00e7far\u00eb \u00ebsht\u00eb fshir\u00eb;<\/li>\n<li> duke krahasuar <i>e re<\/i> dhe <i>live<\/i>, shikojm\u00eb \u00e7far\u00eb \u00ebsht\u00eb e shtuar ose ndryshuar;<\/li>\n<li> patch-i i p\u00ebrmbledhur aplikohet n\u00eb <i>live<\/i>.<\/li>\n<\/ul>\n<p>\n\u041c\u044b \u0434\u0435\u043f\u043b\u043e\u0438\u043c 1000+ \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 Helm, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0436\u0438\u0432\u0451\u043c \u0441 2-way merge. \u041e\u0434\u043d\u0430\u043a\u043e \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0440\u044f\u0434 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u0430\u0442\u0447\u0430\u043c\u0438, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0438\u043c\u0438 Helm&#8217;\u0443 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<h3>Statusi aktual i publikimit<\/h3>\n<p>\nPas ngjarjes s\u00eb radh\u00ebs, sistemi yn\u00eb CI ka gjeneruar nj\u00eb konfigurim t\u00eb ri p\u00ebr Kubernetes, dhe ai e d\u00ebrgon p\u00ebr aplikim <i>(apply)<\/i> n\u00eb klaster \u2014 p\u00ebrmes Helm ose <code>kubectl aplikoni<\/code>. M\u00eb pas ndodh \"N-way merge\", q\u00eb Kubernetes API e miraton me k\u00ebnaq\u00ebsi p\u00ebr sistemin CI, dhe ky i fundit p\u00ebr p\u00ebrdoruesin e tij.<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/fcc8251525f32c913f30fbcdc4296198.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMegjithat\u00eb, ka nj\u00eb problem t\u00eb madh: sepse <b>nj\u00eb aplikim i suksessh\u00ebm nuk do t\u00eb thot\u00eb nj\u00eb publikim t\u00eb suksessh\u00ebm.<\/b>. \u0415\u0441\u043b\u0438 Kubernetes \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u2014 \u043c\u044b \u0435\u0449\u0451 \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0440\u0435\u0441\u0442\u0430\u0440\u0442 pod&#8217;\u043e\u0432 \u0432\u043e frontend&#8217;\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e, \u0430 \u0432 backend&#8217;\u0435 \u2014 \u043d\u0435\u0442, \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>P\u00ebr t\u00eb b\u00ebr\u00eb gjith\u00e7ka si\u00e7 duhet, n\u00eb k\u00ebt\u00eb skem\u00eb ndihmon nj\u00eb lidh\u00ebs t\u00eb ve\u00e7ant\u00eb \u2014 nj\u00eb tracker i cili do t\u00eb marr\u00eb informacionin p\u00ebr statusin nga Kubernetes API dhe do ta transmetoj\u00eb at\u00eb p\u00ebr analiz\u00eb t\u00eb m\u00ebtejshme t\u00eb realitetit. Ne krijuam nj\u00eb bibliotek\u00eb Open Source n\u00eb Go \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/kubedog\"><b>\"kubedog\"<\/b><\/a><\/noindex> <i>(shih njoftimin e saj <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/434160\/\">k\u00ebtu<\/a><\/noindex>)<\/i>, \u2014 e cila e zgjidh k\u00ebt\u00eb problem dhe \u00ebsht\u00eb e integruar n\u00eb werf.<\/p>\n<p>Komportimi i k\u00ebtij tracker-i n\u00eb nivelin e werf konfigurohet p\u00ebrmes anotacioneve, t\u00eb cilat vendosen n\u00eb Deployments ose StatefulSets. Anotacioni kryesor \u2014 <code>\"fail-mode\"<\/code> kupton vlerat e m\u00ebposhtme:<\/p>\n<ul>\n<li> <code>\"IgnoreAndContinueDeployProcess\"<\/code> \u2014 injorojm\u00eb problemet e publikimit t\u00eb k\u00ebtij komponenti dhe vazhdojm\u00eb me publikimin;<\/li>\n<li> <code>\"FailWholeDeployProcessImmediately\"<\/code> \u2014 nj\u00eb gabim n\u00eb k\u00ebt\u00eb komponent ndalon procesin e publikimit;<\/li>\n<li> <code>\"HopeUntilEndOfDeployProcess\"<\/code> \u2014 shpresojm\u00eb se ky komponent do t\u00eb funksionoj\u00eb deri n\u00eb fund t\u00eb publikimit.<\/li>\n<\/ul>\n<p>\nP\u00ebr shembull, nj\u00eb kombinim i till\u00eb i burimeve dhe vlerave t\u00eb anotacionit <code>\"fail-mode\"<\/code>:<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/40e161710e8a535cd95f1eb66ca8407b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u041a\u043e\u0433\u0434\u0430 \u0434\u0435\u043f\u043b\u043e\u0438\u043c \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437, \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (MongoDB) \u0435\u0449\u0451 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u0430 \u2014 Deployment&#8217;\u044b \u0443\u043f\u0430\u0434\u0443\u0442. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0430\u0441\u044c, \u0438 \u0434\u0435\u043f\u043b\u043e\u0439 \u0432\u0441\u0451 \u0436\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u0442.<\/p>\n<p>Ka edhe dy anotacione p\u00ebr kubedog n\u00eb werf:<\/p>\n<ul>\n<li> <code>\"failures-allowed-per-replica\"<\/code> \u2014 numri i d\u00ebshtimeve t\u00eb lejuara p\u00ebr \u00e7do replik\u00eb;<\/li>\n<li> <code>\"show-logs-until\"<\/code> \u2014 \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e werf \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 (\u0432 stdout) \u043b\u043e\u0433\u0438 \u0438\u0437 \u0432\u0441\u0435\u0445 \u0432\u044b\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u044b\u0445 pod&#8217;\u043e\u0432. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u043e <code>\"PodIsReady\"<\/code> (p\u00ebr t\u00eb injoruar mesazhet, q\u00eb ndoshta nuk na nevojiten, kur pod-i fillon t\u00eb merr trafik), megjithat\u00eb jan\u00eb t\u00eb lejuara edhe vlera si <code>\"ControllerIsReady\"<\/code> dhe <code>\"EndOfDeploy\"<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u00c7far\u00eb tjet\u00ebr duam nga publikimi?<\/h3>\n<p>\nP\u00ebrve\u00e7 dy pikave t\u00eb p\u00ebrshkruara m\u00eb par\u00eb, ne do t\u00eb d\u00ebshironim:<\/p>\n<ul>\n<li> t\u00eb shohim <b>log-et<\/b> \u2014 dhe vet\u00ebm ato t\u00eb nevojshme, e jo t\u00eb gjitha;<\/li>\n<li> t\u00eb ndjekim <b>progresin,<\/b>sepse n\u00ebse nj\u00eb pun\u00eb \"nuk reagon\" p\u00ebr disa minuta, \u00ebsht\u00eb e r\u00ebnd\u00ebsishme t\u00eb kuptojm\u00eb se \u00e7far\u00eb po ndodh;<\/li>\n<li> t\u00eb kemi <b>rrotullim automatik<\/b> n\u00ebse ndodhi ndonj\u00eb problem (dhe p\u00ebr k\u00ebt\u00eb \u00ebsht\u00eb kritike t\u00eb dihet statusi real i publikimit). Publikimi duhet t\u00eb jet\u00eb atomar: ose p\u00ebrfundon deri n\u00eb fund, ose gjith\u00e7ka kthehet n\u00eb gjendjen e m\u00ebparshme.<\/li>\n<\/ul>\n<p><\/p>\n<h2>P\u00ebrfundimet<\/h2>\n<p>\nNe si kompani p\u00ebr realizimin e t\u00eb gjitha nuancave t\u00eb p\u00ebrshkruara n\u00eb faza t\u00eb ndryshme t\u00eb d\u00ebrgimit (nd\u00ebrtimi, publikimi, publikimi) kemi nevoj\u00eb p\u00ebr nj\u00eb sistem CI dhe utilitarin <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/flant\/werf\">werf<\/a><\/noindex>.<\/p>\n<p>N\u00eb p\u00ebrfundim:<\/p>\n<p><img decoding=\"async\" alt=\"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (p\u00ebrmbledhje dhe video k\u00ebrkese)\" src=\"\/wp-content\/uploads\/2019\/08\/bafba54f2df8740a1a12c93b3476e49a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMe ndihm\u00ebn e werf kemi b\u00ebr\u00eb p\u00ebrparim t\u00eb mir\u00eb n\u00eb zgjidhjen e nj\u00eb numri t\u00eb madh problemesh p\u00ebr inxhinier\u00ebt DevOps dhe do t\u00eb ishim t\u00eb lumtur n\u00ebse nj\u00eb komunitet m\u00eb i gjer\u00eb t\u00eb pakt\u00ebn ta provoj\u00eb k\u00ebt\u00eb utilitar n\u00eb veprim. T\u00eb arrihet nj\u00eb rezultat i mir\u00eb s\u00eb bashku do t\u00eb jet\u00eb m\u00eb e leht\u00eb.<\/p>\n<h2>Video dhe prezentime<\/h2>\n<p>\nVideo e prezantimit (~47 minuta):<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"cK3ackGUTLw\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/cK3ackGUTLw\/hqdefault.jpg\" alt=\"Luaj videon\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<p>Prezantimi i referatit:<\/p>\n<p><center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"\/\/speakerdeck.com\/player\/2033277984c04900b18940588edf1161\" frameborder=\"0\" allowfullscreen><\/iframe><\/center><\/p>\n<h2>P.S.<\/h2>\n<p>\nPrezantime t\u00eb tjera mbi Kubernetes n\u00eb blogun ton\u00eb:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459326\/\">Automatizimi i shkall\u00ebzimit dhe menaxhimi i burimeve n\u00eb Kubernetes<\/a><\/noindex>\u00bb <i>(Dmitrij Stolyarov; 27 prill 2019 n\u00eb \"Stachka\")<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/449096\/\">Zgjerimi dhe plot\u00ebsimi i Kubernetes<\/a><\/noindex>\u00bb <i>(Andrey Polovov; 8 Prill 2019 n\u00eb Saint HighLoad++)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/431500\/\">Baza t\u00eb dh\u00ebnash dhe Kubernetes<\/a><\/noindex>\u00bb <i>(Dmitri Stolyarov; 8 N\u00ebntor 2018 n\u00eb HighLoad++)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/412901\/\">Monitorimi dhe Kubernetes<\/a><\/noindex>\u00bb <i>(Dmitri Stolyarov; 28 Maj 2018 n\u00eb RootConf)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/345116\/\">Praktikat m\u00eb t\u00eb mira CI\/CD me Kubernetes dhe GitLab<\/a><\/noindex>\u00bb <i>(Dmitri Stolyarov; 7 N\u00ebntor 2017 n\u00eb HighLoad++)<\/i>;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/331188\/\">Eksperienca jon\u00eb me Kubernetes n\u00eb projekte t\u00eb vogla<\/a><\/noindex>\u00bb <i>(Dmitri Stolyarov; 6 qershor 2017 n\u00eb RootConf)<\/i>.<\/li>\n<\/ul>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u00abwerf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes\u00bb. \u0412 \u043d\u0451\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0442\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u043d\u0435 \u0441\u0440\u0430\u0437\u0443. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27531,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36754","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=\"description\" content=\"27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u00abwerf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes\u00bb. \u0412 \u043d\u0451\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0442\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u043d\u0435 \u0441\u0440\u0430\u0437\u0443.\" \/>\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\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada\" \/>\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\udd47werf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes (\u043e\u0431\u0437\u043e\u0440 \u0438 \u0432\u0438\u0434\u0435\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430) | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u00abwerf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes\u00bb. \u0412 \u043d\u0451\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0442\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u043d\u0435 \u0441\u0440\u0430\u0437\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada\" \/>\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=\"2019-10-31T19:13:37+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:13:37+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\udd47werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes (pasqyr\u00eb dhe video e raportit) | ProHoster","description":"M\u00eb 27 maj n\u00eb sall\u00ebn kryesore t\u00eb konferenc\u00ebs DevOpsConf 2019, e cila zhvillohet si pjes\u00eb e festivalit RIT++ 2019, n\u00eb seksionin \"Furnizimi i vazhduesh\u00ebm\", \u00ebsht\u00eb mbajtur nj\u00eb ligj\u00ebrat\u00eb \"werf \u2014 mjeti yn\u00eb p\u00ebr CI\/CD n\u00eb Kubernetes\". N\u00eb t\u00eb, flitet p\u00ebr problemet dhe sfidat me t\u00eb cilat p\u00ebrballen t\u00eb gjith\u00eb gjat\u00eb publikimit n\u00eb Kubernetes, si dhe p\u00ebr nuancat q\u00eb mund t\u00eb mos ken\u00eb dal\u00eb menj\u00ebher\u00eb.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","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\udd47werf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes (\u043e\u0431\u0437\u043e\u0440 \u0438 \u0432\u0438\u0434\u0435\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0430) | ProHoster","og:description":"27 \u043c\u0430\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0437\u0430\u043b\u0435 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 DevOpsConf 2019, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0444\u0435\u0441\u0442\u0438\u0432\u0430\u043b\u044f \u0420\u0418\u0422++ 2019, \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0435\u043a\u0446\u0438\u0438 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u00bb, \u043f\u0440\u043e\u0437\u0432\u0443\u0447\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u00abwerf \u2014 \u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f CI\/CD \u0432 Kubernetes\u00bb. \u0412 \u043d\u0451\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e \u0442\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445 \u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u0445, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u0432 Kubernetes, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u043d\u044b \u043d\u0435 \u0441\u0440\u0430\u0437\u0443.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/werf-nash-instrument-dlya-ci-cd-v-kubernetes-obzor-i-video-doklada","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":"2019-10-31T19:13:37+00:00","article:modified_time":"2019-10-31T19:13:37+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36754","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":"2026-01-22 04:44:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:39:23","updated":"2026-01-22 04:44:19","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\/36754","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=36754"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/36754\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/27531"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=36754"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=36754"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=36754"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}