{"id":31377,"date":"2019-10-31T21:40:57","date_gmt":"2019-10-31T18:40:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\/"},"modified":"2019-10-31T21:40:57","modified_gmt":"2019-10-31T18:40:57","slug":"nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","title":{"rendered":"Implementimi yn\u00eb i Continuous Deployment n\u00eb platform\u00ebn e klientit","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ne kemi vendosur nj\u00eb proces t\u00eb vazhduesh\u00ebm t\u00eb shp\u00ebrndarjes s\u00eb azhurnimeve n\u00eb server\u00ebt e klient\u00ebve n\u00eb True Engineering dhe d\u00ebshirojm\u00eb t\u00eb ndajm\u00eb k\u00ebt\u00eb p\u00ebrvoj\u00eb.<\/p>\n<p>Fillimisht, ne zhvilluam nj\u00eb sistem online p\u00ebr klientin dhe e vendos\u00ebm at\u00eb n\u00eb klasterin ton\u00eb Kubernetes. Tani zgjidhja jon\u00eb me ngarkes\u00eb t\u00eb lart\u00eb ka kaluar n\u00eb platform\u00ebn e klientit, p\u00ebr t\u00eb cil\u00ebn ne kemi konfiguruar nj\u00eb proces t\u00eb plot\u00eb automatik t\u00eb Continuous Deployment. Fal\u00eb k\u00ebsaj, ne e p\u00ebrshpejtuam koh\u00ebn e shp\u00ebrndarjes s\u00eb azhurnimeve n\u00eb mjedisin e produktit. <\/p>\n<p>N\u00eb k\u00ebt\u00eb artikull, ne do t\u00eb flasim p\u00ebr t\u00eb gjitha fazat e procesit t\u00eb Continuous Deployment (CD) ose shp\u00ebrndarjes s\u00eb azhurnimeve n\u00eb platform\u00ebn e klientit: <\/p>\n<ol>\n<li>si fillon ky proces, <\/li>\n<li>synchronize me repositorin Git t\u00eb klientit,<\/li>\n<li>nd\u00ebrtime e backend dhe frontend,<\/li>\n<li>shp\u00ebrndarja automatike e aplikacionit n\u00eb mjedisin testues, <\/li>\n<li>shp\u00ebrndarja automatike n\u00eb Prod. <\/li>\n<\/ol>\n<p>\nGjat\u00eb procesit do t\u00eb ndarim detajet e konfiguarit.<\/p>\n<p><img decoding=\"async\" alt=\"Implementimi yn\u00eb i Continuous Deployment n\u00eb platform\u00ebn e klientit\" src=\"\/wp-content\/uploads\/2019\/04\/54be580319906344a6e2f091395ea7a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>1. Fillimi i CD<\/h3>\n<p>\nContinuous Deployment fillon me faktin se zhvilluesi ngarkon ndryshimet n\u00eb deg\u00ebn e l\u00ebshimit t\u00eb repositorit ton\u00eb Git. <\/p>\n<p>Aplikacioni yn\u00eb funksionon mbi nj\u00eb arkitektur\u00eb mikrosherish dhe t\u00eb gjitha komponent\u00ebt e tij ruhen n\u00eb nj\u00eb repositor. Fal\u00eb k\u00ebsaj, t\u00eb gjitha mikrosherit jan\u00eb nd\u00ebrtuar dhe instaluar, madje edhe n\u00ebse nj\u00eb prej tyre \u00ebsht\u00eb ndryshuar. <\/p>\n<p>Ne e organizuam pun\u00ebn p\u00ebrmes nj\u00eb repositor p\u00ebr disa arsye: <\/p>\n<ul>\n<li>Komoditeti i zhvillimit \u2014 aplikacioni aktivisht po zhvillohet, k\u00ebshtu q\u00eb mund t\u00eb punoni menj\u00ebher\u00eb me t\u00eb gjith\u00eb kodin. <\/li>\n<li>Nj\u00eb pipeline i vet\u00ebm CI\/CD, q\u00eb garanton se aplikacioni si nj\u00eb sistem i vet\u00ebm kalon t\u00eb gjitha testet dhe shp\u00ebrndahet n\u00eb mjedisin prodhues t\u00eb klientit. <\/li>\n<li>Shkarkohet konfuzioni n\u00eb versionet \u2014 ne nuk kemi nevoj\u00eb t\u00eb ruajm\u00eb nj\u00eb hart\u00eb versionesh t\u00eb mikrosherive dhe t\u00eb p\u00ebrshkruajm\u00eb konfigurimin p\u00ebr secil\u00ebn mikrosher\u00eb n\u00eb skriptet Helm.<\/li>\n<\/ul>\n<h3>2. Synchronizimi me repositorin Git t\u00eb kodit burimor t\u00eb klientit<\/h3>\n<p>\nNdryshimet e b\u00ebra sinkronizohen automatikisht me repositorin Git t\u00eb klientit. Aty \u00ebsht\u00eb konfiguruar nd\u00ebrtimi i aplikacionit, i cili aktivizohet pas p\u00ebrdit\u00ebsimit t\u00eb deg\u00ebs, dhe shp\u00ebrndarja n\u00eb prodhimin. T\u00eb dy proceset ndodhin n\u00eb mjedisin e tyre nga repositorin Git. <\/p>\n<p>Ne mund t\u00eb punojm\u00eb drejtp\u00ebrdrejt me repositorin e klientit, pasi na duhen mjedise t\u00eb veta p\u00ebr zhvillim dhe testim. P\u00ebr k\u00ebto q\u00ebllime, ne p\u00ebrdorim repozitorin ton\u00eb Git \u2014 ai \u00ebsht\u00eb sinkronizuar me repozitorin e tyre Git. Sapo zhvilluesi publikon ndryshimet n\u00eb deg\u00ebn p\u00ebrkat\u00ebse t\u00eb repozitorios ton\u00eb, GitLab menj\u00ebher\u00eb i d\u00ebrgon k\u00ebto ndryshime klientit.<\/p>\n<p><img decoding=\"async\" alt=\"Implementimi yn\u00eb i Continuous Deployment n\u00eb platform\u00ebn e klientit\" src=\"\/wp-content\/uploads\/2019\/04\/9e704f112649b77f0522fa60cfcfc2bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPas k\u00ebsaj, duhet t\u00eb b\u00ebhet nd\u00ebrtimi. Ai p\u00ebrb\u00ebhet nga disa etapa: nd\u00ebrtimi i backend-it dhe frontend-it, testimi dhe d\u00ebrgimi n\u00eb prodhim.<\/p>\n<h3>3. Nd\u00ebrtimi i backend-it dhe frontend-it<\/h3>\n<p>\nNd\u00ebrtimi i backend-it dhe frontend-it \u00ebsht\u00eb dy detyra paralele q\u00eb kryhen n\u00eb sistemin GitLab Runner. Konfigurimi i nd\u00ebrtimit origjinal ndodhet n\u00eb k\u00ebt\u00eb repozitor.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ce\/ci\/yaml\/\">Tutorial p\u00ebr shkruarjen e skriptit YAML p\u00ebr nd\u00ebrtim n\u00eb GitLab<\/a><\/noindex>.<\/p>\n<p>GitLab Runner merr kodin nga repozitori p\u00ebrkat\u00ebs, me komand\u00ebn e nd\u00ebrtimit t\u00eb aplikacionit Java, e nd\u00ebrtuakan dhe e d\u00ebrgon n\u00eb Docker registry. K\u00ebtu ne nd\u00ebrtojm\u00eb backend-in dhe frontend-in, marrim imazhe Docker, t\u00eb cilat i ruajm\u00eb n\u00eb repozitorin nga ana e klientit. P\u00ebr menaxhimin e imazheve Docker p\u00ebrdorim <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/palantir\/gradle-docker\">plugin-in Gradle<\/a><\/noindex>.<\/p>\n<p>Ne sinkronizojm\u00eb versionet e imazheve tona me versionin e l\u00ebshimit q\u00eb do t\u00eb publikohet n\u00eb Docker. P\u00ebr funksionimin e qet\u00eb, ne b\u00ebm\u00eb disa konfigurime:<\/p>\n<p>1. Nd\u00ebrmjet ambientit t\u00eb testit dhe produktit, kontejner\u00ebt nuk rind\u00ebrtohen. Ne kemi b\u00ebr\u00eb parametrizime q\u00eb nj\u00ebjt\u00eb kontejner mund t\u00eb funksionoj\u00eb pa rind\u00ebrtim me t\u00eb gjitha konfigurimet, variablat e ambientit dhe sh\u00ebrbimet si n\u00eb ambientin e testit ashtu edhe n\u00eb prodhim. <\/p>\n<p>2. P\u00ebr p\u00ebrdit\u00ebsimin e aplikacionit p\u00ebrmes Helm, \u00ebsht\u00eb e nevojshme t\u00eb p\u00ebrcaktohet versioni i tij. Nd\u00ebrtimi yn\u00eb i backend-it, frontend-it dhe p\u00ebrdit\u00ebsimi i aplikacionit \u00ebsht\u00eb tre detyra t\u00eb ndryshme, prandaj \u00ebsht\u00eb e r\u00ebnd\u00ebsishme t\u00eb p\u00ebrdorim gjithandej t\u00eb nj\u00ebjtin version t\u00eb aplikacionit. P\u00ebr k\u00ebt\u00eb detyr\u00eb, ne p\u00ebrdorim t\u00eb dh\u00ebnat nga historia e Git, pasi konfigurimi i klasterit K8S dhe aplikacionit ndodhen n\u00eb nj\u00eb repozitor Git.<\/p>\n<p>Versionin e aplikacionit e marrim nga rezultatet e ekzekutimit t\u00eb komand\u00ebs<br \/>\n<code>git describe --tags --abbrev=7<\/code>.<\/p>\n<h3>4. Deployim automatik i t\u00eb gjitha ndryshimeve n\u00eb ambientin e testit (UAT) <\/h3>\n<p>\nEtapa e ardhshme n\u00eb k\u00ebt\u00eb skript nd\u00ebrtimi \u00ebsht\u00eb p\u00ebrdit\u00ebsimi automatik i klasterit K8S. Kjo ndodh n\u00ebn kushtin q\u00eb e gjith\u00eb aplikacioni t\u00eb jet\u00eb nd\u00ebrtuar dhe t\u00eb gjith\u00eb artefaktet t\u00eb jen\u00eb publikuar n\u00eb Docker Registry. Pas k\u00ebsaj, p\u00ebrgatitet p\u00ebrdit\u00ebsimi i ambientit t\u00eb testit.<\/p>\n<p>P\u00ebrdit\u00ebsimi i klasterit fillohet me ndihm\u00ebn e <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/helm\/#helm-upgrade\">P\u00ebrdit\u00ebsimi i Helm<\/a><\/noindex>. N\u00ebse di\u00e7ka shkoi keq, Helm do ta kthente automatikisht \u00e7do ndryshim. Nuk ka nevoj\u00eb t\u00eb kontrolloni pun\u00ebn e tij. <\/p>\n<p>Ne furnizojm\u00eb s\u00eb bashku me nd\u00ebrtimin konfigurimin e klasterit K8S. Prandaj, hapi tjet\u00ebr \u00ebsht\u00eb p\u00ebrdit\u00ebsimi i tij: configMaps, deploymente, sh\u00ebrbime, sekrete dhe \u00e7do konfigurim tjet\u00ebr K8S q\u00eb kemi nd\u00ebrruar. <\/p>\n<p>Pas k\u00ebsaj, Helm niset p\u00ebrdit\u00ebsimin RollOut t\u00eb aplikacionit n\u00eb mjedisin e testimit. Para se aplikacioni t\u00eb implementohet n\u00eb prodhim. Kjo b\u00ebhet n\u00eb m\u00ebnyr\u00eb q\u00eb p\u00ebrdoruesit t\u00eb verifikojn\u00eb manualisht karakteristikat e biznesit q\u00eb ne i kemi nxjerr\u00eb n\u00eb mjedisin e testimit.<\/p>\n<h3>5. Implementimi automatik i t\u00eb gjitha ndryshimeve n\u00eb Prod <\/h3>\n<p>\nP\u00ebr t\u00eb implementuar p\u00ebrdit\u00ebsimin n\u00eb mjedisin e prodhimit, duhet vet\u00ebm t\u00eb shtypni nj\u00eb buton n\u00eb GitLab \u2014 dhe kontejner\u00ebt menj\u00ebher\u00eb d\u00ebrgohen n\u00eb mjedisin produktiv.<\/p>\n<p>I nj\u00ebjti aplikacion mund t\u00eb funksionoj\u00eb pa ri-nxjerrje n\u00eb mjedise t\u00eb ndryshme \u2014 testim dhe prodhim. Ne p\u00ebrdorim t\u00eb nj\u00ebjtat artefakt, pa ndryshuar asgj\u00eb n\u00eb aplikacion, nd\u00ebrsa parametrat i p\u00ebrcaktojm\u00eb nga jasht\u00eb. <\/p>\n<p>Parametrizimi fleksib\u00ebl i cil\u00ebsimeve t\u00eb aplikacionit varet nga mjedisi n\u00eb t\u00eb cilin do t\u00eb ekzekutohet ky aplikacion. Ne e kemi nxjerr\u00eb t\u00eb gjitha cil\u00ebsimet e mjediseve jasht\u00eb: gjith\u00e7ka parametrizohet p\u00ebrmes konfigurimit K8S dhe parametrave t\u00eb Helm. Kur Helm implementon nd\u00ebrtimin n\u00eb mjedisin e testimit, i aplikon parametrat testues, nd\u00ebrsa n\u00eb mjedisin produktiv \u2014 parametrat produktiv.<\/p>\n<p>M\u00eb e v\u00ebshtira ishte parametrizimi i t\u00eb gjith\u00eb sh\u00ebrbimeve dhe variablave t\u00eb p\u00ebrdorura q\u00eb varen nga mjedisi dhe t'i kthenim ato n\u00eb variabla ambienti dhe p\u00ebrshkrimin-konfigurimin e parametrave p\u00ebr Helm. <\/p>\n<p>N\u00eb parametrat e aplikacionit p\u00ebrdoren variabla ambienti. Vlerat e tyre p\u00ebrcaktohen n\u00eb kontejner\u00ebt me an\u00eb t\u00eb K8S configmap, i cili formohet me an\u00eb t\u00eb shablloneve Go. P\u00ebr shembull, p\u00ebrcaktimi i nj\u00eb variabli ambienti p\u00ebr emrin e domain-it mund t\u00eb b\u00ebhet k\u00ebshtu:<\/p>\n<p><code>APP_EXTERNAL_DOMAIN: {{ (pluck .Values.global.env .Values.app.properties.app_external_domain | first) }}<\/code><\/p>\n<p><b>.Values.global.env <\/b>\u2013 n\u00eb k\u00ebt\u00eb variab\u00ebl ruhet emri i mjedisit (prod, stage, UAT).<br \/>\n<b>.Values.app.properties.app_external_domain<\/b> \u2013 n\u00eb k\u00ebt\u00eb variab\u00ebl p\u00ebrcaktojm\u00eb domain-in e nevojsh\u00ebm n\u00eb skedarin .Values.yaml <\/p>\n<p>Gjat\u00eb azhurnimit t\u00eb aplikacionit, Helm krijon nga skedar\u00ebt e shabllonit configmap.yaml dhe plot\u00ebson vler\u00ebn e APP_EXTERNAL_DOMAIN me vler\u00ebn e duhur n\u00eb var\u00ebsi t\u00eb ambientit n\u00eb t\u00eb cilin startohet azhurnimi i aplikacionit. Kjo variab\u00ebl vendoset tashm\u00eb n\u00eb kontejner. Ajo \u00ebsht\u00eb e qasshme nga aplikacioni, k\u00ebshtu q\u00eb n\u00eb \u00e7do ambient aplikacioni do t\u00eb ket\u00eb vlera t\u00eb ndryshme p\u00ebr k\u00ebt\u00eb variab\u00ebl. <\/p>\n<p>N\u00eb lidhje me t\u00eb fundit, n\u00eb Spring Cloud u shpall mb\u00ebshtetje p\u00ebr K8S, p\u00ebrfshir\u00eb pun\u00ebn me configMaps: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-kubernetes\">Spring Cloud Kubernetes<\/a><\/noindex>. Nd\u00ebrsa projekti po zhvillohet aktivisht dhe po ndryshon ndjesh\u00ebm, ne nuk mund ta p\u00ebrdorim at\u00eb n\u00eb prodhim. Por e monitorojm\u00eb aktivisht gjendjen e tij dhe e p\u00ebrdorim n\u00eb konfigurimet DEV. Sa her\u00eb q\u00eb t\u00eb stabilizohet, do t\u00eb kalojm\u00eb nga p\u00ebrdorimi i variablave t\u00eb ambientit n\u00eb t\u00eb.<\/p>\n<h3>P\u00ebrve\u00e7 k\u00ebsaj<\/h3>\n<p>\nPra, Continuous Deployment \u00ebsht\u00eb konfiguruar dhe po funksionon. T\u00eb gjitha azhurnimet ndodhin me nj\u00eb klikim butoni. D\u00ebrgimi i ndryshimeve n\u00eb ambientin prodhues \u00ebsht\u00eb automatizuar. Dhe, \u00e7ka \u00ebsht\u00eb e r\u00ebnd\u00ebsishme, azhurnimet nuk ndalojn\u00eb pun\u00ebn e sistemit. <\/p>\n<p><img decoding=\"async\" alt=\"Implementimi yn\u00eb i Continuous Deployment n\u00eb platform\u00ebn e klientit\" src=\"\/wp-content\/uploads\/2019\/04\/07d609d9a40f644cfdad2bdb88652af2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Planet p\u00ebr t\u00eb ardhmen: migrimi automatizuar i baz\u00ebs<\/h3>\n<p>\nNe po mendojm\u00eb mbi p\u00ebrmir\u00ebsimin e baz\u00ebs dhe mund\u00ebsin\u00eb p\u00ebr t\u00eb kthyer k\u00ebto ndryshime. Sepse n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb funksionojn\u00eb dy versione t\u00eb ndryshme t\u00eb aplikacionit: e vjetra funksionon, nd\u00ebrsa e reja ngrihet. Dhe e vjetra do ta fikim vet\u00ebm kur t\u00eb sigurohemi se versiuni i ri punon. Migrimi i baz\u00ebs duhet t\u00eb lejoj\u00eb pun\u00ebn me t\u00eb dyja versionet e aplikacionit. <\/p>\n<p>Prandaj nuk mund t\u00eb ndryshojm\u00eb thjesht emrin e kolon\u00ebs ose t\u00eb dh\u00ebna t\u00eb tjera. Por mund t\u00eb krijojm\u00eb nj\u00eb kolon\u00eb t\u00eb re, t\u00eb kopjojm\u00eb t\u00eb dh\u00ebnat n\u00eb t\u00eb nga kolona e vjet\u00ebr dhe t\u00eb shkruajm\u00eb nxit\u00ebs q\u00eb do t\u00eb kopjojn\u00eb dhe azhurnojn\u00eb ato n\u00eb kolon\u00ebn tjet\u00ebr gjat\u00eb azhurnimit t\u00eb t\u00eb dh\u00ebnave. Dhe pas nj\u00eb deploy t\u00eb suksessh\u00ebm t\u00eb versionit t\u00eb ri t\u00eb aplikacionit, pas nj\u00eb periudhe t\u00eb mb\u00ebshtetjes pas lan\u00e7imit, ne do t\u00eb jemi n\u00eb gjendje t\u00eb fshijm\u00eb kolon\u00ebn e vjet\u00ebr dhe nxit\u00ebsin q\u00eb \u00ebsht\u00eb b\u00ebr\u00eb i padobish\u00ebm. <\/p>\n<p>N\u00ebse versioni i ri i aplikacionit nuk funksionon si\u00e7 duhet, ne mund t\u00eb kthehemi n\u00eb versionin e m\u00ebparsh\u00ebm, p\u00ebrfshir\u00eb versionin e m\u00ebparsh\u00ebm t\u00eb baz\u00ebs. Me fjal\u00eb t\u00eb tjera, ndryshimet tona do t\u00eb lejojn\u00eb pun\u00ebn me disa versione t\u00eb aplikacionit n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb. <\/p>\n<p>Ne planifikojm\u00eb t\u00eb b\u00ebjm\u00eb automatizimin e migrimit t\u00eb baz\u00ebs p\u00ebrmes pun\u00ebs K8S, duke e integruar at\u00eb n\u00eb procesin e CD. Dhe patjet\u00ebr do t\u00eb ndajm\u00eb k\u00ebt\u00eb p\u00ebrvoj\u00eb n\u00eb Habra.<br \/>\n<br \/>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/447812\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u043e \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 Continuous Deployment. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 time-to-market \u2013 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23342,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31377","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.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.\" \/>\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\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.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\udd47\u041d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Continuous Deployment \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\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-31T18:40:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:40:57+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\udd47 Zbatimi yn\u00eb i Continuous Deployment p\u00ebr platform\u00ebn e klientit | ProHoster","description":"N\u00eb True Engineering, ne kemi vendosur procesin e vazhduesh\u00ebm t\u00eb shp\u00ebrndarjes s\u00eb p\u00ebrdit\u00ebsimeve n\u00eb server\u00ebt e klientit dhe d\u00ebshirojm\u00eb t\u00eb ndajm\u00eb k\u00ebt\u00eb p\u00ebrvoj\u00eb. N\u00eb fillim, zhvilluam nj\u00eb sistem online p\u00ebr klientin dhe e implementuam at\u00eb n\u00eb infrastrukturen ton\u00eb.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","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\udd47\u041d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Continuous Deployment \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 | ProHoster","og:description":"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","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-31T18:40:57+00:00","article:modified_time":"2019-10-31T18:40:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31377","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-21 05:52:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:18:39","updated":"2026-01-21 05:52: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\/31377","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=31377"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/31377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/23342"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=31377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=31377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=31377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}