{"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\/sk\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","title":{"rendered":"Od skriptov k vlastnej platforme: ako sme automatizovali v\u00fdvoj v CIAN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Od skriptov k vlastnej platforme: ako sme 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 Alexander Korotkov predstavil <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=0wvUyjexoIg\">predn\u00e1\u0161ka<\/a><\/noindex> o automatiz\u00e1cii v\u00fdvoja v CIAN: na zjednodu\u0161enie \u017eivota a pr\u00e1ce pou\u017e\u00edvame vlastn\u00fa platformu Integro. T\u00e1to platforma sleduje \u017eivotn\u00fd cyklus \u00faloh, zbavuje v\u00fdvoj\u00e1rov rutinn\u00fdch oper\u00e1ci\u00ed a v\u00fdrazne zni\u017euje po\u010det ch\u00fdb v produkcii. V tomto pr\u00edspevku dopln\u00edme Alexanderovu predn\u00e1\u0161ku a povieme, ako sme pre\u0161li od jednoduch\u00fdch skriptov k integr\u00e1cii open source produktov cez vlastn\u00fa platformu a \u010domu sa venuje n\u00e1\u0161 samostatn\u00fd t\u00edm automatiz\u00e1cie.<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, nie\u010do tak\u00e9 nepozn\u00e1m\u201c<\/b><br \/>\nMajster Shifu z m\/f \u201eKung-fu Panda\u201c<\/i><\/p>\n<p>Automatiz\u00e1cia v CIAN za\u010dala 14 rokov po zalo\u017een\u00ed spolo\u010dnosti. Vtedy bola v v\u00fdvojovom t\u00edme 35 \u010dlenov. \u0164a\u017eko tomu uveri\u0165, v\u0161ak? Samozrejme, nejak\u00e1 forma automatiz\u00e1cie u\u017e existovala, ale samostatn\u00e1 oblas\u0165 nepretr\u017eitej integr\u00e1cie a dod\u00e1vky k\u00f3du sa za\u010dala formova\u0165 pr\u00e1ve v roku 2015.\u00a0<\/p>\n<p>Vtedy sme mali obrovsk\u00fd monolit z Pythonu, C# a PHP, nasaden\u00fd na Linux\/Windows serveroch. Na nasadenie tohto mon\u0161tra sme mali sadu skriptov, ktor\u00e9 sme sp\u00fa\u0161\u0165ali manu\u00e1lne. Bolo tu tie\u017e zostavovanie monolitu, sp\u00f4sobuj\u00face boles\u0165 a utrpenie kv\u00f4li konfliktom pri zl\u00fa\u010den\u00ed vetiev, oprav\u00e1m defektov a op\u00e4tovn\u00e9mu zostavovaniu \u201es inou sadou \u00faloh v zostave\u201c. Zjednodu\u0161ene proces vyzeral takto:<\/p>\n<p><img decoding=\"async\" alt=\"Od skriptov k vlastnej platforme: ako sme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/03c4dd97e2ba0073bab1c33f6003a9ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTo n\u00e1m nevyhovovalo a chceli sme vybudova\u0165 opakovate\u013en\u00fd, automatizovan\u00fd a kontrolovan\u00fd proces zostavovania a nasadenia. Na to sme potrebovali syst\u00e9m CI\/CD a vyberali sme medzi bezplatnou verziou Teamcity a bezplatn\u00fdm Jenkins, preto\u017ee sme s nimi pracovali a obidve sp\u013a\u0148ali na\u0161e po\u017eiadavky. Vybrali sme Teamcity ako modernej\u0161\u00ed produkt. Vtedy sme e\u0161te nepou\u017e\u00edvali mikroslu\u017ebov\u00fa architekt\u00faru a nepl\u00e1novali sme mno\u017estvo \u00faloh a projektov.<\/p>\n<h2>Dost\u00e1vame sa k my\u0161lienke o vlastnom syst\u00e9me<\/h2>\n<p>\nImplement\u00e1cia Teamcity odstr\u00e1nila len \u010das\u0165 manu\u00e1lnej pr\u00e1ce: zostalo e\u0161te vytv\u00e1ranie Pull Requestov, presun \u00faloh pod\u013ea stavov v Jira, v\u00fdber \u00faloh na uvo\u013enenie. S t\u00fdmto syst\u00e9mom Teamcity u\u017e nespolupracoval. Bolo potrebn\u00e9 zvoli\u0165 cestu \u010fal\u0161ej automatiz\u00e1cie. Zv\u00e1\u017eili sme mo\u017enosti pr\u00e1ce so skriptmi v Teamcity alebo prechod na extern\u00e9 automatiza\u010dn\u00e9 syst\u00e9my. Nakoniec sme sa rozhodli, \u017ee potrebujeme maxim\u00e1lnu flexibilitu, ktor\u00fa poskytuje len vlastn\u00e9 rie\u0161enie. Tak vznikla prv\u00e1 verzia vn\u00fatorn\u00e9ho automatiza\u010dn\u00e9ho syst\u00e9mu s n\u00e1zvom Integro.<\/p>\n<p>Teamcity sa zaober\u00e1 automatiz\u00e1ciou na \u00farovni sp\u00fa\u0161\u0165ania procesov kompil\u00e1cie a nasadenia, zatia\u013e \u010do Integro sa zameralo na vy\u0161\u0161iu \u00farove\u0148 automatiz\u00e1cie vyvojov\u00fdch procesov. Bolo potrebn\u00e9 zl\u00fa\u010di\u0165 pr\u00e1cu s \u00falohami v Jira s spracovan\u00edm s\u00favisiaceho zdrojov\u00e9ho k\u00f3du v Bitbucket. V tejto f\u00e1ze za\u010dali v Integro vznikn\u00fa\u0165 vlastn\u00e9 workflow pre pr\u00e1cu s r\u00f4znymi typmi \u00faloh.\u00a0<\/p>\n<p>V d\u00f4sledku zvy\u0161ovania automatiz\u00e1cie v obchodn\u00fdch procesoch vzr\u00e1stol po\u010det projektov a runov v Teamcity. Tak pri\u0161la nov\u00e1 probl\u00e9m: jedno bezplatn\u00e9 in\u0161tan\u010dn\u00e9 Teamcity u\u017e nesta\u010dilo (3 agenti a 100 projektov), pridali sme \u010fal\u0161ie in\u0161tancie (\u010fal\u0161ie 3 agenti a 100 projektov), nesk\u00f4r \u010fal\u0161ie. Nakoniec sme dostali syst\u00e9m z nieko\u013ek\u00fdch klastrov, ktor\u00fdm bolo \u0165a\u017ek\u00e9 spravova\u0165:<\/p>\n<p><img decoding=\"async\" alt=\"Od skriptov k vlastnej platforme: ako sme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/d95565e01e70e31f6b139dfb9b9caf95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKe\u010f nastala ot\u00e1zka o 4. in\u0161tancii, pochopili sme, \u017ee takto u\u017e nem\u00f4\u017eeme \u017ei\u0165, preto\u017ee s\u00fahrnn\u00e9 n\u00e1klady na \u00fadr\u017ebu 4 in\u0161tanci\u00ed u\u017e neboli prijate\u013en\u00e9. Vznikla ot\u00e1zka n\u00e1kupu platen\u00e9ho Teamcity alebo vo\u013eby v prospech bezplatnej Jenkins. Urobili sme v\u00fdpo\u010dty pre in\u0161tancie a pl\u00e1ny na automatiz\u00e1ciu a rozhodli sme sa, \u017ee prejdeme na Jenkins. Po p\u00e1r t\u00fd\u017ed\u0148och sme pre\u0161li na Jenkins a zbavili sa \u010dasti bolesti hlavy spojen\u00e9 so spr\u00e1vou nieko\u013ek\u00fdch in\u0161tanci\u00ed Teamcity. Tak sme sa mohli s\u00fastredi\u0165 na v\u00fdvoj Integro a \u00fapravy Jenkins pre na\u0161e potreby.<\/p>\n<p>S rastom z\u00e1kladnej automatiz\u00e1cie (vo forme automatick\u00e9ho vytv\u00e1rania Pull Request-ov, zberu a publikovania Code coverage a in\u00fdch kontrol) sa objavil trval\u00fd z\u00e1ujem maxim\u00e1lne sa vzda\u0165 ru\u010dn\u00fdch release-ov a zveri\u0165 t\u00fato pr\u00e1cu robotom. Okrem toho sa vo vn\u00fatri spolo\u010dnosti za\u010dalo s presunom na mikroservisy, ktor\u00e9 si vy\u017eadovali \u010dast\u00e9 release-y, pri\u010dom ka\u017ed\u00fd samostatne. Tak sme postupne pri\u0161li k automatick\u00fdm release-om na\u0161ich mikroservisov (monolit zatia\u013e vyd\u00e1vame ru\u010dne kv\u00f4li zlo\u017eitosti procesu). Ale, ako to u\u017e b\u00fdva, objavila sa nov\u00e1 zlo\u017eitost.\u00a0<\/p>\n<h2>Automatizujeme testovanie<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Od skriptov k vlastnej platforme: ako sme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/9518ee0956922c6eb615bdef068ac525.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u010faka automatiz\u00e1cii release-ov sa procesy v\u00fdvoja ur\u00fdchlili, pri\u010dom \u010diasto\u010dne na \u00fakor presko\u010denia niektor\u00fdch f\u00e1z testovania. To viedlo k do\u010dasnej strate kvality. Znie to ban\u00e1lne, ale spolu s ur\u00fdchlen\u00edm release-ov bolo potrebn\u00e9 zmeni\u0165 aj metodol\u00f3giu v\u00fdvoja produktu. Museli sme uva\u017eova\u0165 o automatiz\u00e1cii testovania, prerozde\u013eovan\u00ed osobnej zodpovednosti (tu ide o 'prijatie my\u0161lienky v hlave', a nie o finan\u010dn\u00e9 pokuty) v\u00fdvoj\u00e1ra za vydan\u00fd k\u00f3d a chyby v \u0148om, ako aj o rozhodnut\u00ed o vydan\u00ed\/ne vydan\u00ed \u00falohy prostredn\u00edctvom automatick\u00e9ho nasadenia.\u00a0<\/p>\n<p>Rie\u0161en\u00edm probl\u00e9mov s kvalitou sme dospeli k dvom d\u00f4le\u017eit\u00fdm rozhodnutiam: za\u010dali sme vykon\u00e1va\u0165 kan\u00e1rske testovanie a zaviedli sme automatick\u00e9 monitorovanie pozadia ch\u00fdb s automatick\u00fdm reagovan\u00edm na jeho presiahnutie. Prv\u00e9 rozhodnutie umo\u017enilo identifikova\u0165 zjavn\u00e9 chyby predt\u00fdm, ne\u017e sa k\u00f3d dostal do produkcie, druh\u00e9 zn\u00ed\u017eilo \u010das reakcie na probl\u00e9my v produkcii. Chyby sa samozrejme st\u00e1vaj\u00fa, ale v\u00e4\u010d\u0161inu \u010dasu a energie tr\u00e1vime nie na opravovanie, ale na minimaliz\u00e1ciu.\u00a0<\/p>\n<h2>T\u00edm automatiz\u00e1cie<\/h2>\n<p>\nMoment\u00e1lne m\u00e1me t\u00edm 130 v\u00fdvoj\u00e1rov a pokra\u010dujeme <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/article\/469965\/\">r\u00e1s\u0165<\/a><\/noindex>. T\u00edm pre kontinu\u00e1lnu integr\u00e1ciu a dod\u00e1vku k\u00f3du (\u010falej \u2014 t\u00edm Deploy and Integration alebo DI) pozost\u00e1va zo 7 \u013eud\u00ed a pracuje v 2 smeroch: v\u00fdvoj platformy automatiz\u00e1cie Integro a DevOps.\u00a0<\/p>\n<p>DevOps zodpoved\u00e1 za Dev\/Beta prostredia webu CIAN, prostredie Integro, pom\u00e1ha v\u00fdvoj\u00e1rom pri rie\u0161en\u00ed probl\u00e9mov a vypracov\u00e1va nov\u00e9 pr\u00edstupy k \u0161k\u00e1lovaniu prostred\u00ed. Oblas\u0165 v\u00fdvoja Integro sa zaober\u00e1 nielen samotn\u00fdm Integro, ale aj pr\u00edbuzn\u00fdmi slu\u017ebami, ako s\u00fa pluginy pre Jenkins, Jira, Confluence, a tie\u017e vyv\u00edja pomocn\u00e9 n\u00e1stroje a aplik\u00e1cie pre t\u00fdmy v\u00fdvoj\u00e1rov.\u00a0<\/p>\n<p>T\u00edm DI spolupracuje s t\u00edmom Platformy, ktor\u00fd sa zaober\u00e1 v\u00fdvojom architekt\u00fary, kni\u017en\u00edc a pr\u00edstupov k v\u00fdvoju v r\u00e1mci spolo\u010dnosti. Okrem toho m\u00f4\u017ee ka\u017ed\u00fd v\u00fdvoj\u00e1r v CIAN prispie\u0165 k automatiz\u00e1cii, napr\u00edklad vytvoren\u00edm mikroautomatiz\u00e1cie pod\u013ea potrieb t\u00edmu alebo zdie\u013ean\u00edm skvelej my\u0161lienky, ako zlep\u0161i\u0165 automatiz\u00e1ciu.<\/p>\n<h2>Viacvrstvov\u00e1 \u0161trukt\u00fara automatiz\u00e1cie v CIAN<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Od skriptov k vlastnej platforme: ako sme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/22dcd2d0cc283d53bdaac081885657f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV\u0161etky syst\u00e9my zapojen\u00e9 do automatiz\u00e1cie m\u00f4\u017eeme rozdeli\u0165 na nieko\u013eko vrstiev:<\/p>\n<ol>\n<li>Extern\u00e9 syst\u00e9my (Jira, Bitbucket a pod.). S nimi pracuj\u00fa v\u00fdvoj\u00e1rske t\u00edmy.\n<\/li>\n<li>Platforma Integro. V\u00fdvoj\u00e1ri s \u0148ou v\u00e4\u010d\u0161inou nepracuj\u00fa priamo, ale je to pr\u00e1ve ona, ktor\u00e1 podporuje funkciu celej automatiz\u00e1cie.\n<\/li>\n<li>Slu\u017eby doru\u010dovania, orchestr\u00e1cie a zistovania (napr\u00edklad Jenkins, Consul, Nomad). S ich pomocou nasadzujeme k\u00f3d na serveroch a zabezpe\u010dujeme vz\u00e1jomn\u00fa interakciu slu\u017eieb.\n<\/li>\n<li>Fyzick\u00e1 \u00farove\u0148 (servery, OS, pr\u00edbuzn\u00fd softv\u00e9r). Na tejto \u00farovni be\u017e\u00ed n\u00e1\u0161 k\u00f3d. M\u00f4\u017ee to by\u0165 fyzick\u00fd server alebo virtu\u00e1lny (LXC, KVM, Docker).\n<\/li>\n<\/ol>\n<p>\nNa z\u00e1klade tejto koncepcie del\u00edme z\u00f3ny zodpovednosti v r\u00e1mci t\u00edmu DI. Dve prv\u00e9 \u00farovne spadaj\u00fa pod zodpovednos\u0165 oblasti v\u00fdvoja Integro, zatia\u013e \u010do dve posledn\u00e9 \u00farovne spadaj\u00fa pod zodpovednos\u0165 DevOps. Tak\u00e9to rozdelenie umo\u017e\u0148uje s\u00fastredi\u0165 sa na \u00falohy a nebr\u00e1ni interakcii, preto\u017ee sme bl\u00edzko seba a neust\u00e1le si vymie\u0148ame znalosti a sk\u00fasenosti.<\/p>\n<h2>Integro<\/h2>\n<p>\nZamerajme sa na Integro a za\u010dneme technologick\u00fdm z\u00e1sobn\u00edkom:<\/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 zost\u00e1va 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 sa z\u00e1sady mikroslu\u017eieb, aj ke\u010f m\u00e1me aj dedi\u010dstvo v podobe monolitu prvej verzie Integro. Ka\u017ed\u00e1 mikroslu\u017eba be\u017e\u00ed vo svojej docker-kontejneri, slu\u017eby komunikuj\u00fa navz\u00e1jom cez HTTP po\u017eiadavky a RabbitMQ spr\u00e1vy. Mikroslu\u017eby sa n\u00e1jdu pomocou Consul a vykon\u00e1vaj\u00fa k nemu po\u017eiadavku, pri\u010dom prech\u00e1dzaj\u00fa autoriz\u00e1ciou cez SSO (Keycloak, OAuth 2\/OpenID Connect).<\/p>\n<p><img decoding=\"async\" alt=\"Od skriptov k vlastnej platforme: ako sme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/e7630c0bd62a40f397de1bf1c1097926.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAko re\u00e1lny pr\u00edklad sa pozrime na interakciu s Jenkins, ktor\u00e1 pozost\u00e1va z nasleduj\u00facich krokov:<\/p>\n<ol>\n<li>Mikroslu\u017eba spr\u00e1vy workflow (\u010falej Flow-mikroslu\u017eba) chce spusti\u0165 zostavenie v Jenkins. Na to n\u00e1jde cez Consul IP:PORT mikroslu\u017eby integr\u00e1cie s Jenkins (\u010falej Jenkins-mikroslu\u017eba) a odo\u0161le do nej asynchr\u00f3nny po\u017eiadavok na spustenie zostavenia v Jenkins.\n<\/li>\n<li>Jenkins-mikroslu\u017eba po prijat\u00ed po\u017eiadavky formuluje a vracia v odpovedi Job ID, pod\u013ea ktor\u00e9ho bude mo\u017en\u00e9 nesk\u00f4r identifikova\u0165 v\u00fdsledok pr\u00e1ce. V spolupr\u00e1ci s t\u00fdm sp\u00fa\u0161\u0165a zostavenie v Jenkins cez volanie REST API.\n<\/li>\n<li>Jenkins vykon\u00e1 zostavenie a po jeho skon\u010den\u00ed odo\u0161le webhook s v\u00fdsledkami vykonania do Jenkins-mikroslu\u017eby.\n<\/li>\n<li>Jenkins-mikroslu\u017eba, ktor\u00e1 prijala webhook, formuluje spr\u00e1vu o skon\u010den\u00ed spracovania po\u017eiadavky a priklad\u00e1 k nej v\u00fdsledky vykonania. Sformulovan\u00e1 spr\u00e1va sa posiela do fronty RabbitMQ.\n<\/li>\n<li>Cez RabbitMQ zverejnen\u00e1 spr\u00e1va sa dostane k Flow-mikroslu\u017ebe, ktor\u00e1 sa dozvie o v\u00fdsledku spracovania svojej \u00falohy, porovnan\u00edm Job ID z po\u017eiadavky a prijatej spr\u00e1vy.\n<\/li>\n<\/ol>\n<p>\nMoment\u00e1lne m\u00e1me okolo 30 mikroslu\u017eieb, ktor\u00e9 m\u00f4\u017eeme rozdeli\u0165 do nieko\u013ek\u00fdch skup\u00edn:<\/p>\n<ol>\n<li>Spr\u00e1va konfigur\u00e1ci\u00ed.\n<\/li>\n<li>Informovanie a interakcia s pou\u017e\u00edvate\u013emi (messengery, e-mail).\n<\/li>\n<li>Pr\u00e1ca so zdrojov\u00fdm k\u00f3dom.\n<\/li>\n<li>Integr\u00e1cia s n\u00e1strojmi na nasadzovanie (jenkins, nomad, consul a pod.).\n<\/li>\n<li>Monitorovanie (verzi\u00ed, ch\u00fdb a pod.).\n<\/li>\n<li>Webov\u00e9 n\u00e1stroje (UI na spr\u00e1vu testovac\u00edch prostred\u00ed, zber \u0161tatist\u00edk a pod.).\n<\/li>\n<li>Integr\u00e1cia s task trackermi a podobn\u00fdmi syst\u00e9mami.\n<\/li>\n<li>Spr\u00e1va workflow pre r\u00f4zne \u00falohy.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Workflow \u00falohy<\/h2>\n<p>\nIntegro automatizuje akcie s\u00favisiace so \u017eivotn\u00fdm cyklom \u00falohy. Zjednodu\u0161ene pod \u017eivotn\u00fdm cyklom \u00falohy rozumieme workflow \u00falohy v Jira. V na\u0161ich v\u00fdvojov\u00fdch procesoch existuje nieko\u013eko vari\u00e1ci\u00ed workflow v z\u00e1vislosti od projektu, typu \u00falohy a mo\u017enost\u00ed vybran\u00fdch v konkr\u00e9tnej \u00falohe.\u00a0<\/p>\n<p>Pozrime sa na workflow, ktor\u00fd pou\u017e\u00edvame naj\u010dastej\u0161ie:<\/p>\n<p><img decoding=\"async\" alt=\"Od skriptov k vlastnej platforme: ako sme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/62555be6bab024dd30f3cf70d4fe3cba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNa sch\u00e9me ozuben\u00e9 kolo nazna\u010duje, \u017ee prechod je iniciovan\u00fd automaticky prostredn\u00edctvom Integra, zatia\u013e \u010do postava \u010dloveka nazna\u010duje, \u017ee prechod je spusten\u00fd manu\u00e1lne osobou. Pozrime sa na nieko\u013eko ciest, ktor\u00fdmi m\u00f4\u017ee \u00faloha prech\u00e1dza\u0165 v tomto pracovnom postupe.<\/p>\n<p>\u00daplne manu\u00e1lne testovanie na DEV+BETA bez kan\u00e1rikov\u00fdch testov (zvy\u010dajne tak uv\u00e1dzame monolit):<\/p>\n<p><img decoding=\"async\" alt=\"Od skriptov k vlastnej platforme: ako sme automatizovali v\u00fdvoj v CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/775528862e14817dff5f69db6de654dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nM\u00f4\u017eu existova\u0165 aj in\u00e9 kombin\u00e1cie prechodu. Niekedy je mo\u017en\u00e9 zvoli\u0165 cestu, ktorou \u00faloha p\u00f4jde, cez mo\u017enosti v Jira.<\/p>\n<h2>Pohyb \u00falohy<\/h2>\n<p>\nPozrime sa na hlavn\u00e9 kroky, ktor\u00e9 sa vykon\u00e1vaj\u00fa pri pohybe \u00falohy v pracovnom postupe \u201eTestovanie na DEV + kan\u00e1rikov\u00e9 testy\u201c:<\/p>\n<p>1. V\u00fdvoj\u00e1r alebo PM vytvor\u00ed \u00falohu.<\/p>\n<p>2. V\u00fdvoj\u00e1r preber\u00e1 \u00falohu do pr\u00e1ce. Po dokon\u010den\u00ed ju prelo\u017e\u00ed do stavu IN REVIEW.<\/p>\n<p>3. Jira odo\u0161le Webhook smerom k Jira-mikroslu\u017ebe (zodpoved\u00e1 za integr\u00e1ciu s Jira).<\/p>\n<p>4. Jira-mikroslu\u017eba odo\u0161le po\u017eiadavku na Flow-slu\u017ebu (zodpoved\u00e1 za vn\u00fatorn\u00e9 pracovn\u00e9 postupy, v ktor\u00fdch sa vykon\u00e1va pr\u00e1ca) na spustenie pracovn\u00e9ho postupu.<\/p>\n<p>5. V r\u00e1mci Flow-slu\u017eby:<\/p>\n<ul>\n<li>S\u00fa ur\u010den\u00ed recenzenti pre \u00falohu (Users-mikroslu\u017eba, ktor\u00e1 vie v\u0161etko o pou\u017e\u00edvate\u013eoch + Jira-mikroslu\u017eba).<\/li>\n<li>Cez Source-mikroslu\u017ebu (vie o repozit\u00e1roch a vetv\u00e1ch, ale nepracuje so samotn\u00fdm k\u00f3dom) sa vykon\u00e1va vyh\u013ead\u00e1vanie repozit\u00e1rov, v ktor\u00fdch je vetva na\u0161ej \u00falohy (pre zjednodu\u0161enie vyh\u013ead\u00e1vania sa n\u00e1zov vetvy zhoduje s \u010d\u00edslom \u00falohy v Jira). Naj\u010dastej\u0161ie m\u00e1 \u00faloha iba jednu vetvu v jednom repozit\u00e1ri, \u010do zjednodu\u0161uje spr\u00e1vu fronty na nasadenie a zni\u017euje prepojenos\u0165 medzi repozit\u00e1rmi.<\/li>\n<li>Pre ka\u017ed\u00fa n\u00e1jden\u00fa vetvu sa vykon\u00e1va nasleduj\u00faca sekvencia krokov:\n<p> i) Zl\u00fa\u010denie s master-vetvou (Git-mikroslu\u017eba pre pr\u00e1cu s k\u00f3dom).<br \/>\n ii) Vetva je zablokovan\u00e1 pred zmenami v\u00fdvoj\u00e1rom (Bitbucket-mikroslu\u017eba).<br \/>\n iii) Vytv\u00e1ra sa Pull Request na t\u00fato vetvu (Bitbucket-mikroslu\u017eba).<br \/>\n iv) Odesiela sa spr\u00e1va o novom Pull Requeste do chatov v\u00fdvoj\u00e1rov (Notify-mikroslu\u017eba pre upozornenia).<br \/>\n v) Sp\u00fa\u0161\u0165a sa zostavenie, testovanie a nasadenie \u00falohy na DEV (Jenkins-mikroslu\u017eba pre pr\u00e1cu s Jenkins).<br \/>\n vi) Ak v\u0161etky predch\u00e1dzaj\u00face body skon\u010dili \u00faspe\u0161ne, Integro vlo\u017e\u00ed svoje schv\u00e1lenie do Pull Requestu (Bitbucket-mikroslu\u017eba).<\/li>\n<li>Integro \u010dak\u00e1 na schv\u00e1lenie v Pull Requeste od ur\u010den\u00fdch recenzentov.<\/li>\n<li>Akon\u00e1hle s\u00fa v\u0161etky potrebn\u00e9 schv\u00e1lenia (vr\u00e1tane pozit\u00edvne prebehnut\u00fdch automatizovan\u00fdch testov) z\u00edskan\u00e9, Integro prev\u00e1dza \u00falohu do stavu Test on Dev (Jira-mikroslu\u017eba).<\/li>\n<\/ul>\n<p>\n6. Testeri vykon\u00e1vaj\u00fa testovanie \u00falohy. Ak nie s\u00fa \u017eiadne probl\u00e9my, \u00faloha sa prevedie do stavu Ready For Build.<\/p>\n<p>7. Integro \"vid\u00ed\", \u017ee \u00faloha je pripraven\u00e1 na vydanie, a sp\u00fa\u0161\u0165a jej nasadenie v kan\u00e1rskej verzii (Jenkins mikroslu\u017eba). Pripravenos\u0165 na vydanie sa ur\u010duje s\u00faborom pravidiel. Napr\u00edklad \u00faloha je v spr\u00e1vnom stave, nie s\u00fa \u017eiadne blok\u00e1cie na in\u00e9 \u00falohy, aktu\u00e1lne nie s\u00fa akt\u00edvne nasadenia tejto mikroslu\u017eby at\u010f.<\/p>\n<p>8. \u00daloha sa prevedie do stavu Canary (Jira mikroslu\u017eba).<\/p>\n<p>9. Jenkins sp\u00fa\u0161\u0165a nasadenie \u00falohy v kan\u00e1rskej verzii cez Nomad (zvy\u010dajne 1-3 in\u0161tancie) a informuje o nasaden\u00ed slu\u017ebu monitorovania vydan\u00ed (DeployWatch mikroslu\u017eba).<\/p>\n<p>10. DeployWatch mikroslu\u017eba zhroma\u017e\u010fuje pozadie ch\u00fdb a reaguje na\u0148, ak je to potrebn\u00e9. Pri prekro\u010den\u00ed pozadia ch\u00fdb (norma pozadia sa vypo\u010d\u00edtava automaticky) s\u00fa v\u00fdvoj\u00e1ri informovan\u00ed cez Notify mikroslu\u017ebu. Ak v\u00fdvoj\u00e1r nereagoval do 5 min\u00fat (stla\u010den\u00edm Revert alebo Stay), automaticky sa spust\u00ed sp\u00e4tn\u00fd chod kan\u00e1rskych in\u0161tanci\u00ed. Ak pozadie nie je prekro\u010den\u00e9, v\u00fdvoj\u00e1r mus\u00ed manu\u00e1lne spusti\u0165 nasadenie \u00falohy na Production (stla\u010den\u00edm tla\u010didla v UI). Ak v\u00fdvoj\u00e1r nespustil nasadenie na Production do 60 min\u00fat, kan\u00e1rske in\u0161tancie bud\u00fa z bezpe\u010dnostn\u00fdch d\u00f4vodov tie\u017e zru\u0161en\u00e9.<\/p>\n<p>11. Po spusten\u00ed nasadenia na Production:<\/p>\n<ul>\n<li>\u00daloha sa prevedie do stavu Production (Jira mikroslu\u017eba).<\/li>\n<li>Jenkins mikroslu\u017eba sp\u00fa\u0161\u0165a proces nasadenia a informuje o nasaden\u00ed DeployWatch mikroslu\u017ebu.<\/li>\n<li>DeployWatch mikroslu\u017eba kontroluje, \u010di sa na Production aktualizovali v\u0161etky kontajnery (vyskytli sa pr\u00edpady, ke\u010f sa neaktualizovalo v\u0161etko).<\/li>\n<li>Cez Notify mikroslu\u017ebu sa posiela ozn\u00e1menie o v\u00fdsledkoch nasadenia na Production.<\/li>\n<\/ul>\n<p>\n12. V\u00fdvoj\u00e1ri bud\u00fa ma\u0165 30 min\u00fat na spustenie sp\u00e4tn\u00e9ho chodu \u00falohy z Production v pr\u00edpade zistenia nespr\u00e1vneho spr\u00e1vania mikroslu\u017eby. Po uplynut\u00ed tejto doby bude \u00faloha automaticky zl\u00fa\u010den\u00e1 do master (Git mikroslu\u017eba).<\/p>\n<p>13. Po \u00faspe\u0161nom zl\u00fa\u010den\u00ed do master bude stav \u00falohy zmenen\u00fd na Closed (Jira mikroslu\u017eba).<\/p>\n<p>Sch\u00e9ma si nen\u00e1rokuje \u00fapln\u00fa detailnos\u0165 (v skuto\u010dnosti je krokov e\u0161te viac), ale umo\u017e\u0148uje oceni\u0165 \u00farove\u0148 integr\u00e1cie do procesov. Nepova\u017eujeme t\u00fato sch\u00e9mu za ide\u00e1lnu a neust\u00e1le zlep\u0161ujeme procesy automatick\u00e9ho sprievodu vydan\u00ed a nasadenia.<\/p>\n<h2>\u010co \u010falej<\/h2>\n<p>\nM\u00e1me ve\u013ek\u00e9 pl\u00e1ny na rozvoj automatiz\u00e1cie, ako napr\u00edklad odstr\u00e1nenie ru\u010dn\u00fdch oper\u00e1ci\u00ed pri vydaniach monolitu, zlep\u0161enie monitorovania pri automatickom nasadzovan\u00ed a vylep\u0161enie spolupr\u00e1ce s v\u00fdvoj\u00e1rmi.<\/p>\n<p>Ale tu zatia\u013e zastav\u00edme. Mnoh\u00e9 t\u00e9my v preh\u013eade automatiz\u00e1cie sme pokryli povrchne, niektor\u00e9 sme v\u00f4bec nespomenuli, preto sa radi odpovieme na ot\u00e1zky. \u010cak\u00e1me na va\u0161e n\u00e1vrhy, \u010do podrobne osvetli\u0165, p\u00ed\u0161te do koment\u00e1rov.<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.4 - 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\/sk\/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.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\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\/sk\/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 skriptov k vlastnej platforme: ako sme automatizovali v\u00fdvoj v CIAN | ProHoster","description":"Na RIT 2019.","canonical_url":"https:\/\/prohoster.info\/sk\/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":"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\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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/55870","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=55870"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/55870\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=55870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=55870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=55870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}