{"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\/sk\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","title":{"rendered":"Na\u0161a implement\u00e1cia kontinu\u00e1lneho nasadzovania na platformu z\u00e1kazn\u00edka","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>V True Engineering sme nastavili proces nepretr\u017eit\u00e9ho dod\u00e1vania aktualiz\u00e1ci\u00ed na servery z\u00e1kazn\u00edka a chceme sa o t\u00fato sk\u00fasenos\u0165 podeli\u0165.<\/p>\n<p>Na za\u010diatku sme vyvinuli online syst\u00e9m pre z\u00e1kazn\u00edka a nasadili ho do vlastn\u00e9ho klastrov\u00e9ho prostredia Kubernetes. Teraz na\u0161e vysoko za\u0165a\u017een\u00e9 rie\u0161enie presunulo na platformu z\u00e1kazn\u00edka, pre \u010do sme nastavili plne automatizovan\u00fd proces Continuous Deployment. V\u010faka tomu sme ur\u00fdchlili time-to-market \u2013 dodanie zmien do produk\u010dn\u00e9ho prostredia. <\/p>\n<p>V tomto \u010dl\u00e1nku prerozpr\u00e1vame v\u0161etky f\u00e1zy procesu Continuous Deployment (CD) alebo dod\u00e1vania aktualiz\u00e1ci\u00ed na platformu z\u00e1kazn\u00edka: <\/p>\n<ol>\n<li>ako tento proces za\u010d\u00edna, <\/li>\n<li>synchroniz\u00e1cia s Git-repozit\u00e1rom z\u00e1kazn\u00edka,<\/li>\n<li>kompil\u00e1cia backendu a frontendu,<\/li>\n<li>automatick\u00e9 nasadenie aplik\u00e1cie do testovacieho prostredia, <\/li>\n<li>automatick\u00e9 nasadenie na Prod. <\/li>\n<\/ol>\n<p>\nPo\u010das procesu sa podel\u00edme o podrobnosti nastavenia.<\/p>\n<p><img decoding=\"async\" alt=\"Na\u0161a implement\u00e1cia kontinu\u00e1lneho nasadzovania na platformu z\u00e1kazn\u00edka\" 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. Spustenie CD<\/h3>\n<p>\nContinuous Deployment za\u010d\u00edna t\u00fdm, \u017ee v\u00fdvoj\u00e1r zverejn\u00ed zmeny do vyd\u00e1vacej vetvy n\u00e1\u0161ho Git-repozit\u00e1ra. <\/p>\n<p>Na\u0161a aplik\u00e1cia funguje na b\u00e1ze mikroservisnej architekt\u00fary a v\u0161etky jej komponenty s\u00fa ulo\u017een\u00e9 v jednom repozit\u00e1ri. V\u010faka tomu sa zostavuj\u00fa a in\u0161taluj\u00fa v\u0161etky mikroservisy, aj ke\u010f sa zmenil jeden z nich. <\/p>\n<p>Pr\u00e1cu sme organizovali cez jeden repozit\u00e1r z nieko\u013ek\u00fdch d\u00f4vodov: <\/p>\n<ul>\n<li>Pohodlie v\u00fdvoja \u2013 aplik\u00e1cia sa akt\u00edvne rozv\u00edja, preto je mo\u017en\u00e9 pracova\u0165 hne\u010f so v\u0161etk\u00fdm k\u00f3dom. <\/li>\n<li>Jedin\u00fd pipeline CI\/CD, ktor\u00fd zaru\u010duje, \u017ee aplik\u00e1cia ako celok prech\u00e1dza v\u0161etk\u00fdmi testami a dod\u00e1va sa do prod-prostredia z\u00e1kazn\u00edka. <\/li>\n<li>Vylu\u010dujeme zm\u00e4tok vo verzi\u00e1ch \u2013 nemus\u00edme uchov\u00e1va\u0165 mapu verzi\u00ed mikroservisov a opisova\u0165 pre ka\u017ed\u00fd mikroservis vlastn\u00fa konfigur\u00e1ciu v skriptoch Helm.<\/li>\n<\/ul>\n<h3>2. Synchroniz\u00e1cia s Git-repozit\u00e1rom zdrojov\u00e9ho k\u00f3du z\u00e1kazn\u00edka<\/h3>\n<p>\nUpraven\u00e9 zmeny sa automaticky synchronizuj\u00fa s Git-repozit\u00e1rom z\u00e1kazn\u00edka. Tam je nastaven\u00e1 kompil\u00e1cia aplik\u00e1cie, ktor\u00e1 sa sp\u00fa\u0161\u0165a po aktualiz\u00e1cii vetvy a nasaden\u00ed do produkcie. Obe procesy prebiehaj\u00fa v ich prostred\u00ed z Git-repozit\u00e1ra. <\/p>\n<p>Nem\u00f4\u017eeme pracova\u0165 priamo s repozit\u00e1rom z\u00e1kazn\u00edka, preto\u017ee potrebujeme vlastn\u00e9 prostredia na v\u00fdvoj a testovanie. Na tento \u00fa\u010del pou\u017e\u00edvame n\u00e1\u0161 Git-repozit\u00e1r \u2014 je synchronizovan\u00fd s ich Git-repozit\u00e1rom. Akon\u00e1hle v\u00fdvoj\u00e1r zverejn\u00ed zmeny v pr\u00edslu\u0161nej vetve n\u00e1\u0161ho repozit\u00e1ra, GitLab okam\u017eite odosiela tieto zmeny z\u00e1kazn\u00edkovi.<\/p>\n<p><img decoding=\"async\" alt=\"Na\u0161a implement\u00e1cia kontinu\u00e1lneho nasadzovania na platformu z\u00e1kazn\u00edka\" src=\"\/wp-content\/uploads\/2019\/04\/9e704f112649b77f0522fa60cfcfc2bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPo tomto je potrebn\u00e9 vykona\u0165 zostavenie. To pozost\u00e1va z viacer\u00fdch krokov: zostavenia backendu a frontendu, testovania a nasadenia do produkcie.<\/p>\n<h3>3. Zostavenie backendu a frontendu<\/h3>\n<p>\nZostavenie backendu a frontendu je dvojica paraleln\u00fdch \u00faloh, ktor\u00e9 sa vykon\u00e1vaj\u00fa v syst\u00e9me GitLab Runner. Konfigur\u00e1cia p\u00f4vodn\u00e9ho zostavenia je ulo\u017een\u00e1 v tom istom repozit\u00e1ri.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ce\/ci\/yaml\/\">Tutori\u00e1l na p\u00edsanie YAML skriptu na zostavenie v GitLab<\/a><\/noindex>.<\/p>\n<p>GitLab Runner berie k\u00f3d z potrebn\u00e9ho repozit\u00e1ra, pomocou pr\u00edkazu na zostavenie Java aplik\u00e1cie ho zostav\u00ed a odo\u0161le do Docker registry. Tu zostavujeme backend a frontend, z\u00edskavame Docker obrazy, ktor\u00e9 ukl\u00e1dame do repozit\u00e1ra na strane z\u00e1kazn\u00edka. Na spr\u00e1vu Docker obrazov pou\u017e\u00edvame <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/palantir\/gradle-docker\">plugin Gradle<\/a><\/noindex>.<\/p>\n<p>Synchronizujeme verzie na\u0161ich obrazov s verziou vydania, ktor\u00e1 bude vydan\u00e1 v Dockeri. Pre hladk\u00fd chod sme urobili nieko\u013eko nastaven\u00ed:<\/p>\n<p>1. Medzi testovac\u00edm prostred\u00edm a produk\u010dn\u00fdm sa kontajnery neprestavuj\u00fa. Urobili sme parametraz\u00e1ciu, aby ten ist\u00fd kontajner mohol bez prestavovania fungova\u0165 so v\u0161etk\u00fdmi nastaveniami, premenn\u00fdmi prostred\u00edm a slu\u017ebami ako v testovacej, tak v produk\u010dnej f\u00e1ze. <\/p>\n<p>2. Na aktualiz\u00e1ciu aplik\u00e1cie cez Helm je potrebn\u00e9 uvies\u0165 jej verziu. Na\u0161e zostavenie backendu, frontendu a aktualiz\u00e1cia aplik\u00e1cie s\u00fa tri r\u00f4zne \u00falohy, preto je d\u00f4le\u017eit\u00e9 pou\u017e\u00edva\u0165 v\u0161ade t\u00fa ist\u00fa verziu aplik\u00e1cie. Na tento \u00fa\u010del vyu\u017e\u00edvame \u00fadaje z hist\u00f3rie Git, preto\u017ee na\u0161a konfigur\u00e1cia K8S klastra a aplik\u00e1cie sa nach\u00e1dza v jednom Git-repozit\u00e1ri.<\/p>\n<p>Verziu aplik\u00e1cie z\u00edskavame z v\u00fdsledkov vykonania pr\u00edkazu<br \/>\n<code>git describe --tags --abbrev=7<\/code>.<\/p>\n<h3>4. Automatick\u00e9 nasadenie v\u0161etk\u00fdch zmien v testovacom prostred\u00ed (UAT) <\/h3>\n<p>\n\u010eal\u0161\u00edm krokom v tomto skripte zostavenia je automatick\u00e1 aktualiz\u00e1cia klastra K8S. To sa deje pod podmienkou, \u017ee sa v\u0161etko aplik\u00e1cia zostavila a v\u0161etky artefakty boli publikovan\u00e9 v Docker Registry. Potom sa spust\u00ed aktualiz\u00e1cia testovacieho prostredia.<\/p>\n<p>Aktualiz\u00e1cia klastra sa sp\u00fa\u0161\u0165a pomocou <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/helm\/#helm-upgrade\">Aktualiz\u00e1cia Helm<\/a><\/noindex>. Ak nie\u010do neprebehne pod\u013ea pl\u00e1nu, Helm automaticky vr\u00e1ti v\u0161etky svoje zmeny sp\u00e4\u0165. Nie je potrebn\u00e9 sledova\u0165 jeho \u010dinnos\u0165. <\/p>\n<p>Dod\u00e1vame spolu so zostavou konfigur\u00e1ciu klastera K8S. Preto nasleduj\u00facim krokom je jej aktualiz\u00e1cia: configMaps, deployments, services, secrets a ak\u00e9ko\u013evek in\u00e9 konfigur\u00e1cie K8S, ktor\u00e9 sme zmenili. <\/p>\n<p>Potom Helm spust\u00ed RollOut aktualiz\u00e1ciu samotnej aplik\u00e1cie v testovacom prostred\u00ed. Predt\u00fdm, ako bude aplik\u00e1cia nasaden\u00e1 na produk\u010dn\u00e9 prostredie. To je vykonan\u00e9, aby pou\u017e\u00edvatelia mohli manu\u00e1lne skontrolova\u0165 obchodn\u00e9 funkcie, ktor\u00e9 sme nasadili do testovacieho prostredia.<\/p>\n<h3>5. Automatick\u00e9 nasadenie v\u0161etk\u00fdch zmien na Prod <\/h3>\n<p>\nNa nasadenie aktualiz\u00e1cie do produk\u010dn\u00e9ho prostredia sta\u010d\u00ed stla\u010di\u0165 jedno tla\u010didlo v GitLab - a kontajnery okam\u017eite pr\u00eddu do produk\u010dn\u00e9ho prostredia.<\/p>\n<p>T\u00e1 ist\u00e1 aplik\u00e1cia m\u00f4\u017ee bez op\u00e4tovn\u00e9ho zostavenia fungova\u0165 v r\u00f4znych prostrediach - testovom a produk\u010dnom. Pou\u017e\u00edvame tie ist\u00e9 artefakty, bez toho, aby sme menili nie\u010do v aplik\u00e1cii, pri\u010dom parametre d\u00e1vame zvonka. <\/p>\n<p>Flexibiln\u00e9 parametrizovanie nastaven\u00ed aplik\u00e1cie z\u00e1vis\u00ed od prostredia, v ktorom bude aplik\u00e1cia be\u017ea\u0165. V\u0161etky nastavenia prostred\u00ed sme preniesli von: v\u0161etko sa parametrizuje prostredn\u00edctvom konfigur\u00e1cie K8S a parametrov Helm. Ke\u010f Helm nasadzuje zostavu do testovacieho prostredia, aplikuj\u00fa sa testovacie parametre, a v produk\u010dnom prostred\u00ed - produk\u010dn\u00e9 parametre.<\/p>\n<p>Naj\u0165a\u017e\u0161ie bolo parametrizova\u0165 v\u0161etky pou\u017e\u00edvan\u00e9 slu\u017eby a premenne, ktor\u00e9 z\u00e1visia od prostredia, a previes\u0165 ich na premenn\u00e9 prostredia a popis-konfigur\u00e1cie parametrov prostredia pre Helm. <\/p>\n<p>V parametroch aplik\u00e1cie sa pou\u017e\u00edvaj\u00fa premenn\u00e9 prostredia. Ich hodnoty s\u00fa nastaven\u00e9 v kontajneroch pomocou K8S configmap, ktor\u00fd je \u0161ablonizovan\u00fd pomocou Go \u0161abl\u00f3n. Napr\u00edklad, nastavenie premennej prostredia na n\u00e1zov dom\u00e9ny m\u00f4\u017ee by\u0165 uroben\u00e9 takto:<\/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 t\u00e1to premenn\u00e1 uchov\u00e1va n\u00e1zov prostredia (prod, stage, UAT).<br \/>\n<b>.Values.app.properties.app_external_domain<\/b> \u2013 v tejto premennej nastavujeme potrebn\u00fa dom\u00e9nu v s\u00fabore .Values.yaml <\/p>\n<p>Pri aktualiz\u00e1cii aplik\u00e1cie Helm vytv\u00e1ra s\u00fabor configmap.yaml z \u0161abl\u00f3n a vypl\u0148uje hodnotu APP_EXTERNAL_DOMAIN po\u017eadovanou hodnotou v z\u00e1vislosti od prostredia, v ktorom sa aktualiz\u00e1cia aplik\u00e1cie sp\u00fa\u0161\u0165a. T\u00e1to premenn\u00e1 je nastaven\u00e1 u\u017e v kontajneri. Pr\u00edstup k nej m\u00e1 aplik\u00e1cia, a preto v ka\u017edom prostred\u00ed aplik\u00e1cie bude r\u00f4zna hodnota tejto premennej. <\/p>\n<p>Relat\u00edvne ned\u00e1vno sa v Spring Cloud objavila podpora K8S, vr\u00e1tane pr\u00e1ce s configMaps: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-kubernetes\">Spring Cloud Kubernetes<\/a><\/noindex>. K\u00fdm sa projekt akt\u00edvne vyv\u00edja a z\u00e1sadne men\u00ed, nem\u00f4\u017eeme ho pou\u017e\u00edva\u0165 v produkcii. Av\u0161ak akt\u00edvne monitorujeme jeho stav a pou\u017e\u00edvame ho v DEV konfigur\u00e1ci\u00e1ch. Akon\u00e1hle sa stabilizuje, prepneme sa z pou\u017e\u00edvania premenn\u00fdch prostredia na neho.<\/p>\n<h3>Spolu<\/h3>\n<p>\nTak\u017ee, Continuous Deployment je nastaven\u00fd a funguje. V\u0161etky aktualiz\u00e1cie sa dej\u00fa jedn\u00fdm stla\u010den\u00edm tla\u010didla. Dod\u00e1vka zmien do produk\u010dn\u00e9ho prostredia je automatick\u00e1. A \u010do je d\u00f4le\u017eit\u00e9, aktualiz\u00e1cie nep\u0159eru\u0161uj\u00fa pr\u00e1cu syst\u00e9mu. <\/p>\n<p><img decoding=\"async\" alt=\"Na\u0161a implement\u00e1cia kontinu\u00e1lneho nasadzovania na platformu z\u00e1kazn\u00edka\" src=\"\/wp-content\/uploads\/2019\/04\/07d609d9a40f644cfdad2bdb88652af2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Pl\u00e1ny do bud\u00facnosti: automatick\u00e1 migr\u00e1cia datab\u00e1zy<\/h3>\n<p>\nZam\u00fd\u0161\u013eali sme nad upgrade datab\u00e1zy a mo\u017enos\u0165ou zmeny t\u00fdchto \u00fadajov vr\u00e1ti\u0165 sp\u00e4\u0165. Preto\u017ee s\u00fa\u010dasne be\u017eia dve r\u00f4zne verzie aplik\u00e1cie: star\u00e1 verzia funguje, zatia\u013e \u010do nov\u00e1 sa sp\u00fa\u0161\u0165a. Star\u00e1 verzia bude vypnut\u00e1 len vtedy, ke\u010f sa uist\u00edme, \u017ee nov\u00e1 verzia funguje. Migr\u00e1cia datab\u00e1zy by mala umo\u017eni\u0165 fungovanie s oboma verziami aplik\u00e1cie. <\/p>\n<p>Preto nem\u00f4\u017eeme len tak zmeni\u0165 n\u00e1zov st\u013apca alebo in\u00e9 \u00fadaje. Ale m\u00f4\u017eeme vytvori\u0165 nov\u00fd st\u013apec, skop\u00edrova\u0165 do neho \u00fadaje zo star\u00e9ho st\u013apca a nap\u00edsa\u0165 sp\u00fa\u0161\u0165a\u010de, ktor\u00e9 bud\u00fa pri aktualiz\u00e1cii \u00fadajov z\u00e1rove\u0148 kop\u00edrova\u0165 a aktualizova\u0165 ich v druhom st\u013apci. A po \u00faspe\u0161nom nasaden\u00ed novej verzie aplik\u00e1cie, po uplynut\u00ed doby post launch support, budeme m\u00f4c\u0165 vymaza\u0165 star\u00fd st\u013apec a zbyto\u010dn\u00fd sp\u00fa\u0161\u0165a\u010d. <\/p>\n<p>Ak nov\u00e1 verzia aplik\u00e1cie nefunguje spr\u00e1vne, m\u00f4\u017eeme sa vr\u00e1ti\u0165 k predch\u00e1dzaj\u00facej verzii, vr\u00e1tane predch\u00e1dzaj\u00facej verzie datab\u00e1zy. Skr\u00e1tka, na\u0161e zmeny umo\u017enia s\u00fabe\u017ene pracova\u0165 s viacer\u00fdmi verziami aplik\u00e1cie. <\/p>\n<p>Pl\u00e1nujeme automatiz\u00e1ciu migr\u00e1cie datab\u00e1zy cez K8S job, integrova\u0165 ju do procesu CD. A ur\u010dite sa podel\u00edme o t\u00fato sk\u00fasenos\u0165 na Habre.<br \/>\n<br \/>Zdroj: <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.4 - 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\/sk\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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\udd47Na\u0161a implement\u00e1cia Continuous Deployment na platformu z\u00e1kazn\u00edka | ProHoster","description":"V True Engineering sme nastavili proces kontinu\u00e1lneho dod\u00e1vania aktualiz\u00e1ci\u00ed na servery z\u00e1kazn\u00edka a chceme sa podeli\u0165 o t\u00fato sk\u00fasenos\u0165. Na za\u010diatku sme vyvinuli online syst\u00e9m pre z\u00e1kazn\u00edka a nasadili ho na vlastn\u00e9 servery.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/31377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=31377"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/31377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/23342"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=31377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=31377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=31377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}