{"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\/cs\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","title":{"rendered":"Na\u0161e implementace Continuous Deployment na platformu z\u00e1kazn\u00edka","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ve spole\u010dnosti True Engineering jsme nastavili proces kontinu\u00e1ln\u00ed dod\u00e1vky aktualizac\u00ed na servery z\u00e1kazn\u00edka a chceme se o tuto zku\u0161enost pod\u011blit.<\/p>\n<p>Nejprve jsme vyvinuli online syst\u00e9m pro z\u00e1kazn\u00edka a nasadili jej ve vlastn\u00edm Kubernetes klastru. Nyn\u00ed na\u0161e vysoce zat\u00ed\u017een\u00e9 \u0159e\u0161en\u00ed p\u0159e\u0161lo na platformu z\u00e1kazn\u00edka, pro co\u017e jsme nastavili zcela automatizovan\u00fd proces kontinu\u00e1ln\u00edho nasazen\u00ed. D\u00edky tomu jsme urychlili time-to-market \u2013 dod\u00e1vku zm\u011bn do produk\u010dn\u00edho prost\u0159ed\u00ed. <\/p>\n<p>V tomto \u010dl\u00e1nku v\u00e1m p\u0159ibl\u00ed\u017e\u00edme v\u0161echny etapy procesu kontinu\u00e1ln\u00edho nasazen\u00ed (CD) neboli dod\u00e1vky aktualizac\u00ed na platformu z\u00e1kazn\u00edka: <\/p>\n<ol>\n<li>jak tento proces za\u010d\u00edn\u00e1, <\/li>\n<li>synchronizace s Git repozit\u00e1\u0159em z\u00e1kazn\u00edka,<\/li>\n<li>sestaven\u00ed backendu a frontendu,<\/li>\n<li>automatick\u00e9 nasazen\u00ed aplikace v testovac\u00edm prost\u0159ed\u00ed, <\/li>\n<li>automatick\u00e9 nasazen\u00ed na Prod. <\/li>\n<\/ol>\n<p>\nB\u011bhem procesu se pod\u011bl\u00edme o detaily nastaven\u00ed.<\/p>\n<p><img decoding=\"async\" alt=\"Na\u0161e implementace Continuous Deployment 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. Zah\u00e1jen\u00ed CD<\/h3>\n<p>\nKontinu\u00e1ln\u00ed nasazen\u00ed za\u010d\u00edn\u00e1 t\u00edm, \u017ee v\u00fdvoj\u00e1\u0159 vlo\u017e\u00ed zm\u011bny do uvol\u0148ovac\u00ed v\u011btve na\u0161eho Git repozit\u00e1\u0159e. <\/p>\n<p>Na\u0161e aplikace funguje na z\u00e1klad\u011b mikroservisn\u00ed architektury a v\u0161echny jej\u00ed komponenty jsou ulo\u017eeny v jednom repozit\u00e1\u0159i. D\u00edky tomu se sestavuj\u00ed a instaluj\u00ed v\u0161echny mikroservisy, i kdy\u017e do\u0161lo ke zm\u011bn\u011b pouze u jednoho z nich. <\/p>\n<p>Organizovali jsme pr\u00e1ci prost\u0159ednictv\u00edm jednoho repozit\u00e1\u0159e z n\u011bkolika d\u016fvod\u016f: <\/p>\n<ul>\n<li>Pohodl\u00ed v\u00fdvoje \u2013 aplikace se aktivn\u011b vyv\u00edj\u00ed, tak\u017ee lze pracovat okam\u017eit\u011b se v\u0161\u00edm k\u00f3dem. <\/li>\n<li>Jednotn\u00fd CI\/CD pipeline, kter\u00fd zaru\u010duje, \u017ee aplikace jako jeden syst\u00e9m projde v\u0161emi testy a je dod\u00e1na do prod prost\u0159ed\u00ed z\u00e1kazn\u00edka. <\/li>\n<li>Vylu\u010dujeme zmatek ve verz\u00edch \u2013 nemus\u00edme uchov\u00e1vat mapu verz\u00ed mikroservis\u016f a popisovat pro ka\u017edou mikroservisu jej\u00ed konfiguraci ve skriptech Helm.<\/li>\n<\/ul>\n<h3>2. Synchronizace s Git repozit\u00e1\u0159em zdrojov\u00e9ho k\u00f3du z\u00e1kazn\u00edka<\/h3>\n<p>\nProveden\u00e9 zm\u011bny se automaticky synchronizuj\u00ed s Git repozit\u00e1\u0159em z\u00e1kazn\u00edka. Tam je nastavena sestava aplikace, kter\u00e1 se spou\u0161t\u00ed po aktualizaci v\u011btve, a nasazen\u00ed do produkce. Oba procesy prob\u00edhaj\u00ed v jejich prost\u0159ed\u00ed z Git repozit\u00e1\u0159e. <\/p>\n<p>Nem\u016f\u017eeme pracovat s repozit\u00e1\u0159em klienta p\u0159\u00edmo, jeliko\u017e pot\u0159ebujeme vlastn\u00ed prost\u0159ed\u00ed pro v\u00fdvoj a testov\u00e1n\u00ed. K t\u011bmto \u00fa\u010del\u016fm pou\u017e\u00edv\u00e1me sv\u016fj Git repozit\u00e1\u0159 - ten je synchronizov\u00e1n s jejich Git repozit\u00e1\u0159em. Jakmile v\u00fdvoj\u00e1\u0159 nahraje zm\u011bny do p\u0159\u00edslu\u0161n\u00e9 v\u011btve na\u0161eho repozit\u00e1\u0159e, GitLab okam\u017eit\u011b tyto zm\u011bny ode\u0161le klientovi.<\/p>\n<p><img decoding=\"async\" alt=\"Na\u0161e implementace Continuous Deployment na platformu z\u00e1kazn\u00edka\" src=\"\/wp-content\/uploads\/2019\/04\/9e704f112649b77f0522fa60cfcfc2bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPot\u00e9 je t\u0159eba prov\u00e9st sestaven\u00ed. To se skl\u00e1d\u00e1 z n\u011bkolika f\u00e1z\u00ed: sestaven\u00ed backendu a frontendu, testov\u00e1n\u00ed a dod\u00e1n\u00ed do produkce.<\/p>\n<h3>3. Sestaven\u00ed backendu a frontendu<\/h3>\n<p>\nSestaven\u00ed backendu a frontendu je \u00fakol, kter\u00fd prob\u00edh\u00e1 paraleln\u011b v syst\u00e9mu GitLab Runner. Konfigurace z\u00e1kladn\u00edho sestaven\u00ed je ulo\u017eena ve stejn\u00e9m repozit\u00e1\u0159i.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ce\/ci\/yaml\/\">Tutori\u00e1l k naps\u00e1n\u00ed YAML skriptu pro sestaven\u00ed v GitLab<\/a><\/noindex>.<\/p>\n<p>GitLab Runner stahuje k\u00f3d z po\u017eadovan\u00e9ho repozit\u00e1\u0159e, pomoc\u00ed p\u0159\u00edkazu pro sestaven\u00ed Java aplikace jej sestav\u00ed a ode\u0161le do Docker registru. Zde m\u00e1me backend a frontend, z\u00edsk\u00e1v\u00e1me Docker obrazy, kter\u00e9 ukl\u00e1d\u00e1me do repozit\u00e1\u0159e na stran\u011b klienta. Pro spr\u00e1vu Docker obraz\u016f pou\u017e\u00edv\u00e1me <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/palantir\/gradle-docker\">plugin Gradle<\/a><\/noindex>.<\/p>\n<p>Synchronizujeme verze na\u0161ich obraz\u016f s verz\u00ed vyd\u00e1n\u00ed, kter\u00e1 bude ulo\u017eena v Dockeru. Pro hladk\u00fd provoz jsme provedli n\u011bkolik nastaven\u00ed:<\/p>\n<p>1. Mezi testovac\u00edm prost\u0159ed\u00edm a produk\u010dn\u00edm se kontejnery nep\u0159eskl\u00e1d\u00e1vaj\u00ed. Provedli jsme parametrizaci, aby jeden a ten sam\u00fd kontejner mohl fungovat bez p\u0159estavby se v\u0161emi nastaven\u00edmi, prom\u011bnn\u00fdmi prost\u0159ed\u00ed a slu\u017ebami jak v testov\u00e9m prost\u0159ed\u00ed, tak v produkci. <\/p>\n<p>2. Pro aktualizaci aplikace p\u0159es Helm je nutn\u00e9 uv\u00e9st jej\u00ed verzi. Na\u0161e sestaven\u00ed backendu, frontendu a aktualizace aplikace jsou t\u0159i r\u016fzn\u00e9 \u00fakoly, proto je d\u016fle\u017eit\u00e9 pou\u017e\u00edvat v\u0161ude stejnou verzi aplikace. Pro tento \u00fakol pou\u017e\u00edv\u00e1me data z historie Git, jeliko\u017e m\u00e1me konfiguraci K8S clusteru a aplikace v jednom Git repozit\u00e1\u0159i.<\/p>\n<p>Verzi aplikace z\u00edsk\u00e1v\u00e1me z v\u00fdsledk\u016f proveden\u00ed p\u0159\u00edkazu<br \/>\n<code>git describe --tags --abbrev=7<\/code>.<\/p>\n<h3>4. Automatick\u00e9 nasazen\u00ed v\u0161ech zm\u011bn do testovac\u00edho prost\u0159ed\u00ed (UAT) <\/h3>\n<p>\nDal\u0161\u00edm krokem v tomto skriptu sestaven\u00ed je automatick\u00e1 aktualizace clusteru K8S. K tomu doch\u00e1z\u00ed za p\u0159edpokladu, \u017ee se cel\u00e1 aplikace sestavila a v\u0161echny artefakty byly publikov\u00e1ny v Docker Registry. Pot\u00e9 se spust\u00ed aktualizace testovac\u00edho prost\u0159ed\u00ed.<\/p>\n<p>Aktualizace clusteru se spou\u0161t\u00ed pomoc\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/helm\/#helm-upgrade\">Aktualizace Helm<\/a><\/noindex>. Pokud n\u011bco neprob\u011bhne podle pl\u00e1nu, Helm automaticky a samostatn\u011b vr\u00e1t\u00ed v\u0161echny sv\u00e9 zm\u011bny zp\u011bt. Nen\u00ed t\u0159eba jeho pr\u00e1ci kontrolovat. <\/p>\n<p>Spole\u010dn\u011b se sestaven\u00edm dod\u00e1v\u00e1me konfiguraci klastru K8S. N\u00e1sleduj\u00edc\u00edm krokem je jej\u00ed aktualizace: configMaps, deployments, services, secrets a jak\u00e9koli dal\u0161\u00ed konfigurace K8S, kter\u00e9 jsme zm\u011bnili. <\/p>\n<p>Pot\u00e9 Helm spou\u0161t\u00ed aktualizaci aplikace v testovac\u00edm prost\u0159ed\u00ed. P\u0159ed t\u00edm, ne\u017e bude aplikace nasazena na produkci. Je to ud\u011bl\u00e1no proto, aby u\u017eivatel\u00e9 mohli ru\u010dn\u011b zkontrolovat obchodn\u00ed funkce, kter\u00e9 jsme zve\u0159ejnili v testovac\u00edm prost\u0159ed\u00ed.<\/p>\n<h3>5. Automatick\u00e9 nasazen\u00ed v\u0161ech zm\u011bn na Prod <\/h3>\n<p>\nPro nasazen\u00ed aktualizace do produk\u010dn\u00edho prost\u0159ed\u00ed sta\u010d\u00ed stisknout jedno tla\u010d\u00edtko v GitLab \u2014 a kontejnery jsou okam\u017eit\u011b doru\u010deny do produk\u010dn\u00edho prost\u0159ed\u00ed.<\/p>\n<p>Stejn\u00e1 aplikace m\u016f\u017ee bez p\u0159epracov\u00e1n\u00ed fungovat v r\u016fzn\u00fdch prost\u0159ed\u00edch \u2014 testovac\u00edm a produk\u010dn\u00edm. Pou\u017e\u00edv\u00e1me stejn\u00e9 artefakty, ani\u017e bychom m\u011bnili n\u011bco v aplikaci, a parametry nastavujeme zven\u010d\u00ed. <\/p>\n<p>Flexibiln\u00ed parametrizace nastaven\u00ed aplikace z\u00e1vis\u00ed na tom prost\u0159ed\u00ed, ve kter\u00e9m bude aplikace spu\u0161t\u011bna. V\u0161echny nastaven\u00ed prost\u0159ed\u00ed jsme p\u0159esunuli ven: v\u0161e je parametrizov\u00e1no p\u0159es konfiguraci K8S a parametry Helm. Kdy\u017e Helm nasazuje sestaven\u00ed v testovac\u00edm prost\u0159ed\u00ed, pou\u017e\u00edvaj\u00ed se testovac\u00ed parametry, zat\u00edmco v produk\u010dn\u00edm prost\u0159ed\u00ed \u2014 parametrizace pro produkci.<\/p>\n<p>Nejt\u011b\u017e\u0161\u00ed bylo parametrizovat v\u0161echny pou\u017e\u00edvan\u00e9 slu\u017eby a prom\u011bnn\u00e9, kter\u00e9 z\u00e1vis\u00ed na prost\u0159ed\u00ed, a p\u0159ev\u00e9st je na prom\u011bnn\u00e9 prost\u0159ed\u00ed a popis-konfiguraci parametr\u016f prost\u0159ed\u00ed pro Helm. <\/p>\n<p>V parametrech aplikace se pou\u017e\u00edvaj\u00ed prom\u011bnn\u00e9 prost\u0159ed\u00ed. Jejich hodnoty jsou zad\u00e1ny v kontejnerech pomoc\u00ed K8S configmap, kter\u00fd se \u0161ablonuje pomoc\u00ed Go \u0161ablon. Nap\u0159\u00edklad, zad\u00e1n\u00ed prom\u011bnn\u00e9 prost\u0159ed\u00ed pro n\u00e1zev dom\u00e9ny lze prov\u00e9st 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 v t\u00e9to prom\u011bnn\u00e9 je uchov\u00e1v\u00e1n n\u00e1zev prost\u0159ed\u00ed (prod, stage, UAT).<br \/>\n<b>.Values.app.properties.app_external_domain<\/b> \u2013 v t\u00e9to prom\u011bnn\u00e9 v souboru .Values.yaml zad\u00e1v\u00e1me po\u017eadovanou dom\u00e9nu. <\/p>\n<p>P\u0159i aktualizaci aplikace Helm vytv\u00e1\u0159\u00ed soubory configmap.yaml z \u0161ablon a vypl\u0148uje hodnotu APP_EXTERNAL_DOMAIN spr\u00e1vnou hodnotou v z\u00e1vislosti na prost\u0159ed\u00ed, ve kter\u00e9m se aktualizace prov\u00e1d\u00ed. Tato prom\u011bnn\u00e1 je nastavena ji\u017e v kontejneru. P\u0159\u00edstup k n\u00ed m\u00e1 aplikace, co\u017e znamen\u00e1, \u017ee v ka\u017ed\u00e9m prost\u0159ed\u00ed aplikace bude m\u00edt tato prom\u011bnn\u00e1 jinou hodnotu. <\/p>\n<p>Relativn\u011b ned\u00e1vno ve Spring Cloud byla p\u0159id\u00e1na podpora K8S, v\u010detn\u011b pr\u00e1ce s configMaps: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-kubernetes\">Spring Cloud Kubernetes<\/a><\/noindex>. Dokud projekt aktivn\u011b vyv\u00edj\u00edme a z\u00e1sadn\u011b se m\u011bn\u00ed, nem\u016f\u017eeme ho pou\u017e\u00edvat v produkci. Ale aktivn\u011b sledujeme jeho stav a pou\u017e\u00edv\u00e1me ho v DEV konfigurac\u00edch. Jakmile se stabilizuje, p\u0159epneme se z pou\u017e\u00edv\u00e1n\u00ed prom\u011bnn\u00fdch prost\u0159ed\u00ed na n\u011bj.<\/p>\n<h3>Celkem<\/h3>\n<p>\nTak\u017ee, Continuous Deployment je nastaven a funguje. V\u0161echny aktualizace prob\u00edhaj\u00ed jedn\u00edm stisknut\u00edm tla\u010d\u00edtka. Dod\u00e1n\u00ed zm\u011bn do produk\u010dn\u00edho prost\u0159ed\u00ed je automatick\u00e9. A co je d\u016fle\u017eit\u00e9, aktualizace nepozastavuj\u00ed \u010dinnost syst\u00e9mu. <\/p>\n<p><img decoding=\"async\" alt=\"Na\u0161e implementace Continuous Deployment 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 budoucna: automatizovan\u00e1 migrace datab\u00e1ze<\/h3>\n<p>\nUva\u017eovali jsme o upgradu datab\u00e1ze a mo\u017enosti tyto zm\u011bny vr\u00e1tit zp\u011bt. V\u017edy\u0165 sou\u010dasn\u011b b\u011b\u017e\u00ed dv\u011b r\u016fzn\u00e9 verze aplikace: jedna star\u00e1 a nov\u00e1 se spou\u0161t\u00ed. Starou vypneme teprve, kdy\u017e se ujist\u00edme, \u017ee nov\u00e1 verze funguje. Migrace datab\u00e1ze by m\u011bla umo\u017enit pr\u00e1ci s ob\u011bma verzemi aplikace. <\/p>\n<p>Proto nem\u016f\u017eeme jen tak zm\u011bnit n\u00e1zev sloupce nebo jin\u00e9 \u00fadaje. M\u016f\u017eeme v\u0161ak vytvo\u0159it nov\u00fd sloupec, zkop\u00edrovat do n\u011bj data ze star\u00e9ho sloupce a napsat triggery, kter\u00e9 p\u0159i aktualizaci dat sou\u010dasn\u011b kop\u00edruj\u00ed a aktualizuj\u00ed je v jin\u00e9m sloupci. A po \u00fasp\u011b\u0161n\u00e9m nasazen\u00ed nov\u00e9 verze aplikace, po uplynut\u00ed obdob\u00ed post-launch support, budeme moci star\u00fd sloupec a ji\u017e nepot\u0159ebn\u00fd trigger odstranit. <\/p>\n<p>Pokud nov\u00e1 verze aplikace nefunguje spr\u00e1vn\u011b, m\u016f\u017eeme se vr\u00e1tit k p\u0159edchoz\u00ed verzi, v\u010detn\u011b p\u0159edchoz\u00ed verze datab\u00e1ze. Jin\u00fdmi slovy, na\u0161e zm\u011bny umo\u017en\u00ed sou\u010dasnou pr\u00e1ci s n\u011bkolika verzemi aplikace. <\/p>\n<p>Pl\u00e1nujeme automatizaci migrace datab\u00e1ze prost\u0159ednictv\u00edm K8S job, integrovanou do procesu CD. A ur\u010dit\u011b se o tento z\u00e1\u017eitek pod\u011bl\u00edme na Habru.<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.3 - 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\/cs\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\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\/cs\/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\u0161e implementace Continuous Deployment na platformu z\u00e1kazn\u00edka | ProHoster","description":"Ve spole\u010dnosti True Engineering jsme nastavili proces kontinu\u00e1ln\u00edho dod\u00e1v\u00e1n\u00ed aktualizac\u00ed na servery z\u00e1kazn\u00edka a chceme se o tuto zku\u0161enost pod\u011blit. Nejprve jsme vyvinuli online syst\u00e9m pro z\u00e1kazn\u00edka a nasadili jej na vlastn\u00ed infrastruktu\u0159e.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/31377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=31377"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/31377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/23342"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=31377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=31377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=31377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}