{"id":55870,"date":"2020-01-30T00:00:00","date_gmt":"2020-01-29T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian"},"modified":"2020-02-18T14:04:02","modified_gmt":"2020-02-18T11:04:02","slug":"ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","title":{"rendered":"Od skript\u016f k vlastn\u00ed platform\u011b: jak jsme automatizovali v\u00fdvoj v CIAN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Od skript\u016f k vlastn\u00ed platform\u011b: jak jsme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/965f1944c95e2020bec512a05d980a32.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa RIT 2019 n\u00e1\u0161 kolega Alexandr Korotkov mluvil <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=0wvUyjexoIg\">prezentace<\/a><\/noindex> o automatizaci v\u00fdvoje v CIAN: abychom usnadnili \u017eivot a pr\u00e1ci, pou\u017e\u00edv\u00e1me na\u0161i vlastn\u00ed platformu Integro. Ta sleduje \u017eivotn\u00ed cyklus \u00faloh, zbavuje v\u00fdvoj\u00e1\u0159e rutinn\u00edch operac\u00ed a v\u00fdrazn\u011b sni\u017euje po\u010det chyb v produkci. V tomto p\u0159\u00edsp\u011bvku dopln\u00edme Alexandr\u016fv refer\u00e1t a pov\u00edme, jak jsme p\u0159e\u0161li od jednoduch\u00fdch skript\u016f k integraci open source produkt\u016f p\u0159es vlastn\u00ed platformu a \u010demu se v\u011bnuje n\u00e1\u0161 samostatn\u00fd t\u00fdm automatizace.<br \/>\n\u00a0<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Nulov\u00e1 \u00farove\u0148<\/h2>\n<p>\n<i><b>\u201eNulov\u00e1 \u00farove\u0148 neexistuje, nev\u00edm o takov\u00e9\u201c<\/b><br \/>\nMistr Shifu z m\/f \u201eKung-Fu Panda\u201c<\/i><\/p>\n<p>Automatizace v CIAN za\u010dala 14 let po zalo\u017een\u00ed spole\u010dnosti. Tehdy v t\u00fdmu v\u00fdvoje bylo 35 lid\u00ed. T\u011b\u017eko tomu uv\u011b\u0159it, \u017ee? Samoz\u0159ejm\u011b, v n\u011bjak\u00e9 form\u011b automatizace p\u0159ece jen existovala, ale samostatn\u00fd sm\u011br pro nep\u0159etr\u017eitou integraci a dod\u00e1vku k\u00f3du se za\u010dal formovat pr\u00e1v\u011b v roce 2015.\u00a0<\/p>\n<p>V tu dobu jsme m\u011bli obrovsk\u00fd monolit z Pythonu, C# a PHP, nasazen\u00fd na serverech Linux\/Windows. Pro nasazen\u00ed tohoto monstra jsme m\u011bli sadu skript\u016f, kter\u00e9 jsme spou\u0161t\u011bli ru\u010dn\u011b. Byla tak\u00e9 sestava monolitu, kter\u00e1 p\u0159in\u00e1\u0161ela bolest a utrpen\u00ed kv\u016fli konflikt\u016fm p\u0159i slou\u010den\u00ed v\u011btv\u00ed, oprav\u00e1m chyb a op\u011btovn\u00e9mu sestavov\u00e1n\u00ed \u201es jin\u00fdm souborem \u00faloh v sestaven\u00ed\u201c. Zjednodu\u0161en\u011b proces vypadal takto:<\/p>\n<p><img decoding=\"async\" alt=\"Od skript\u016f k vlastn\u00ed platform\u011b: jak jsme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/03c4dd97e2ba0073bab1c33f6003a9ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo n\u00e1s neuspokojovalo a cht\u011bli jsme vybudovat opakovateln\u00fd, automatizovan\u00fd a \u0159\u00edzen\u00fd proces sestavov\u00e1n\u00ed a nasazen\u00ed. K tomu jsme pot\u0159ebovali CI\/CD syst\u00e9m a vyb\u00edrali jsme mezi bezplatnou verz\u00ed Teamcity a bezplatn\u00fdm Jenkins, proto\u017ee jsme s nimi pracovali a ob\u011b n\u00e1m vyhovovaly z hlediska funkc\u00ed. Vybrali jsme Teamcity jako modern\u011bj\u0161\u00ed produkt. Tehdy jsme je\u0161t\u011b nepou\u017e\u00edvali mikroslu\u017ebovou architekturu a nepo\u010d\u00edtali jsme s velk\u00fdm mno\u017estv\u00edm \u00faloh a projekt\u016f.<\/p>\n<h2>Dost\u00e1v\u00e1me se k my\u0161lence vlastn\u00ed syst\u00e9mu<\/h2>\n<p>\nZaveden\u00ed Teamcity odstranilo pouze \u010d\u00e1st ru\u010dn\u00ed pr\u00e1ce: zbylo je\u0161t\u011b vytv\u00e1\u0159en\u00ed Pull Request\u016f, posouv\u00e1n\u00ed \u00fakol\u016f podle status\u016f v Jira, v\u00fdb\u011br \u00fakol\u016f pro vyd\u00e1n\u00ed. S t\u00edm si syst\u00e9m Teamcity u\u017e neporadil. Bylo pot\u0159eba hledat cestu dal\u0161\u00ed automatizace. Zva\u017eovali jsme mo\u017enosti pr\u00e1ce se skripty v Teamcity nebo p\u0159echod na extern\u00ed automatiza\u010dn\u00ed syst\u00e9my. Nakonec jsme se rozhodli, \u017ee pot\u0159ebujeme maxim\u00e1ln\u00ed flexibilitu, kterou poskytuje pouze vlastn\u00ed \u0159e\u0161en\u00ed. Tak se objevila prvn\u00ed verze intern\u00edho automatiza\u010dn\u00edho syst\u00e9mu s n\u00e1zvem Integro.<\/p>\n<p>Teamcity se zab\u00fdv\u00e1 automatizac\u00ed na \u00farovni spu\u0161t\u011bn\u00ed proces\u016f sestaven\u00ed a nasazen\u00ed, zat\u00edmco Integro se zam\u011b\u0159ila na nad\u0159azenou automatizaci v\u00fdvojov\u00fdch proces\u016f. Bylo t\u0159eba spojit pr\u00e1ci s \u00fakoly v Jira se zpracov\u00e1n\u00edm souvisej\u00edc\u00edho zdrojov\u00e9ho k\u00f3du v Bitbucket. V t\u00e9to f\u00e1zi se v Integro za\u010daly objevovat vlastn\u00ed pracovn\u00ed postupy pro pr\u00e1ci s \u00fakoly r\u016fzn\u00fdch typ\u016f.\u00a0<\/p>\n<p>V d\u016fsledku zv\u00fd\u0161en\u00ed automatizace v obchodn\u00edch procesech vzrostl po\u010det projekt\u016f a b\u011bh\u016f v Teamcity. To p\u0159ineslo nov\u00fd probl\u00e9m: jedno bezplatn\u00e9 instance Teamcity u\u017e nesta\u010dilo (3 agenty a 100 projekt\u016f), p\u0159idali jsme dal\u0161\u00ed instanci (dal\u0161\u00ed 3 agenty a 100 projekt\u016f), pak je\u0161t\u011b jednu. Nakonec jsme z\u00edskali syst\u00e9m n\u011bkolika klastr\u016f, kter\u00fd bylo obt\u00ed\u017en\u00e9 spravovat:<\/p>\n<p><img decoding=\"async\" alt=\"Od skript\u016f k vlastn\u00ed platform\u011b: jak jsme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/d95565e01e70e31f6b139dfb9b9caf95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKdy\u017e se naskytla ot\u00e1zka \u010dtvrt\u00e9 instance, uv\u011bdomili jsme si, \u017ee takto d\u00e1l \u017e\u00edt nem\u016f\u017eeme, proto\u017ee celkov\u00e9 n\u00e1klady na podporu \u010dty\u0159 instanc\u00ed u\u017e se nehodily do \u017e\u00e1dn\u00e9ho r\u00e1mce. Vznikla ot\u00e1zka, zda koupit placenou verzi Teamcity nebo zvolit bezplatn\u00fd Jenkins. Provedli jsme v\u00fdpo\u010dty t\u00fdkaj\u00edc\u00ed se instanc\u00ed a pl\u00e1n\u016f automatizace a rozhodli jsme se, \u017ee budeme pokra\u010dovat na Jenkinsu. O p\u00e1r t\u00fddn\u016f pozd\u011bji jsme p\u0159e\u0161li na Jenkins a zbavili se \u010d\u00e1sti bolesti hlavy spojen\u00e9 s podporou n\u011bkolika instanc\u00ed Teamcity. D\u00edky tomu jsme se mohli soust\u0159edit na v\u00fdvoj Integro a p\u0159izp\u016fsoben\u00ed Jenkinsu na\u0161im pot\u0159eb\u00e1m.<\/p>\n<p>S rostouc\u00ed z\u00e1kladn\u00ed automatizac\u00ed (ve form\u011b automatick\u00e9ho vytv\u00e1\u0159en\u00ed Pull Request\u016f, sb\u011bru a publikov\u00e1n\u00ed pokryt\u00ed k\u00f3du a dal\u0161\u00edch kontrol) vznikla siln\u00e1 touha co nejv\u00edce se vzd\u00e1t manu\u00e1ln\u00edch vyd\u00e1n\u00ed a p\u0159enechat tuto pr\u00e1ci robot\u016fm. Krom\u011b toho uvnit\u0159 spole\u010dnosti za\u010dal p\u0159esun na mikroslu\u017eby, kter\u00e9 vy\u017eadovaly \u010dast\u00e1 vyd\u00e1n\u00ed, a to odd\u011blen\u011b od sebe. Tak jsme postupn\u011b dosp\u011bli k automatick\u00fdm vyd\u00e1n\u00edm na\u0161ich mikroslu\u017eeb (monolit zat\u00edm vyd\u00e1v\u00e1me ru\u010dn\u011b kv\u016fli slo\u017eitosti procesu). Ale, jak to obvykle b\u00fdv\u00e1, objevila se nov\u00e1 komplikace.\u00a0<\/p>\n<h2>Automatizujeme testov\u00e1n\u00ed<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Od skript\u016f k vlastn\u00ed platform\u011b: jak jsme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/9518ee0956922c6eb615bdef068ac525.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nD\u00edky automatizaci vyd\u00e1n\u00ed se zrychlily procesy v\u00fdvoje, \u010d\u00e1ste\u010dn\u011b i na \u00fakor vynech\u00e1n\u00ed n\u011bkter\u00fdch f\u00e1z\u00ed testov\u00e1n\u00ed. To vedlo k do\u010dasn\u00e9 ztr\u00e1t\u011b kvality. Zn\u00ed to ban\u00e1ln\u011b, ale spolu se zrychlen\u00edm vyd\u00e1n\u00ed bylo pot\u0159eba zm\u011bnit i metodologii v\u00fdvoje produktu. Bylo nutn\u00e9 p\u0159em\u00fd\u0161let o automatizaci testov\u00e1n\u00ed, zaveden\u00ed osobn\u00ed odpov\u011bdnosti (tady jde o \"p\u0159ijet\u00ed my\u0161lenky v hlav\u011b\", a ne o finan\u010dn\u00ed sankce) v\u00fdvoj\u00e1\u0159e za vydan\u00fd k\u00f3d a chyby v n\u011bm, a tak\u00e9 o rozhodnut\u00ed o vyd\u00e1n\u00ed\/ne vyd\u00e1n\u00ed \u00fakolu prost\u0159ednictv\u00edm automatick\u00e9ho nasazen\u00ed.\u00a0<\/p>\n<p>P\u0159i \u0159e\u0161en\u00ed probl\u00e9m\u016f s kvalitou jsme dosp\u011bli k dv\u011bma d\u016fle\u017eit\u00fdm rozhodnut\u00edm: za\u010dali jsme prov\u00e1d\u011bt kan\u00e1rkov\u00e1 testov\u00e1n\u00ed a zavedli jsme automatick\u00e9 monitorov\u00e1n\u00ed chyb na pozad\u00ed s automatickou reakc\u00ed na jeho p\u0159ekro\u010den\u00ed. Prvn\u00ed \u0159e\u0161en\u00ed n\u00e1m umo\u017enilo nal\u00e9zt z\u0159ejm\u00e9 chyby je\u0161t\u011b p\u0159ed plnohodnotn\u00fdm nasazen\u00edm k\u00f3du do produkce, druh\u00e9 sn\u00ed\u017eilo dobu reakce na probl\u00e9my v produkci. Chyby se samoz\u0159ejm\u011b st\u00e1vaj\u00ed, ale v\u011bt\u0161inu \u010dasu a \u00fasil\u00ed neztr\u00e1c\u00edme na opravy, ale na minimalizaci.\u00a0<\/p>\n<h2>T\u00fdm automatizace<\/h2>\n<p>\nNyn\u00ed m\u00e1me 130 v\u00fdvoj\u00e1\u0159\u016f a pokra\u010dujeme <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/article\/469965\/\">v r\u016fstu<\/a><\/noindex>. T\u00fdm pro neust\u00e1lou integraci a dod\u00e1v\u00e1n\u00ed k\u00f3du (d\u00e1le \u2013 t\u00fdm Deploy and Integration nebo DI) se skl\u00e1d\u00e1 ze 7 lid\u00ed a pracuje ve 2 sm\u011brech: v\u00fdvoj platformy automatizace Integro a DevOps.\u00a0<\/p>\n<p>DevOps zaji\u0161\u0165uje Dev\/Beta prost\u0159ed\u00ed webu CIAN, prost\u0159ed\u00ed Integro, pom\u00e1h\u00e1 v\u00fdvoj\u00e1\u0159\u016fm p\u0159i \u0159e\u0161en\u00ed probl\u00e9m\u016f a vyv\u00edj\u00ed nov\u00e9 p\u0159\u00edstupy k \u0161k\u00e1lov\u00e1n\u00ed prost\u0159ed\u00ed. Odd\u011blen\u00ed v\u00fdvoje Integro se zab\u00fdv\u00e1 jak samotnou Integro, tak p\u0159\u00edbuzn\u00fdmi slu\u017ebami, nap\u0159\u00edklad pluginy pro Jenkins, Jira, Confluence, a tak\u00e9 vyv\u00edj\u00ed pomocn\u00e9 utilitky a aplikace pro t\u00fdmy v\u00fdvoj\u00e1\u0159\u016f.\u00a0<\/p>\n<p>T\u00fdm DI spolupracuje s t\u00fdmem Platformy, kter\u00fd se zab\u00fdv\u00e1 v\u00fdvojem architektury, knihoven a p\u0159\u00edstup\u016f k v\u00fdvoji uvnit\u0159 spole\u010dnosti. Ka\u017ed\u00fd v\u00fdvoj\u00e1\u0159 v CIAN m\u016f\u017ee tak\u00e9 p\u0159isp\u011bt k automatizaci, nap\u0159\u00edklad vytvo\u0159it mikroautomatizaci podle pot\u0159eb t\u00fdmu nebo se pod\u011blit o skv\u011bl\u00fd n\u00e1pad, jak zlep\u0161it automatizaci.<\/p>\n<h2>Vrstven\u00fd kol\u00e1\u010d automatizace v CIAN<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Od skript\u016f k vlastn\u00ed platform\u011b: jak jsme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/22dcd2d0cc283d53bdaac081885657f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u0161echny syst\u00e9my zapojen\u00e9 do automatizace lze rozd\u011blit do n\u011bkolika vrstev:<\/p>\n<ol>\n<li>Extern\u00ed syst\u00e9my (Jira, Bitbucket atd.). S t\u011bmito syst\u00e9my pracuj\u00ed t\u00fdmy v\u00fdvoje.\n<\/li>\n<li>Platforma Integro. Nej\u010dast\u011bji s n\u00ed v\u00fdvoj\u00e1\u0159i nepracuj\u00ed p\u0159\u00edmo, ale pr\u00e1v\u011b ona podporuje fungov\u00e1n\u00ed cel\u00e9 automatizace.\n<\/li>\n<li>Slu\u017eby dod\u00e1vky, orchestraci a objevov\u00e1n\u00ed (nap\u0159\u00edklad Jenkins, Consul, Nomad). S jejich pomoc\u00ed nasazujeme k\u00f3d na serverech a zaji\u0161\u0165ujeme vz\u00e1jemnou spolupr\u00e1ci slu\u017eeb.\n<\/li>\n<li>Fyzick\u00e1 \u00farove\u0148 (servery, OS, p\u0159\u00edbuzn\u00fd software). Na t\u00e9to \u00farovni b\u011b\u017e\u00ed n\u00e1\u0161 k\u00f3d. M\u016f\u017ee to b\u00fdt jak fyzick\u00fd server, tak virtu\u00e1ln\u00ed (LXC, KVM, Docker).\n<\/li>\n<\/ol>\n<p>\nNa z\u00e1klad\u011b t\u00e9to koncepce rozd\u011blujeme z\u00f3ny odpov\u011bdnosti uvnit\u0159 t\u00fdmu DI. Dv\u011b prvn\u00ed \u00farovn\u011b pat\u0159\u00ed pod zodpov\u011bdnost odd\u011blen\u00ed v\u00fdvoje Integro, zat\u00edmco dv\u011b posledn\u00ed \u00farovn\u011b ji\u017e spadaj\u00ed pod zodpov\u011bdnost DevOps. Toto rozd\u011blen\u00ed umo\u017e\u0148uje soust\u0159edit se na \u00fakoly a nebr\u00e1n\u00ed vz\u00e1jemn\u00e9 interakci, proto\u017ee jsme si navz\u00e1jem bl\u00edzko a neust\u00e1le sd\u00edl\u00edme znalosti a zku\u0161enosti.<\/p>\n<h2>Integro<\/h2>\n<p>\nSoust\u0159ed\u00edme se na Integro a za\u010dneme technologick\u00fdm stackem:<\/p>\n<ul>\n<li>CentOs 7\n<\/li>\n<li>Docker + Nomad + Consul + Vault\n<\/li>\n<li>Java 11 (star\u00fd monolit Integro z\u016fstane na Java 8)\n<\/li>\n<li>Spring Boot 2.X + Spring Cloud Config\n<\/li>\n<li>PostgreSql 11\n<\/li>\n<li>RabbitMQ\u00a0\n<\/li>\n<li>Apache Ignite\n<\/li>\n<li>Camunda (embedded)\n<\/li>\n<li>Grafana + Graphite + Prometheus + Jaeger + ELK\n<\/li>\n<li>Web UI: React (CSR) + MobX\n<\/li>\n<li>SSO: Keycloak\n<\/li>\n<\/ul>\n<p>\nDr\u017e\u00edme se principu mikroservisn\u00ed architektury, a\u010dkoli m\u00e1me tak\u00e9 d\u011bdictv\u00ed v podob\u011b monolitu star\u0161\u00ed verze Integro. Ka\u017ed\u00e1 mikroservis b\u011b\u017e\u00ed ve sv\u00e9m Docker kontejneru, slu\u017eby spolu komunikuj\u00ed pomoc\u00ed HTTP po\u017eadavk\u016f a zpr\u00e1v RabbitMQ. Mikroservisy se navz\u00e1jem nach\u00e1zej\u00ed prost\u0159ednictv\u00edm Consulu a k n\u011bmu zas\u00edlaj\u00ed \u017e\u00e1dosti, p\u0159i\u010dem\u017e proch\u00e1zej\u00ed autorizac\u00ed p\u0159es SSO (Keycloak, OAuth 2\/OpenID Connect).<\/p>\n<p><img decoding=\"async\" alt=\"Od skript\u016f k vlastn\u00ed platform\u011b: jak jsme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/e7630c0bd62a40f397de1bf1c1097926.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJako konkr\u00e9tn\u00ed p\u0159\u00edklad si vezm\u011bme interakci s Jenkins, kter\u00e1 se skl\u00e1d\u00e1 z n\u00e1sleduj\u00edc\u00edch krok\u016f:<\/p>\n<ol>\n<li>Mikroservis pro spr\u00e1vu workflow (d\u00e1le Flow mikroservis) chce spustit sestaven\u00ed v Jenkins. K tomu prost\u0159ednictv\u00edm Consulu najde IP:PORT mikroservisu pro integraci s Jenkins (d\u00e1le Jenkins mikroservis) a zas\u00edl\u00e1 do n\u011bj asynchronn\u00ed po\u017eadavek na spu\u0161t\u011bn\u00ed sestaven\u00ed v Jenkins.\n<\/li>\n<li>Mikroservis Jenkins po obdr\u017een\u00ed po\u017eadavku vytvo\u0159\u00ed a vr\u00e1t\u00ed ve sv\u00e9 odpov\u011bdi Job ID, podle kter\u00e9ho bude mo\u017en\u00e9 identifikovat v\u00fdsledek pr\u00e1ce. Spolu s t\u00edm zah\u00e1j\u00ed sestaven\u00ed v Jenkins prost\u0159ednictv\u00edm vol\u00e1n\u00ed REST API.\n<\/li>\n<li>Jenkins provede sestaven\u00ed a po jeho dokon\u010den\u00ed ode\u0161le webhook s v\u00fdsledky vykon\u00e1n\u00ed do Jenkins mikroservisu.\n<\/li>\n<li>Mikroservis Jenkins, po obdr\u017een\u00ed webhooku, vytvo\u0159\u00ed zpr\u00e1vu o skon\u010den\u00ed zpracov\u00e1n\u00ed po\u017eadavku a p\u0159ipoj\u00ed k n\u00ed v\u00fdsledky vykon\u00e1n\u00ed. Vytvo\u0159en\u00e1 zpr\u00e1va je odesl\u00e1na do fronty RabbitMQ.\n<\/li>\n<li>Zpr\u00e1va publikovan\u00e1 prost\u0159ednictv\u00edm RabbitMQ se dostane k Flow mikroservisu, kter\u00fd se dozv\u00ed o v\u00fdsledku zpracov\u00e1n\u00ed sv\u00e9 \u00falohy, kdy\u017e porovn\u00e1 Job ID z po\u017eadavku a obdr\u017een\u00e9 zpr\u00e1vy.\n<\/li>\n<\/ol>\n<p>\nNyn\u00ed m\u00e1me p\u0159ibli\u017en\u011b 30 mikroservis\u016f, kter\u00e9 je mo\u017en\u00e9 rozd\u011blit do n\u011bkolika skupin:<\/p>\n<ol>\n<li>Spr\u00e1va konfigurac\u00ed.\n<\/li>\n<li>Informov\u00e1n\u00ed a interakce s u\u017eivateli (messengery, e-mail).\n<\/li>\n<li>Pr\u00e1ce se zdrojov\u00fdm k\u00f3dem.\n<\/li>\n<li>Integrace s nasazovac\u00edmi n\u00e1stroji (Jenkins, Nomad, Consul atd.).\n<\/li>\n<li>Monitorov\u00e1n\u00ed (verz\u00ed, chyb atd.).\n<\/li>\n<li>Webov\u00e9 n\u00e1stroje (UI pro spr\u00e1vu testovac\u00edch prost\u0159ed\u00ed, shroma\u017e\u010fov\u00e1n\u00ed statistik atd.).\n<\/li>\n<li>Integrace s task trackery a podobn\u00fdmi syst\u00e9my.\n<\/li>\n<li>Spr\u00e1va workflow pro r\u016fzn\u00e9 \u00fakoly.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Workflow \u00fakolu<\/h2>\n<p>\nIntegro automatizuje akce souvisej\u00edc\u00ed se \u017eivotn\u00edm cyklem \u00fakolu. Zjednodu\u0161en\u011b budeme pod \u017eivotn\u00edm cyklem \u00fakolu ch\u00e1pat workflow \u00fakolu v Jira. V na\u0161ich v\u00fdvojov\u00fdch procesech existuje n\u011bkolik variant workflow v z\u00e1vislosti na projektu, typu \u00fakolu a mo\u017enostech vybran\u00fdch v konkr\u00e9tn\u00edm \u00fakolu.\u00a0<\/p>\n<p>Pod\u00edvejme se na workflow, kter\u00e9 pou\u017e\u00edv\u00e1me nej\u010dast\u011bji:<\/p>\n<p><img decoding=\"async\" alt=\"Od skript\u016f k vlastn\u00ed platform\u011b: jak jsme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/62555be6bab024dd30f3cf70d4fe3cba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa diagramu ozuben\u00e9 kole\u010dko znamen\u00e1, \u017ee p\u0159echod je vyvol\u00e1n Integro automaticky, zat\u00edmco postava \u010dlov\u011bka ozna\u010duje, \u017ee p\u0159echod je vyvol\u00e1n manu\u00e1ln\u011b \u010dlov\u011bkem. Pod\u00edvejme se na n\u011bkolik cest, kter\u00fdmi m\u016f\u017ee \u00fakol proj\u00edt v tomto workflow.<\/p>\n<p>\u00dapln\u011b ru\u010dn\u00ed testov\u00e1n\u00ed na DEV+BETA bez kan\u00e1rkov\u00fdch test\u016f (obvykle tak vyd\u00e1v\u00e1me monolit):<\/p>\n<p><img decoding=\"async\" alt=\"Od skript\u016f k vlastn\u00ed platform\u011b: jak jsme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/775528862e14817dff5f69db6de654dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMohou existovat i jin\u00e9 kombinace p\u0159echod\u016f. N\u011bkdy lze cestu, kterou \u00fakol p\u016fjde, vybrat prost\u0159ednictv\u00edm options v Jira.<\/p>\n<h2>Pohyb \u00fakolu<\/h2>\n<p>\nPod\u00edvejme se na hlavn\u00ed kroky, kter\u00e9 se prov\u00e1d\u011bj\u00ed p\u0159i pohybu \u00fakolu v workflow \u201eTestov\u00e1n\u00ed na DEV + kan\u00e1rkov\u00e9 testy\u201c:<\/p>\n<p>1. V\u00fdvoj\u00e1\u0159 nebo PM vytvo\u0159\u00ed \u00fakol.<\/p>\n<p>2. V\u00fdvoj\u00e1\u0159 vezme \u00fakol do pr\u00e1ce. Po dokon\u010den\u00ed ho p\u0159evede do stavu IN REVIEW.<\/p>\n<p>3. Jira ode\u0161le Webhook sm\u011brem k Jira-mikroslu\u017eb\u011b (odpov\u00edd\u00e1 za integraci s Jira).<\/p>\n<p>4. Jira-mikroslu\u017eba ode\u0161le \u017e\u00e1dost do Flow-servisu (odpov\u00edd\u00e1 za vnit\u0159n\u00ed workflow, ve kter\u00fdch se vykon\u00e1v\u00e1 pr\u00e1ce) k zah\u00e1jen\u00ed workflow.<\/p>\n<p>5. Uvnit\u0159 Flow-servisu:<\/p>\n<ul>\n<li>Jsou p\u0159i\u0159azeni recenzenti k \u00fakolu (Users-mikroslu\u017eba, kter\u00e1 zn\u00e1 v\u0161echny o u\u017eivatel\u00edch + Jira-mikroslu\u017eba).<\/li>\n<li>Pro ka\u017ed\u00fd nalezen\u00fd repozit\u00e1\u0159 se prov\u00e1d\u00ed hled\u00e1n\u00ed v\u011btv\u00ed, ve kter\u00fdch je v\u011btev na\u0161eho \u00fakolu (pro usnadn\u011bn\u00ed hled\u00e1n\u00ed se n\u00e1zev v\u011btve shoduje s \u010d\u00edslem \u00fakolu v Jira). V\u011bt\u0161inou m\u00e1 \u00fakol pouze jednu v\u011btev v jednom repozit\u00e1\u0159i, co\u017e usnad\u0148uje spr\u00e1vu fronty na nasazen\u00ed a sni\u017euje prov\u00e1zanost mezi repozit\u00e1\u0159i.<\/li>\n<li>Pro ka\u017edou nalezenou v\u011btev se prov\u00e1d\u00ed n\u00e1sleduj\u00edc\u00ed sekvence akc\u00ed:\n<p> i) Slit\u00ed master-v\u011btve (Git-mikroslu\u017eba pro pr\u00e1ci s k\u00f3dem).<br \/>\n ii) V\u011btev je zablokov\u00e1na p\u0159ed zm\u011bnami v\u00fdvoj\u00e1\u0159em (Bitbucket-mikroslu\u017eba).<br \/>\n iii) Je vytvo\u0159en Pull Request na tuto v\u011btev (Bitbucket-mikroslu\u017eba).<br \/>\n iv) Je odesl\u00e1na zpr\u00e1va o nov\u00e9m Pull Requestu do chat\u016f v\u00fdvoj\u00e1\u0159\u016f (Notify-mikroslu\u017eba pro pr\u00e1ci s upozorn\u011bn\u00edmi).<br \/>\n v) Spou\u0161t\u00ed se sestaven\u00ed, testov\u00e1n\u00ed a nasazen\u00ed \u00fakolu na DEV (Jenkins-mikroslu\u017eba pro pr\u00e1ci s Jenkins).<br \/>\n vi) Pokud v\u0161echny p\u0159edchoz\u00ed body \u00fasp\u011b\u0161n\u011b skon\u010dily, Integro schv\u00e1l\u00ed Pull Request (Bitbucket-mikroslu\u017eba).<\/li>\n<li>Integro \u010dek\u00e1 na schv\u00e1len\u00ed Pull Requestu od p\u0159i\u0159azen\u00fdch recenzent\u016f.<\/li>\n<li>Jakmile jsou z\u00edsk\u00e1na v\u0161echna pot\u0159ebn\u00e1 schv\u00e1len\u00ed (v\u010detn\u011b \u00fasp\u011b\u0161n\u011b proveden\u00fdch automatizovan\u00fdch test\u016f), Integro p\u0159evede \u00fakol do stavu Test on Dev (Jira-mikroslu\u017eba).<\/li>\n<\/ul>\n<p>\n6. Teste\u0159i prov\u00e1d\u011bj\u00ed testov\u00e1n\u00ed \u00fakolu. Pokud nejsou \u017e\u00e1dn\u00e9 probl\u00e9my, p\u0159evedou \u00fakol do stavu Ready For Build.<\/p>\n<p>7. Integro \u201evid\u00ed\u201c, \u017ee \u00fakol je p\u0159ipraven k vyd\u00e1n\u00ed, a spou\u0161t\u00ed jeho nasazen\u00ed v kan\u00e1rkov\u00e9m re\u017eimu (Jenkins-mikroslu\u017eba). P\u0159ipravenost k vyd\u00e1n\u00ed je ur\u010dena sadou pravidel. Nap\u0159\u00edklad \u00fakol je ve spr\u00e1vn\u00e9m stavu, nejsou \u017e\u00e1dn\u00e9 blokace na jin\u00e9 \u00fakoly, v tuto chv\u00edli nejsou aktivn\u00ed nasazen\u00ed t\u00e9to mikroslu\u017eby atd.<\/p>\n<p>8. \u00dakol je p\u0159eveden do stavu Canary (Jira-mikroslu\u017eba).<\/p>\n<p>9. Jenkins spou\u0161t\u00ed nasazen\u00ed \u00fakolu v kan\u00e1rkov\u00e9m re\u017eimu prost\u0159ednictv\u00edm Nomad (obvykle 1-3 instance) a informuje o nasazen\u00ed monitorovac\u00ed slu\u017ebu vyd\u00e1n\u00ed (DeployWatch-mikroslu\u017eba).<\/p>\n<p>10. DeployWatch-mikroslu\u017eba shroma\u017e\u010fuje pozad\u00ed chyb a reaguje na n\u011bj, pokud je to nutn\u00e9. P\u0159i p\u0159ekro\u010den\u00ed pozad\u00ed chyb (norma pozad\u00ed se po\u010d\u00edt\u00e1 automaticky) je provedeno ozn\u00e1men\u00ed v\u00fdvoj\u00e1\u0159\u016fm prost\u0159ednictv\u00edm Notify-mikroslu\u017eby. Pokud v\u00fdvoj\u00e1\u0159 b\u011bhem 5 minut nereaguje (stiskne Revert nebo Stay), spust\u00ed se automatick\u00fd rollback kan\u00e1rkov\u00fdch instanc\u00ed. Pokud nen\u00ed pozad\u00ed p\u0159ekro\u010deno, mus\u00ed v\u00fdvoj\u00e1\u0159 ru\u010dn\u011b spustit nasazen\u00ed \u00fakolu na Production (stisknut\u00edm tla\u010d\u00edtka v UI). Pokud b\u011bhem 60 minut v\u00fdvoj\u00e1\u0159 nespustil nasazen\u00ed na Production, budou kan\u00e1rkov\u00e9 instance tak\u00e9 z d\u016fvodu bezpe\u010dnosti odebr\u00e1ny.<\/p>\n<p>11. Po spu\u0161t\u011bn\u00ed nasazen\u00ed na Production:<\/p>\n<ul>\n<li>\u00dakol je p\u0159eveden do stavu Production (Jira-mikroslu\u017eba).<\/li>\n<li>Jenkins-mikroslu\u017eba spou\u0161t\u00ed proces nasazen\u00ed a informuje o nasazen\u00ed DeployWatch-mikroslu\u017ebu.<\/li>\n<li>DeployWatch-mikroslu\u017eba kontroluje, \u017ee na Production byly aktualizov\u00e1ny v\u0161echny kontejnery (byly p\u0159\u00edpady, kdy se neaktualizovalo v\u0161e).<\/li>\n<li>Prost\u0159ednictv\u00edm Notify-mikroslu\u017eby se ode\u0161le ozn\u00e1men\u00ed o v\u00fdsledc\u00edch nasazen\u00ed na Production.<\/li>\n<\/ul>\n<p>\n12. V\u00fdvoj\u00e1\u0159i budou m\u00edt 30 minut na spu\u0161t\u011bn\u00ed rollbacku \u00fakolu z Production v p\u0159\u00edpad\u011b zji\u0161t\u011bn\u00ed nespr\u00e1vn\u00e9ho chov\u00e1n\u00ed mikroslu\u017eby. Po uplynut\u00ed t\u00e9to doby bude \u00fakol automaticky slou\u010den do masteru (Git-mikroslu\u017eba).<\/p>\n<p>13. Po \u00fasp\u011b\u0161n\u00e9m merge do masteru bude stav \u00fakolu zm\u011bn\u011bn na Closed (Jira-mikroslu\u017eba).<\/p>\n<p>Sch\u00e9ma si nen\u00e1rokuje na \u00faplnou detailnost (ve skute\u010dnosti je krok\u016f je\u0161t\u011b v\u00edce), ale umo\u017e\u0148uje posoudit m\u00edru integrace do proces\u016f. Nepova\u017eujeme toto sch\u00e9ma za ide\u00e1ln\u00ed a zlep\u0161ujeme procesy automatick\u00e9ho doprovodu vyd\u00e1n\u00ed a nasazen\u00ed.<\/p>\n<h2>Co d\u00e1l<\/h2>\n<p>\nM\u00e1me velk\u00e9 pl\u00e1ny na rozvoj automatizace, nap\u0159\u00edklad odm\u00edtnut\u00ed ru\u010dn\u00edch operac\u00ed p\u0159i vyd\u00e1n\u00ed monolitu, zlep\u0161en\u00ed monitorov\u00e1n\u00ed p\u0159i automatick\u00e9m nasazen\u00ed a zlep\u0161en\u00ed interakce s v\u00fdvoj\u00e1\u0159i.<\/p>\n<p>Ale t\u00edmto m\u00edstem zat\u00edm skon\u010d\u00edme. Mnoho t\u00e9mat v p\u0159ehledu automatizace jsme pokryli povrchn\u011b, n\u011bkter\u00e1 jsme v\u016fbec nezm\u00ednili, proto r\u00e1di odpov\u00edme na va\u0161e ot\u00e1zky. T\u011b\u0161\u00edme se na va\u0161e n\u00e1vrhy, co podrobn\u011bji osv\u011btlit, pi\u0161te do koment\u00e1\u0159\u016f.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/cian\/blog\/486056\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430 \u0420\u0418\u0422 2019 \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0426\u0418\u0410\u041d: \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Integro. \u041e\u043d\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0437\u0430\u0434\u0430\u0447, \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0433\u043e\u0432 \u0432 production. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438 \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55870","post","type-post","status-publish","format-standard","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=\"\u041d\u0430 \u0420\u0418\u0422 2019.\" \/>\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\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\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\u041e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435: \u043a\u0430\u043a \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0426\u0418\u0410\u041d | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430 \u0420\u0418\u0422 2019.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-29T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:04:02+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\udd47Od skript\u016f k vlastn\u00ed platform\u011b: jak jsme automatizovali v\u00fdvoj v CI\u00c1N | ProHoster","description":"Na RIT 2019.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","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\u041e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435: \u043a\u0430\u043a \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0426\u0418\u0410\u041d | ProHoster","og:description":"\u041d\u0430 \u0420\u0418\u0422 2019.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-29T21:00:00+00:00","article:modified_time":"2020-02-18T11:04:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55870","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:35:40","updated":"2022-09-30 17:42:13","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\/55870","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=55870"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/55870\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=55870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=55870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=55870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}