{"id":93885,"date":"2020-09-10T19:42:23","date_gmt":"2020-09-10T17:42:23","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov"},"modified":"2020-09-10T19:42:23","modified_gmt":"2020-09-10T17:42:23","slug":"continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","title":{"rendered":"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/ed8a32ae63b8dccfc8b4893ab27f1527.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Porozpr\u00e1vajme sa, pre\u010do s\u00fa n\u00e1stroje CI a CI \u00faplne odli\u0161n\u00e9 pojmy.<\/p>\n<p><\/p>\n<p>Ak\u00fa boles\u0165 m\u00e1 CI vyrie\u0161i\u0165, odkia\u013e vznikla my\u0161lienka, ak\u00e9 s\u00fa najnov\u0161ie d\u00f4kazy, \u017ee to funguje, ako zisti\u0165, \u010di m\u00e1te naozaj prax a nie len nain\u0161talovan\u00fd Jenkins.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>My\u0161lienka prerozpr\u00e1va\u0165 prezent\u00e1ciu o Continuous Integration pri\u0161la pred rokom, ke\u010f som chodil na pohovory a h\u013eadal pr\u00e1cu. Hovoril som s 10-15 spolo\u010dnos\u0165ami, z ktor\u00fdch len jedna dok\u00e1zala rozumne odpoveda\u0165, \u010do je CI, a vysvetli\u0165, ako pochopili, \u017ee to nemaj\u00fa. Ostatn\u00ed len hovorili nezrozumite\u013en\u00e9 hl\u00faposti o Jenkins \ud83d\ude42 No tak, m\u00e1me Jenkins, rob\u00ed zostavy, znamen\u00e1 to CI! V prezent\u00e1cii sa pok\u00fasim vysvetli\u0165, \u010do to naozaj je Continuous Integration a pre\u010do Jenkins a podobn\u00e9 n\u00e1stroje s t\u00fdm maj\u00fa ve\u013emi mal\u00fa s\u00favislos\u0165.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/a57813a652c0d788e5a927dc8a7130ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A \u010do v\u00e1m zvy\u010dajne napadne, ke\u010f po\u010dujete slovo CI? V\u00e4\u010d\u0161ine \u013eud\u00ed sa vybav\u00ed Jenkins, GitLab CI, Travis a podobne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c9799c11ba7bb7bbdb2048c2f314b22a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aj keby sme to vyh\u013eadali na Googli, vygeneruj\u00fa sa n\u00e1m tieto n\u00e1stroje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/028ef088b28b73e7905b1666d9d53d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak sa op\u00fdtate zn\u00e1mych, hne\u010f po vymenovan\u00ed n\u00e1strojov v\u00e1m povedia, \u017ee CI je, ke\u010f sa v Pull Request pri commite vykon\u00e1va zostava a testovania.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/f37ba8f985c10900f669540e063c5e43.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Continuous Integration nie je o n\u00e1strojoch, nie je to o zostav\u00e1ch s testami vo vetve! Continuous Integration je prax ve\u013emi \u010dast\u00e9ho integrovania nov\u00e9ho k\u00f3du a na jej uplatnenie nie je v\u00f4bec potrebn\u00e9 budova\u0165 Jenkinsy, GitLaby a podobne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c3a12b4a875050550b42714607e787c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Predt\u00fdm, ne\u017e sa pozrieme na to, ako vyzer\u00e1 plnohodnotn\u00e9 CI, sa najprv ponor\u00edme do kontextu \u013eud\u00ed, ktor\u00ed to vymysleli, a poc\u00edtime t\u00fa boles\u0165, ktorej sa sna\u017eili zbavi\u0165.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/2ab9c0f4dba2887fed5744c8b021b424.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A rie\u0161ili boles\u0165 spolupr\u00e1ce v t\u00edme!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/11a5f3b1075f8b8d0f169fe07adf6c91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pozrime sa na pr\u00edklady, s ak\u00fdmi \u0165a\u017ekos\u0165ami sa stret\u00e1vaj\u00fa v\u00fdvoj\u00e1ri pri t\u00edmovom v\u00fdvoji. M\u00e1me projekt, master vetvu v git a dvoch v\u00fdvoj\u00e1rov.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/8138a52376e87239ff5f7b0af5cd8fee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A tak za\u010dali pracova\u0165 ako v\u0161etci, ktor\u00ed na to u\u017e d\u00e1vno zvykn\u00fa. Vzali si \u00falohu v Jire, zalo\u017eili feature branch a p\u00ed\u0161u k\u00f3d.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/54720c40d9bbd9631b411a2a26c4083f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jeden skon\u010dil funkciu sk\u00f4r a zl\u00fa\u010dil sa s masterom.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/4593dc3cf33a44bf3a4d8166be9bc5da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Druh\u00e9mu to trvalo dlh\u0161ie, zl\u00fa\u010dil sa nesk\u00f4r a dostal konflikt. Teraz, namiesto toho, aby p\u00edsal potrebn\u00e9 funkcie pre biznis, v\u00fdvoj\u00e1r tr\u00e1vi svoj \u010das a \u00fasilie rie\u0161en\u00edm konfliktov.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c947601fb1dd3b3dd64bac455dc6691a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010c\u00edm zlo\u017eitej\u0161ie je integrova\u0165 svoju funkciu do hlavn\u00e9ho repozit\u00e1ra, t\u00fdm viac \u010dasu na to str\u00e1vime. A toto je e\u0161te pomerne jednoduch\u00fd pr\u00edklad. Tento pr\u00edklad ukazuje situ\u00e1ciu, kde s\u00fa iba dvaja v\u00fdvoj\u00e1ri. Predstavte si, \u017ee je ich 10, 15 alebo 100, ktor\u00ed p\u00ed\u0161u do jedn\u00e9ho repozit\u00e1ra. Zbl\u00e1znite sa pri rie\u0161en\u00ed v\u0161etk\u00fdch t\u00fdch konfliktov. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/16c6b8b51ae462f1e0acb966a93c0ae5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Existuje trochu in\u00fd pr\u00edpad. M\u00e1me hlavn\u00fd repozit\u00e1r a nieko\u013eko v\u00fdvoj\u00e1rov, ktor\u00ed nie\u010do robia.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/21b78ad8d0cb7cb5bded6ef9d49707c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vytvorili si ka\u017ed\u00e9ho svoju vetvu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/b85d8aa0080f08c1ad8ad83f3a9ab084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jeden sa spojil, v\u0161etko je v poriadku, \u00falohu odovzdal.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/e96d4fd52c39089e3377ed85adeeb591.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Druh\u00fd v\u00fdvoj\u00e1r medzit\u00fdm dokon\u010dil svoju \u00falohu. Predpokladajme, \u017ee ju odovzdal na rev\u00edziu. V mnoh\u00fdch spolo\u010dnostiach je zvykom \u2013 rev\u00edzia. Na jednej strane, t\u00e1to prax je dobr\u00e1 a prospe\u0161n\u00e1, na druhej strane, v mnoh\u00fdch situ\u00e1ci\u00e1ch n\u00e1s to spoma\u013euje. Nebudeme sa do toho pon\u00e1ra\u0165, ale toto je skvel\u00fd pr\u00edklad toho, kam m\u00f4\u017ee vies\u0165 kriv\u00e1 historick\u00e1 prax s rev\u00edziou. Odovzdali ste pull request na rev\u00edziu. V\u00fdvoj\u00e1r nem\u00e1 \u010do robi\u0165. \u010co rob\u00ed? Za\u010dne prebera\u0165 in\u00e9 \u00falohy. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/7b8e121be99432606056acf11e20f518.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za ten \u010das druh\u00fd v\u00fdvoj\u00e1r e\u0161te nie\u010do stihol urobi\u0165. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/ceaa5ba5b3b5014fad527362f5794e94.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prv\u00fd dokon\u010dil tretiu \u00falohu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/9c27663e63bb9489ecffc5a1f73abb87.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A po uplynut\u00ed nejakej doby bola jeho rev\u00edzia vysk\u00fa\u0161an\u00e1 a sna\u017e\u00ed sa skombinova\u0165. A \u010do sa stane? Chyt\u00e1 obrovsk\u00e9 mno\u017estvo konfliktov. Pre\u010do? Preto\u017ee k\u00fdm jeho pull request visel na rev\u00edzii, v k\u00f3de sa u\u017e kr\u00e1sne zmenilo ve\u013ea vec\u00ed. <\/p>\n<p><\/p>\n<p>Okrem probl\u00e9mov s konfliktami existuje aj probl\u00e9m s komunik\u00e1ciou. K\u00fdm va\u0161a vetva vis\u00ed na rev\u00edzii, k\u00fdm na nie\u010do \u010dak\u00e1 a k\u00fdm dlh\u0161ie pracujete na funkcii, prest\u00e1vate sledova\u0165, \u010do sa v k\u00f3dovej z\u00e1kladni v\u00e1\u0161ho servisu men\u00ed. Mo\u017eno to, \u010do sa teraz sna\u017e\u00edte vyrie\u0161i\u0165, bolo vyrie\u0161en\u00e9 u\u017e v\u010dera a m\u00f4\u017eete zobra\u0165 a nejak\u00fa met\u00f3du znovu pou\u017ei\u0165. Ale to neuvid\u00edte, preto\u017ee v\u017edy pracujete so starou vetvou. A t\u00e1to star\u00e1 vetva v\u017edy vedie k tomu, \u017ee budete musie\u0165 rie\u0161i\u0165 zlu\u010dovacie konflikty. <\/p>\n<p><\/p>\n<p>Tak\u017ee ak pracujeme ako t\u00edm, teda nie jeden \u010dlovek hrabe v repozit\u00e1ri, ale 5-10 \u013eud\u00ed, t\u00fdm dlh\u0161ie neprid\u00e1vame svoj k\u00f3d do hlavn\u00e9ho, t\u00fdm viac trp\u00edme t\u00fdm, \u017ee nakoniec mus\u00edme nie\u010do spoji\u0165. A \u010d\u00edm viac konfliktov m\u00e1me, a \u010d\u00edm star\u0161iu verzia pou\u017e\u00edvame, t\u00fdm viac m\u00e1me probl\u00e9mov.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/55c070f65a4d3838fb8c02bb9684c76b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Robi\u0165 nie\u010do spolo\u010dne \u2013 to bol\u00ed! V\u017edy si navz\u00e1jom prek\u00e1\u017eame. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/b914c50aad6f3c9f97edcad7e71ba627.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na tento probl\u00e9m sa upozornilo pred viac ako 20 rokmi. Prv\u00e9 zmienky o praxi Continuous Integration som na\u0161iel v extr\u00e9mnom programovan\u00ed.<\/p>\n<p><\/p>\n<p>Extr\u00e9mne programovanie je prv\u00fd agile framework. Str\u00e1nka sa objavila v roku 1996. Bola my\u0161lienka vyu\u017ei\u0165 ur\u010dit\u00e9 praktiky programovania, pl\u00e1novania a podobne, aby bola v\u00fdvojov\u00e1 \u010dinnos\u0165 \u010do najflexibilnej\u0161ia, aby sme mohli r\u00fdchlej\u0161ie reagova\u0165 na zmeny, po\u017eiadavky na\u0161ich z\u00e1kazn\u00edkov. A pred 24 rokmi sa za\u010dali stret\u00e1va\u0165 s t\u00fdm, \u017ee ak rob\u00edte nie\u010do ve\u013emi dlh\u00e9 a odrezan\u00e9, tak na to m\u00ed\u0148ate viac \u010dasu, preto\u017ee vznikaj\u00fa konflikty. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/93a80838bdb3b297557dbf2ac7587965.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Teraz si rozoberieme fr\u00e1zu \u201eContinuous Integration\u201c po jednotliv\u00fdch slov\u00e1ch. Ak by sme to prelo\u017eili doslovne, vych\u00e1dza to ako nepretr\u017eit\u00e1 integr\u00e1cia. Ale nie je celkom jasn\u00e9, ako ve\u013emi je nepretr\u017eit\u00e1, je ve\u013emi preru\u0161en\u00e1. Ale ko\u013eko je integr\u00e1cia, to tie\u017e nie je ve\u013emi jasn\u00e9. <\/p>\n<p><\/p>\n<p>A preto teraz uv\u00e1dzam cit\u00e1cie z extr\u00e9mneho programovania. A obe slov\u00e1 si podrobne rozoberieme. <\/p>\n<p><\/p>\n<p>Integration \u2014 Ako som u\u017e povedal, usilujeme sa o to, aby ka\u017ed\u00fd in\u017einier pracoval s najaktu\u00e1lnej\u0161ou verziou k\u00f3du, aby sa svoj k\u00f3d sna\u017eil prid\u00e1va\u0165 \u010do naj\u010dastej\u0161ie do spolo\u010dnej vetvy, aby to boli mal\u00e9 vetvy. Preto\u017ee ak s\u00fa ve\u013ek\u00e9, m\u00f4\u017eeme sa ve\u013emi \u013eahko zasekn\u00fa\u0165 na t\u00fd\u017ede\u0148 kv\u00f4li konfliktom pri slu\u010dovan\u00ed. Obzvl\u00e1\u0161\u0165, ak m\u00e1me dlh\u00fd cyklus v\u00fdvoja typu waterfall, kde program\u00e1tor odi\u0161iel na mesiac na realiz\u00e1ciu nejakej obrovskej funkcie. A v etape integr\u00e1cie sa m\u00f4\u017ee ve\u013emi dlho zasekn\u00fa\u0165. <\/p>\n<p><\/p>\n<p>Integration \u2013 to je, ke\u010f zoberieme svoju vetvu a integrujeme ju s hlavn\u00fdm, my ju slu\u010dujeme. Existuje ultim\u00e1tna varianta, kde odpor\u00fa\u010dame developera, kde sa sna\u017e\u00edme o to, aby sme okam\u017eite p\u00edsali do hlavn\u00e9ho bez ak\u00fdchko\u013evek \u010fal\u0161\u00edch vetiev.<\/p>\n<p><\/p>\n<p>Vo v\u0161eobecnosti, integr\u00e1cia \u2013 to je vzia\u0165 svoj k\u00f3d a dosta\u0165 ho do hlavn\u00e9ho. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/8950103e6a59ed7132ec321ac6abe600.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u010co sa tu mysl\u00ed pod pojmom \u201enepreru\u0161en\u00e9\u201c, \u010do sa naz\u00fdva kontinuita? Prax nazna\u010duje, \u017ee v\u00fdvoj\u00e1r sa sna\u017e\u00ed integrova\u0165 svoj k\u00f3d \u010do najr\u00fdchlej\u0161ie. To je jeho cie\u013e pri vykon\u00e1van\u00ed akejko\u013evek \u00falohy \u2013 urobi\u0165 tak, aby sa jeho k\u00f3d objavil v masteri \u010do najsk\u00f4r. V ide\u00e1lnom svete by to robili ka\u017ed\u00e9 p\u00e1r hod\u00edn. T. j. vezmete mal\u00fa \u00falohu, zl\u00fa\u010dite ju do mastera. V\u0161etko je skvel\u00e9. Na to sa mus\u00edte zamera\u0165. A robi\u0165 to treba nepreru\u0161ene. Hne\u010f ako nie\u010do urob\u00edte, okam\u017eite to posielate do mastera. <\/p>\n<p><\/p>\n<p>A v\u00fdvoj\u00e1r, ktor\u00fd nie\u010do rob\u00ed, je zodpovedn\u00fd za to, \u010do urobil, aby to fungovalo a ni\u010d neporu\u0161ilo. Tu sa zvy\u010dajne objavuje hist\u00f3rie s testami. Chceme spusti\u0165 nejak\u00e9 testy na na\u0161om commit-e, na na\u0161om merge, aby sme sa uistili, \u017ee to funguje. A tu v\u00e1m m\u00f4\u017ee pom\u00f4c\u0165 Jenkins.<\/p>\n<p><\/p>\n<p>Ale s hist\u00f3riami: a po\u010fme zmeny robi\u0165 mal\u00e9, a po\u010fme \u00falohy robi\u0165 mal\u00e9, a po\u010fme urobi\u0165 \u00falohu a okam\u017eite sa pok\u00fasi\u0165 ju zl\u00fa\u010di\u0165 do mastera \u2013 tu v\u00e1m nijak\u00e9 Jenkins nepom\u00f4\u017eu. Preto\u017ee Jenkins v\u00e1m pom\u00f4\u017ee v\u00fdlu\u010dne spusti\u0165 testy. <\/p>\n<p><\/p>\n<p>M\u00f4\u017eete sa bez nich obi\u0165. To v\u00e1m nijako neubl\u00ed\u017ei. Preto\u017ee cie\u013eom praxe je zl\u00fa\u010di\u0165 sa \u010do naj\u010dastej\u0161ie, aby ste nestr\u00e1vili obrovsk\u00e9 mno\u017estvo \u010dasu na nejak\u00fdch konfliktoch v bud\u00facnosti. <\/p>\n<p><\/p>\n<p>Predstavme si, \u017ee m\u00e1me rok 2020 bez internetu. A pracujeme lok\u00e1lne. Nem\u00e1me Jenkins. To je v poriadku. St\u00e1le si m\u00f4\u017eete vzia\u0165 a vytvori\u0165 lok\u00e1lnu vetvu. Nap\u00edsali ste nejak\u00fd k\u00f3d. Urobili ste \u00falohu za 3-4 hodiny. Prepli ste sa na master, spravili git pull, zl\u00fa\u010dili svoju vetvu. Hotovo. Ak to rob\u00edte \u010dasto \u2013 gratulujem, m\u00e1te Continuous Integration!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/1f2117b65994b940edb04e0e119f6e8a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak\u00e9 s\u00fa v s\u00fa\u010dasnom svete d\u00f4kazy na t\u00e9mu, \u017ee to stoj\u00ed za n\u00e1mahu? Preto\u017ee vo v\u0161eobecnosti je to \u0165a\u017ek\u00e9. Ak sa pok\u00fasite takto pracova\u0165, pochop\u00edte, \u017ee sa dotknete nejak\u00e9ho pl\u00e1novania, budete musie\u0165 venova\u0165 viac \u010dasu dekompoz\u00edcii \u00faloh. Preto\u017ee ak budete robi\u0165 man\u2026, tak sa nebudete m\u00f4c\u0165 r\u00fdchlo zl\u00fa\u010di\u0165 a dostanete sa do probl\u00e9mov. Prax u\u017e nebude. <\/p>\n<p><\/p>\n<p>A to bude drah\u00e9. Pracova\u0165 s Continuous Integration nielen\u017ee neza\u010dneme zajtra, ale v\u0161etci sa budeme ve\u013emi dlho zvyka\u0165, ve\u013emi dlho sa budeme u\u010di\u0165 dekomponova\u0165 \u00falohy, ve\u013emi dlho budeme upravova\u0165 prax rev\u00edzie, ak nejak\u00fa m\u00e1te. Na\u0161\u00edm cie\u013eom je, aby to dnes bolo zl\u00fa\u010den\u00e9. A ak rev\u00edziu rob\u00edte tri dni, m\u00e1te probl\u00e9my a Continuous Integration v\u00e1m nefunguje. <\/p>\n<p><\/p>\n<p>Ale m\u00e1me nejak\u00e9 aktu\u00e1lne d\u00f4kazy pr\u00e1ve teraz, ktor\u00e9 n\u00e1m hovoria, \u017ee m\u00e1 zmysel investova\u0165 do tejto praxe?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/2026a8f1d72fb05613511e7bab57e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prv\u00e1 vec, ktor\u00e1 mi napadla, je State of DevOps. Je to v\u00fdskum, ktor\u00fd robia u\u017e 7 rokov. Teraz to robia ako nez\u00e1visl\u00e1 organiz\u00e1cia, ale pod Google.<\/p>\n<p><\/p>\n<p>A ich v\u00fdskum v roku 2018 uk\u00e1zal korel\u00e1ciu medzi firmami, ktor\u00e9 sa sna\u017eia pou\u017e\u00edva\u0165 kr\u00e1tkodob\u00e9 vetvy, ktor\u00e9 sa r\u00fdchlo integrovuj\u00fa a \u010dasto, ktor\u00e9 maj\u00fa ove\u013ea lep\u0161ie v\u00fdkonnostn\u00e9 ukazovatele IT.<\/p>\n<p><\/p>\n<p>Ak\u00e9 s\u00fa to ukazovatele? S\u00fa to 4 metriky, ktor\u00e9 zbieraj\u00fa zo v\u0161etk\u00fdch spolo\u010dnost\u00ed v svojich prieskumoch: frekvencia nasadenia, \u010das na zmeny, \u010das na obnovenie slu\u017eby, miera zlyhania zmien.<\/p>\n<p><\/p>\n<p>A predov\u0161etk\u00fdm existuje t\u00e1to korel\u00e1cia, vieme, \u017ee firmy, ktor\u00e9 sa \u010dasto zl\u00fa\u010duj\u00fa, maj\u00fa tieto metriky ove\u013ea lep\u0161ie. Maj\u00fa rozdelenie firiem do nieko\u013ek\u00fdch kateg\u00f3ri\u00ed: pomal\u00e9 firmy, ktor\u00e9 produkuj\u00fa nie\u010do pomaly, stredn\u00ed v\u00fdrobcovia, vysok\u00ed v\u00fdrobcovia a elita. Elita s\u00fa Netflix, Amazon, ktor\u00ed s\u00fa super r\u00fdchli, v\u0161etko robia r\u00fdchlo, kr\u00e1sne a kvalitne.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/4fd98ef48a5cffdd6ae2ceea93dbb0bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Druh\u00e1 vec, ktor\u00e1 sa stala pred mesiacom. V Technology Radar sa objavila skvel\u00e1 pozn\u00e1mka o Gitflow. Gitflow sa l\u00ed\u0161i od v\u0161etk\u00fdch ostatn\u00fdch t\u00fdm, \u017ee jeho vetvy \u017eij\u00fa dlho. Existuj\u00fa reliza\u010dn\u00e9 vetvy, ktor\u00e9 \u017eij\u00fa dlh\u00fa dobu, a vetvy funkci\u00ed, ktor\u00e9 s\u00fa tie\u017e dlh\u00e9. T\u00e1to prax sa v Technology Radar presunula do HOLD. Pre\u010do? Preto\u017ee sa \u013eudia stret\u00e1vaj\u00fa s boles\u0165ou integr\u00e1cie. <\/p>\n<p><\/p>\n<p>Ak va\u0161a vetva \u017eije ve\u013emi dlho, za\u010dne sa zasek\u00e1va\u0165, skysne a za\u010d\u00edname tr\u00e1vi\u0165 viac \u010dasu t\u00fdm, aby sme do nej prepa\u0161ovali nejak\u00fa zmenu. <\/p>\n<p><\/p>\n<p>A ned\u00e1vno autor Gitflow povedal, \u017ee ak sa usilujete o nepretr\u017eit\u00fa integr\u00e1ciu a chcete integrova\u0165 \u010do naj\u010dastej\u0161ie, Gitflow nie je dobr\u00fd n\u00e1pad. Dodal v \u010dl\u00e1nku, \u017ee ak m\u00e1te backend, kde sa m\u00f4\u017eete k tomu sna\u017ei\u0165, Gitflow je pre v\u00e1s zbyto\u010dn\u00fd, preto\u017ee v\u00e1s spomal\u00ed a sp\u00f4sob\u00ed probl\u00e9my s integr\u00e1ciou. <\/p>\n<p><\/p>\n<p>To neznamen\u00e1, \u017ee Gitflow je zl\u00fd a nemali by ste ho pou\u017e\u00edva\u0165. Je na in\u00e9 pr\u00edpady. Napr\u00edklad, ke\u010f potrebujete podporova\u0165 nieko\u013eko verzi\u00ed slu\u017eby alebo aplik\u00e1cie, t. j. ke\u010f mus\u00edte poskytova\u0165 podporu dlh\u0161iu dobu. <\/p>\n<p><\/p>\n<p>Ale ak sa porozpr\u00e1vate s \u013eu\u010fmi, ktor\u00ed tak\u00e9to slu\u017eby podporuj\u00fa, po\u010dujete ve\u013ea s\u0165a\u017enost\u00ed na to, \u017ee verzia 3.2 bola pred 4 mesiacmi a tento fix sa do nej nedostal, a teraz, aby ho zmestili, musia urobi\u0165 mno\u017estvo zmien. A znovu uviazli a t\u00fd\u017ede\u0148 sa sna\u017eia zrealizova\u0165 a spoji\u0165 nejak\u00fa nov\u00fa funkciu. <\/p>\n<p><\/p>\n<p>Ako spr\u00e1vne poznamenal Alexander Kovalev v chate, korel\u00e1cia neznamen\u00e1 pr\u00ed\u010dinn\u00fa s\u00favislos\u0165. Je to tak. T. j. neexistuje priama s\u00favislos\u0165, \u017ee ak m\u00e1te nepretr\u017eit\u00fa integr\u00e1ciu, v\u0161etky metriky bud\u00fa \u00fa\u017easn\u00e9, nie. Ale existuje pozit\u00edvna korel\u00e1cia, \u017ee ak je jedno, pravdepodobne je aj druh\u00e9. Nie je to fakt, ale pravdepodobnos\u0165. Je to iba korel\u00e1cia. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Continuous Integration ako prax, nie Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/d5fc050550b0e9f86a1fdf85fff32fa5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Akoby sme u\u017e nie\u010do robili, akoby sme sa u\u017e sp\u00e1jali, ale ako zisti\u0165, \u017ee nepretr\u017eit\u00fa integr\u00e1ciu naozaj m\u00e1me, a \u017ee sa sp\u00e1jame dostato\u010dne \u010dasto?<\/p>\n<p><\/p>\n<p>Jez Humble je autorom Handbook, Accelerate, str\u00e1nky Continuous Delivery a knihy \u201eContinuous Delivery\u201c. Pon\u00faka tak\u00fdto test:<\/p>\n<p><\/p>\n<ul>\n<li>K\u00f3d in\u017einiera sa dost\u00e1va do masteru denne. <\/li>\n<li>Pri ka\u017edom commite sp\u00fa\u0161\u0165ate unit testy.<\/li>\n<li>Build v masteri zlyhal, opraven\u00fd bol asi za 10 min\u00fat.<\/li>\n<\/ul>\n<p><\/p>\n<p>Navrhuje pou\u017ei\u0165 tak\u00fdto test, aby ste sa uistili, \u017ee praktiku naozaj m\u00e1te. <\/p>\n<p><\/p>\n<p>Posledn\u00e9 pova\u017eujem za trochu sporn\u00e9. T. j. ak to m\u00f4\u017eete opravi\u0165 za 10 min\u00fat, znamen\u00e1 to, \u017ee m\u00e1te Continuous Integration, \u010do znie trochu divne, ale m\u00e1 to zmysel. Pre\u010do? Preto\u017ee, ak sa \u010dasto sp\u00e1jate, to znamen\u00e1, \u017ee va\u0161e zmeny s\u00fa mal\u00e9. Ak je mal\u00e9 zmenou to, \u017ee sa v\u00e1m pokazila zostava hlavnej vetvy, r\u00fdchlo n\u00e1jdete pr\u00edklad, preto\u017ee zmena je mal\u00e1. Tu ste mali mal\u00fa zl\u00fa\u010deninu, v ktorej sa zmenilo 20-30 riadkov. A preto m\u00f4\u017eete r\u00fdchlo pochopi\u0165, v \u010dom bola pr\u00ed\u010dina, preto\u017ee zmeny s\u00fa drobn\u00e9, m\u00e1te ve\u013emi mal\u00fa oblas\u0165 na h\u013eadanie probl\u00e9mu. <\/p>\n<p><\/p>\n<p>A aj ke\u010f sa n\u00e1m po uveden\u00ed do prev\u00e1dzky rozpadne produkcia, ak m\u00e1me prax Continuous Integration, je n\u00e1m ove\u013ea jednoduch\u0161ie kona\u0165, preto\u017ee zmeny s\u00fa drobn\u00e9. \u00c1no, to ovplyvn\u00ed pl\u00e1novanie. Bude to bolie\u0165. A pravdepodobne naj\u0165a\u017e\u0161ie na tejto praxi je zvykn\u00fa\u0165 si rozdeli\u0165 \u00falohy, t. j. ako urobi\u0165 nie\u010do a dokon\u010di\u0165 to za nieko\u013eko hod\u00edn a pritom prejs\u0165 rev\u00edziou, ak ju m\u00e1te. Rev\u00edzia \u2013 to je samostatn\u00e1 boles\u0165. <\/p>\n<p><\/p>\n<p>Unit testy s\u00fa len pomocn\u00edk, ktor\u00fd v\u00e1m pom\u00e1ha pochopi\u0165, \u010di va\u0161a integr\u00e1cia prebehla \u00faspe\u0161ne, \u010di sa ni\u010d neporu\u0161ilo. Pod\u013ea m\u00f4jho n\u00e1zoru to nie je \u00faplne obligatorn\u00fd bod, preto\u017ee zmysel praxe nie je v tomto. <\/p>\n<p><\/p>\n<p>To je v skratke o Continuous Integration. To je v\u0161etko, \u010do je v tejto praxi. Som pripraven\u00fd na ot\u00e1zky. <\/p>\n<p><\/p>\n<p>Iba v skratke e\u0161te raz zhrniem:<\/p>\n<p><\/p>\n<ul>\n<li>Continuous Integration \u2013 to nie je Jenkins, to nie je Gitlab.<\/li>\n<li>To nie je n\u00e1stroj, to je prax o tom, \u017ee \u010do naj\u010dastej\u0161ie zl\u00fa\u010dime n\u00e1\u0161 k\u00f3d do hlavnej vetvy. <\/li>\n<li>Rob\u00edme to, aby sme sa vyhli obrovsk\u00e9mu utrpeniu, ktor\u00e9 vznik\u00e1 s bud\u00facimi zl\u00fa\u010deniami, t. j. za\u017e\u00edvame mal\u00fa boles\u0165 teraz, aby sme neurobili v\u00e4\u010d\u0161iu v bud\u00facnosti. V tom je cel\u00fd zmysel. <\/li>\n<li>Komunik\u00e1cia prebieha cez k\u00f3d, ale to vid\u00edm ve\u013emi zriedka, ale na to bola tie\u017e zam\u00fd\u0161\u013ean\u00e1.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Ot\u00e1zky<\/strong><\/p>\n<p><\/p>\n<p><em>\u010co robi\u0165 s nedekomponovan\u00fdmi \u00falohami?<\/em><\/p>\n<p><\/p>\n<p>Dekonponova\u0165. V \u010dom je probl\u00e9m? M\u00f4\u017eete uvies\u0165 pr\u00edklad, \u017ee existuje \u00faloha a t\u00e1 sa ned\u00e1 dekomponova\u0165?<\/p>\n<p><\/p>\n<p><em>Existuj\u00fa tak\u00e9 \u00falohy, ktor\u00e9 sa nedaj\u00fa dekomponova\u0165 od slova \u201ev\u00f4bec\u201c, napr\u00edklad tie, ktor\u00e9 vy\u017eaduj\u00fa ve\u013emi hlbok\u00fa odborn\u00fa znalos\u0165 a ktor\u00e9 sa naozaj daj\u00fa rie\u0161i\u0165 po\u010das mesiaca, aby dosiahli nejak\u00fd zrozumite\u013en\u00fd v\u00fdsledok.<\/em> <\/p>\n<p><\/p>\n<p>Ak som \u0165a spr\u00e1vne pochopil, existuje nejak\u00e1 ve\u013ek\u00e1 a zlo\u017eit\u00e1 \u00faloha, ktorej v\u00fdsledok bude vidite\u013en\u00fd a\u017e o mesiac?<\/p>\n<p><\/p>\n<p><em>\u00c1no, presne tak. \u00c1no, v\u00fdsledok bude mo\u017en\u00e9 pos\u00fadi\u0165 najsk\u00f4r o mesiac.<\/em> <\/p>\n<p><\/p>\n<p>Dobre. V z\u00e1sade to nie je probl\u00e9m. Pre\u010do? Preto\u017ee v tomto pr\u00edpade, ke\u010f hovor\u00edme o vetv\u00e1ch, nehovor\u00edme o vetve s funkciou. Funkcie m\u00f4\u017eu by\u0165 ve\u013ek\u00e9 a zlo\u017eit\u00e9. Mohli by zasahova\u0165 do mnoh\u00fdch komponentov. A mo\u017eno ich nem\u00f4\u017eeme urobi\u0165 v jednej vetve \u00faplne. To je v poriadku. Sta\u010d\u00ed rozbi\u0165 tento pr\u00edbeh. Ak funkcia nie je \u00faplne hotov\u00e1, neznamen\u00e1 to, \u017ee niektor\u00e9 \u010dasti jej k\u00f3du nem\u00f4\u017eeme zl\u00fa\u010di\u0165. Pridal si, povedzme, migr\u00e1ciu a v r\u00e1mci funkcie s\u00fa nejak\u00e9 f\u00e1zy. M\u00e1\u0161, povedzme, f\u00e1zu - vykona\u0165 migr\u00e1ciu, prida\u0165 nov\u00fa met\u00f3du. A tieto veci m\u00f4\u017ee\u0161 zl\u00fa\u010di\u0165 ka\u017ed\u00fd de\u0148. <\/p>\n<p><\/p>\n<p><em>Dobre. Ak\u00fd m\u00e1 potom v tom zmysel?<\/em><\/p>\n<p><\/p>\n<p>Ak\u00fd zmysel m\u00e1 zl\u00fa\u010di\u0165 mal\u00e9 k\u00fasky ka\u017ed\u00fd de\u0148?<\/p>\n<p><\/p>\n<p><em>\u00c1no.<\/em><\/p>\n<p><\/p>\n<p>Ak ti nie\u010do rozbilo, vid\u00ed\u0161 to okam\u017eite. M\u00e1\u0161 mal\u00fd k\u00fasok, ktor\u00fd nie\u010do pokazil, jednoduch\u0161ie je to opravi\u0165. Zmysel je v tom, \u017ee zl\u00fa\u010di\u0165 mal\u00fd k\u00fasok teraz je ove\u013ea jednoduch\u0161ie ako zl\u00fa\u010di\u0165 nie\u010do ve\u013ek\u00e9 o nieko\u013eko t\u00fd\u017ed\u0148ov. A tret\u00ed zmysel je, \u017ee ostatn\u00ed in\u017einieri bud\u00fa pracova\u0165 s aktu\u00e1lnou verziou k\u00f3du. Uvidia, \u017ee tu pribudli nejak\u00e9 migr\u00e1cie a tu sa objavila nejak\u00e1 met\u00f3da, ktor\u00fa mo\u017eno bud\u00fa chcie\u0165 tie\u017e vyu\u017ei\u0165. V\u0161etci uvidia, \u010do sa deje s tvoj\u00edm k\u00f3dom. Pr\u00e1ve kv\u00f4li t\u00fdmto trom veciam sa t\u00e1to prax rob\u00ed. <\/p>\n<p><\/p>\n<p><em>\u010eakujem, ot\u00e1zka je uzavret\u00e1!<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg Soroka) M\u00f4\u017eem prida\u0165? Povedal si to spr\u00e1vne, chcem len prida\u0165 jednu vetu.<\/em><\/p>\n<p><\/p>\n<p>Tak.<\/p>\n<p><\/p>\n<p><em>Pri Continuous Integration sa k\u00f3d zlu\u010duje do hlavnej vetvy, nie ke\u010f je funkcia \u00faplne hotov\u00e1, ale ke\u010f sa prestal rozb\u00edja\u0165 build. A slobodne commitujete do hlavn\u00e9ho vetvy ko\u013ekokr\u00e1t chcete za de\u0148. Druh\u00fd aspekt \u2013 ak z nejak\u00e9ho d\u00f4vodu nem\u00f4\u017eete rozdeli\u0165 mesa\u010dn\u00fa \u00falohu na \u00falohy aspo\u0148 po tri dni, nehovoriac o troch hodin\u00e1ch, znamen\u00e1 to, \u017ee m\u00e1te obrovsk\u00fd probl\u00e9m. A fakt, \u017ee nem\u00e1te Continuous Integration, je menej z t\u00fdchto probl\u00e9mov. Znamen\u00e1 to, \u017ee m\u00e1te probl\u00e9my s architekt\u00farou a in\u017einierskau praxou na nule. Preto\u017ee aj ke\u010f ide o v\u00fdskum, v ka\u017edom pr\u00edpade ho treba formulova\u0165 vo forme hypot\u00e9z alebo cyklu.<\/em> <\/p>\n<p><\/p>\n<p><em>Hovorili sme o 4 metr\u00edkach, ktor\u00e9 rozde\u013euj\u00fa \u00faspe\u0161n\u00e9 spolo\u010dnosti od t\u00fdch menej \u00faspe\u0161n\u00fdch. T\u00fdchto 4 metr\u00edk sa e\u0161te potrebujeme do\u017ei\u0165. Ak sa priemern\u00e1 \u00faloha rob\u00ed mesiac, najprv by som sa s\u00fastredil na t\u00fato metriku. Najprv by som ju zn\u00ed\u017eil na 3 dni. A a\u017e potom by som za\u010dal prem\u00fd\u0161\u013ea\u0165 o Continuous.<\/em><\/p>\n<p><\/p>\n<p>Spr\u00e1vne som \u0165a pochopil, \u017ee si mysl\u00ed\u0161, \u017ee investova\u0165 do in\u017einierskych prakt\u00edk nem\u00e1 zmysel, ak sa ti ak\u00e1ko\u013evek \u00faloha rob\u00ed mesiac?<\/p>\n<p><\/p>\n<p><em>M\u00e1\u0161 Continuous Integration. A tam je tak\u00e1 z\u00e1le\u017eitos\u0165, \u017ee za 10 min\u00fat bu\u010f oprav\u00ed\u0161 chybu, alebo ju vr\u00e1ti\u0161 sp\u00e4\u0165. Predstav si, \u017ee si ju vydal. A m\u00e1\u0161 dokonca aj continuous deployment, vydal si ju na prod a a\u017e potom si v\u0161imol, \u017ee sa nie\u010do pokazilo. A mus\u00ed\u0161 ju vr\u00e1ti\u0165, pri\u010dom u\u017e prebehla migr\u00e1cia datab\u00e1zy. U\u017e m\u00e1\u0161 sch\u00e9mu datab\u00e1zy vo verzii nasleduj\u00facej, viac ne\u017e to, prebehol nejak\u00fd z\u00e1lohovac\u00ed proces a \u00fadaje boli u\u017e zap\u00edsan\u00e9.<\/em><\/p>\n<p><\/p>\n<p><em>A ak\u00fa m\u00e1\u0161 alternat\u00edvu? Ak vr\u00e1ti\u0161 k\u00f3d sp\u00e4\u0165, nem\u00f4\u017ee u\u017e pracova\u0165 s touto aktualizovanou datab\u00e1zou.<\/em><\/p>\n<p><\/p>\n<p>Datab\u00e1za sa pohybuje len dopredu, \u00e1no. <\/p>\n<p><\/p>\n<p><em>U \u013eud\u00ed, ktor\u00ed maj\u00fa slab\u00fa in\u017einiersku prax, pravdepodobne ani ne\u010d\u00edtali hrub\u00fa knihu o \u2026 \u010co robi\u0165 so z\u00e1lohou? Ak sa obnovuje\u0161 zo z\u00e1lohy, znamen\u00e1 to, \u017ee str\u00e1ca\u0161 \u00fadaje, ktor\u00e9 sa po\u010das tohto obdobia nazbierali. Napr\u00edklad si pracoval tri hodiny s novou verziou datab\u00e1zy, kde sa registrovali pou\u017e\u00edvatelia. Ak sa vr\u00e1ti\u0161 k starej z\u00e1lohe, preto\u017ee so novou verziou sch\u00e9ma nefunguje, tak t\u00fdchto pou\u017e\u00edvate\u013eov strat\u00ed\u0161. A s\u00fa nespokojn\u00ed, s\u00fa nahnevan\u00ed.<\/em><\/p>\n<p><\/p>\n<p><em>Aby ste ovl\u00e1dli cel\u00fd s\u00fabor prakt\u00edk podporuj\u00facich Continuous Integration a Continuous Delivery, nesta\u010d\u00ed sa len nau\u010di\u0165 p\u00edsa\u0165\u2026. Po prv\u00e9, m\u00f4\u017ee ich by\u0165 ve\u013emi ve\u013ea, \u010do bude nepraktick\u00e9. Navy\u0161e existuje mno\u017estvo in\u00fdch prakt\u00edk, ako Scientific. Je tu tak\u00e1 praktika, ktor\u00fa v jednej dobe popularizoval GitHub. Ide o to, \u017ee s\u00fa\u010dasne be\u017e\u00ed star\u00fd aj nov\u00fd k\u00f3d. Ke\u010f vytv\u00e1rate nedokon\u010den\u00fa funkciu, ale m\u00f4\u017ee vr\u00e1ti\u0165 nejak\u00fa hodnotu: bu\u010f ako funkciu, alebo ako Rest API. Sp\u00fa\u0161\u0165ate nov\u00fd aj star\u00fd k\u00f3d a porovn\u00e1vate rozdiel medzi nimi. Ak existuje rozdiel, tak t\u00fato udalos\u0165 logujete. Takto viete, \u017ee va\u0161a nov\u00e1 funkcia je pripraven\u00e1 na nasadenie nad star\u00fa, ak po\u010das ur\u010dit\u00e9ho \u010dasu nebolo \u017eiadne nes\u00falad medzi t\u00fdmito dvoma.<\/em> <\/p>\n<p><\/p>\n<p><em>Tak\u00fdch prakt\u00edk s\u00fa stovky. Navrhol by som za\u010da\u0165 s transbase development. Nie je to 100 % o Continuous Integration, ale praktiky s\u00fa rovnak\u00e9, jedno bez druh\u00e9ho \u0165a\u017eko pre\u017eije.<\/em> <\/p>\n<p><\/p>\n<p>Spomenul si transbase development ako pr\u00edklad, kde sa daj\u00fa pozrie\u0165 praktiky, alebo navrhuje\u0161 \u013eu\u010fom za\u010da\u0165 pou\u017e\u00edva\u0165 transbase development?<\/p>\n<p><\/p>\n<p><em>Pozrie\u0165, preto\u017ee ich nebud\u00fa m\u00f4c\u0165 pou\u017ei\u0165. Aby ich mohli pou\u017e\u00edva\u0165, musia si pre\u010d\u00edta\u0165 ve\u013ea o tom. A ke\u010f m\u00e1 \u010dlovek ot\u00e1zku: \u201e\u010co robi\u0165 s funkciou, ktor\u00e1 trv\u00e1 mesiac\u201c, znamen\u00e1 to, \u017ee ne\u010d\u00edtal o transbase development. A ani by som to zatia\u013e neodpor\u00fa\u010dal. Odporu\u010dil by som s\u00fastredi\u0165 sa v\u00fdlu\u010dne na t\u00e9mu, ako spr\u00e1vne architektonicky rozdeli\u0165 ve\u013ek\u00e9 \u00falohy na men\u0161ie. V tom spo\u010d\u00edva podstata dekompoz\u00edcie.<\/em><\/p>\n<p><\/p>\n<p><em>Dekompoz\u00edcia je jedn\u00fdm z n\u00e1strojov architekta. Najprv rob\u00edme anal\u00fdzu, potom dekompoz\u00edciu, potom synt\u00e9zu a nakoniec integr\u00e1ciu. Takto n\u00e1m v\u0161etko do seba zapad\u00e1. A pred Continuous Integration mus\u00edme najprv prejs\u0165 cez dekompoz\u00edciu. Na prvej f\u00e1ze vyvst\u00e1vaj\u00fa ot\u00e1zky, a u\u017e hovor\u00edme o \u0161tvrtej f\u00e1ze, t. j. \u010d\u00edm \u010dastej\u0161ie rob\u00edte integr\u00e1ciu, t\u00fdm lep\u0161ie. E\u0161te je pr\u00edli\u0161 skoro na to, aby ste to robili, bolo by dobr\u00e9 najprv rozreza\u0165 svoj monolit.<\/em> <\/p>\n<p><\/p>\n<p><em>Potrebujete nakresli\u0165 nieko\u013eko \u0161\u00edpok a \u0161tvor\u010dekov na nejak\u00fa sch\u00e9mu. Nem\u00f4\u017eete poveda\u0165: \u201eteraz uk\u00e1\u017eem architektonick\u00fa sch\u00e9mu novej aplik\u00e1cie\u201c a zobrazi\u0165 len jeden \u0161tvor\u010dek, v ktorom je zelen\u00e9 tla\u010didlo na aplik\u00e1ciu. V ka\u017edom pr\u00edpade bude viac \u0161tvor\u010dekov a \u0161\u00edpok. Na ka\u017edej sch\u00e9me, ktor\u00fa som videl, ich bolo viac ako jeden. A dekompoz\u00edcia u\u017e prebieha aj na \u00farovni grafick\u00e9ho zobrazenia. Preto m\u00f4\u017eeme \u0161tvor\u010deky robi\u0165 nez\u00e1visl\u00e9. Ak nie, m\u00e1m ve\u013ek\u00e9 ot\u00e1zky k architektovi.<\/em> <\/p>\n<p><\/p>\n<p>Je tu ot\u00e1zka z chatu: \u201eAk je rev\u00edzia povinn\u00e1 a trv\u00e1 dlho, niekde de\u0148 a viac?\u201c<\/p>\n<p><\/p>\n<p>M\u00e1te probl\u00e9my s praxou. Rev\u00edzia by nemala trva\u0165 de\u0148 a viac. Je to t\u00e1 ist\u00e1 situ\u00e1cia ako pri predch\u00e1dzaj\u00facej ot\u00e1zke, len o nie\u010do jemnej\u0161ia. Ak rev\u00edzia trv\u00e1 de\u0148, znamen\u00e1 to, \u017ee ide o nie\u010do ve\u013emi ve\u013ek\u00e9. A mali by ste robi\u0165 men\u0161ie rev\u00edzie. V transbase development, ktor\u00e9 Oleg odporu\u010dil, existuje tak\u00e1 met\u00f3da, ktor\u00e1 sa naz\u00fdva nepretr\u017eit\u00e1 rev\u00edzia. Jej my\u0161lienka spo\u010d\u00edva v tom, \u017ee rob\u00edme \u00famyselne ve\u013emi mal\u00e9 pull requesty, preto\u017ee sa sna\u017e\u00edme neust\u00e1le zl\u00fa\u010di\u0165 a pomaly. Preto pull request men\u00ed jednu abstrakciu alebo 10 riadkov. V\u010faka tomu rev\u00edzia trv\u00e1 p\u00e1r min\u00fat. <\/p>\n<p><\/p>\n<p>Ak rev\u00edzia trv\u00e1 de\u0148 a viac, znamen\u00e1 to, \u017ee nie\u010do nie je v poriadku. Po prv\u00e9, mo\u017eno m\u00e1te nejak\u00e9 probl\u00e9my s architekt\u00farou. Alebo ide o ve\u013ek\u00fd kus k\u00f3du, napr\u00edklad na 1 000 riadkov. Alebo m\u00e1te tak zlo\u017eit\u00fa architekt\u00faru, \u017ee ju osoba nem\u00f4\u017ee pochopi\u0165. To je probl\u00e9m, ktor\u00fd treba vyrie\u0161i\u0165. Mo\u017eno rev\u00edzia ani nie je potrebn\u00e1. Nad t\u00fdmto treba tie\u017e rozm\u00fd\u0161\u013ea\u0165. Rev\u00edzia je vec, ktor\u00e1 v\u00e1s brzd\u00ed. M\u00e1 svoje v\u00fdhody, ale treba pochopi\u0165, pre\u010do to rob\u00edte. Je to pre v\u00e1s sp\u00f4sob, ako r\u00fdchlo prenies\u0165 inform\u00e1cie, ustanovi\u0165 vo vn\u00fatri nejak\u00e9 \u0161tandardy, alebo \u010do? Pre\u010do to rob\u00edte? Preto\u017ee rev\u00edzia by mala by\u0165 bu\u010f ve\u013emi r\u00fdchla, alebo ju \u00faplne zru\u0161i\u0165. Je to ako transbase development \u2013 ve\u013emi pekn\u00fd koncept, ale len pre zrel\u00fdch v\u00fdvoj\u00e1rov. <\/p>\n<p><\/p>\n<p>Pokia\u013e ide o 4 metriky, odpor\u00fa\u010dal by som ich z\u00edska\u0165, aby ste pochopili, k \u010domu to vedie. Pozrie\u0165 sa na \u010d\u00edsla, pozrie\u0165 sa na obr\u00e1zky, ako je to zl\u00e9. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Som pripraven\u00fd diskutova\u0165 o tom s tebou. \u010c\u00edsla a metriky s\u00fa super, ale prax je e\u0161te lep\u0161ia. Mus\u00edme si v\u0161ak uvedomi\u0165, \u010di je to potrebn\u00e9 pre biznis. Existuj\u00fa podniky, ktor\u00fdm tak\u00e1 r\u00fdchlos\u0165 zmien nie je potrebn\u00e1. Pozn\u00e1m firmy, kde sa zmeny nedaj\u00fa robi\u0165 ka\u017ed\u00fdch 15 min\u00fat. Nie preto, \u017ee by boli zl\u00e9. To je proste ich \u017eivotn\u00fd cyklus. A na to, aby sme mohli robi\u0165 funkcie branches a toggle, potrebujeme hlbok\u00e9 vedomosti.<\/em> <\/p>\n<p><\/p>\n<p>Je to komplikovan\u00e9. Ak sa chcete dozvedie\u0165 viac o hist\u00f3rii funkcie toggle, ve\u013emi to odpor\u00fa\u010dam. <noindex><a rel=\"nofollow\" href=\"https:\/\/trunkbaseddevelopment.com\/\">https:\/\/trunkbaseddevelopment.com\/<\/a><\/noindex>. A existuje skvel\u00fd \u010dl\u00e1nok od Martina Fowlera o funkci\u00e1ch toggle: o r\u00f4znych typoch, \u017eivotn\u00fdch cykloch at\u010f. Funkcia toggle je naozaj zlo\u017eit\u00e1. <\/p>\n<p><\/p>\n<p><em>A predsa si neodpovedal na ot\u00e1zku: \u201eJe Jenkins potrebn\u00fd, alebo nie?\u201c<\/em><\/p>\n<p><\/p>\n<p>Jenkins naozaj nie je potrebn\u00fd za \u017eiadnych okolnost\u00ed. Ak to mysl\u00edme v\u00e1\u017ene, n\u00e1stroje ako Jenkins a Gitlab v\u00e1m prines\u00fa komfort. Uvid\u00edte, \u010di sa zostava podarila alebo nie. M\u00f4\u017eu v\u00e1m pom\u00f4c\u0165, ale prax v\u00e1m nezabezpe\u010dia. M\u00f4\u017eu v\u00e1m len da\u0165 kolo \u2013 Ok, nie Ok. A to ak e\u0161te p\u00ed\u0161ete testy, preto\u017ee bez testov je to takmer zbyto\u010dn\u00e9. Tak\u017ee je potrebn\u00fd, preto\u017ee je to pohodlnej\u0161ie, ale v z\u00e1sade sa d\u00e1 aj bez neho pre\u017ei\u0165, ve\u013ea nestrat\u00edte. <\/p>\n<p><\/p>\n<p><em>T.j. ak m\u00e1te prax, znamen\u00e1 to, \u017ee ho nepotrebujete?<\/em><\/p>\n<p><\/p>\n<p>Presne tak. Odpor\u00fa\u010dam test Jez Humble. Tam m\u00e1me rozporupln\u00fd n\u00e1zor na posledn\u00fd bod. Ale celkovo, ak m\u00e1te tri veci, ste neust\u00e1le sp\u00e1jaj\u00faci, sp\u00fa\u0161\u0165ate testy na commity v masteri a r\u00fdchlo opravujete build v masteri, mo\u017eno v\u00e1m u\u017e ni\u010d in\u00e9 ani netreba. <\/p>\n<p><\/p>\n<p><em>K\u00fdm \u010dak\u00e1me na ot\u00e1zky od \u00fa\u010dastn\u00edkov, m\u00e1m ot\u00e1zku. Hovorili sme o produktovom k\u00f3de. Pou\u017e\u00edval si to aj pre infra\u0161trukt\u00farny k\u00f3d? Je to ten ist\u00fd k\u00f3d, m\u00e1 rovnak\u00e9 princ\u00edpy a rovnak\u00fd \u017eivotn\u00fd cyklus, alebo platia in\u00e9 \u017eivotn\u00e9 cykly a princ\u00edpy? Obvykle, ke\u010f sa v\u0161etci rozpr\u00e1vaj\u00fa o Continuous Integration a Development, zab\u00fadaj\u00fa, \u017ee existuje aj infra\u0161trukt\u00farny k\u00f3d. A v poslednom \u010dase ich prib\u00fada \u010doraz viac. A mali by sme tam prinies\u0165 v\u0161etky tieto pravidl\u00e1?<\/em><\/p>\n<p><\/p>\n<p>Nie je to len potrebn\u00e9, ale bolo by to \u00fa\u017easn\u00e9, preto\u017ee by to presne takto u\u013eah\u010dilo \u017eivot. Hne\u010f ako pracujeme s k\u00f3dom, nie so skriptami na bash, ale m\u00e1me norm\u00e1lny k\u00f3d.<\/p>\n<p><\/p>\n<p><em>Stop, stop, skript na bash je tie\u017e k\u00f3d. Nezab\u00fadaj na moju star\u00fa l\u00e1sku.<\/em> <\/p>\n<p><\/p>\n<p>Dobre, nebudem ti zne\u010dis\u0165ova\u0165 spomienky. M\u00e1m vo\u010di bash osobn\u00fa averziu. Neust\u00e1le sa rozpad\u00e1 nepekn\u00fdm a desiv\u00fdm sp\u00f4sobom. A \u010dastokr\u00e1t nepravidelne, preto ho nem\u00e1m r\u00e1d. Ale dobre, predpokladajme, \u017ee m\u00e1\u0161 k\u00f3d v bashe. Mo\u017eno sa v tom naozaj nevyzn\u00e1m a existuj\u00fa tam norm\u00e1lne testovacie r\u00e1mce. Proste nie som v t\u00e9me. A z\u00edskavame tie ist\u00e9 v\u00fdhody.<\/p>\n<p><\/p>\n<p>Akon\u00e1hle pracujeme s infra\u0161trukt\u00farou ako s k\u00f3dom, dost\u00e1vame v\u0161etky tie ist\u00e9 probl\u00e9my ako v\u00fdvoj\u00e1ri. Pred nieko\u013ek\u00fdmi mesiacmi som sa stretol so situ\u00e1ciou, \u017ee kolega mi poslal pull request na 1 000 riadkov v bashe. A ty sa zasekne\u0161 na rev\u00edzii na 4 hodiny. Probl\u00e9my s\u00fa st\u00e1le tie ist\u00e9. Je to st\u00e1le k\u00f3d. A st\u00e1le spolo\u010dn\u00e1 pr\u00e1ca. Uviazli sme s pull request a uviazli sme s t\u00fdm, \u017ee rie\u0161ime tie ist\u00e9 m merge konflikty toho ist\u00e9ho bash, napr\u00edklad. <\/p>\n<p><\/p>\n<p>V s\u00fa\u010dasnosti sa ve\u013emi akt\u00edvne pozer\u00e1m na to v\u0161etko z h\u013eadiska maxim\u00e1lne kr\u00e1sneho programovania infra\u0161trukt\u00fary. Teraz som implementoval do infra\u0161trukt\u00fary Pulumi. To je programovanie v \u010distej podobe. Je to e\u0161te kraj\u0161ie, preto\u017ee m\u00e1m v\u0161etky mo\u017enosti programovacieho jazyka, tj. rovnak\u00fdmi if-mi som vyrobil kr\u00e1sne toggles a v\u0161etko je v poriadku. T.j. moja zmena je u\u017e v masteri. U\u017e ju v\u0161etci vidia. Ostatn\u00ed in\u017einieri o nej vedia. U\u017e to malo nejak\u00fd dopad. Ale pri tom sa to nezaplo pre v\u0161etky infra\u0161trukt\u00fary. Zaplo sa to pre moje testovacie prostredia, napr\u00edklad. Preto, odpovedaj\u00fac na tvoju ot\u00e1zku e\u0161te raz, je to potrebn\u00e9. U\u013eah\u010duje n\u00e1m to \u017eivot ako in\u017einierom pracuj\u00facim s k\u00f3dom. <\/p>\n<p><\/p>\n<p><em>M\u00e1 niekto \u010fal\u0161ie ot\u00e1zky?<\/em> <\/p>\n<p><\/p>\n<p>M\u00e1m ot\u00e1zku. Chcem pokra\u010dova\u0165 v diskusii s Olegom. Celkovo si mysl\u00edm, \u017ee m\u00e1\u0161 pravdu, \u017ee ak sa \u00faloha rob\u00ed mesiac, m\u00e1\u0161 probl\u00e9m s architekt\u00farou, m\u00e1\u0161 probl\u00e9m s anal\u00fdzou, dekompoz\u00edciou, pl\u00e1novan\u00edm a tak \u010falej. Ale m\u00e1m tak\u00fd pocit, \u017ee ak za\u010dne\u0161 \u017ei\u0165 pod\u013ea Continuous Integration, za\u010dne\u0161 opravova\u0165 bolesti s pl\u00e1novan\u00edm, preto\u017ee nikam inam sa od toho nedostane\u0161. <\/p>\n<p><\/p>\n<p><em>(Oleg) \u00c1no, je to pravda. Po\u017eiadavky na \u010das s\u00fa porovnate\u013en\u00e9 s in\u00fdmi v\u00e1\u017enymi praktikami, ktor\u00e9 menia kult\u00faru. Naj\u0165a\u017e\u0161ie na prekonanie s\u00fa zvyky, najm\u00e4 tie zl\u00e9. A ak na zavedenie tejto praxe je potrebn\u00e1 v\u00e1\u017ena zmena zvyklost\u00ed okolia: developerov, mana\u017ementu, produk\u010dn\u00fdch mana\u017e\u00e9rov, \u010dakaj\u00fa v\u00e1s prekvapenia.<\/em> <\/p>\n<p><\/p>\n<p><em>Ak\u00e9 prekvapenia m\u00f4\u017eu nasta\u0165? Predpokladajme, \u017ee ste sa rozhodli \u010dastej\u0161ie vykon\u00e1va\u0165 integr\u00e1ciu. A na integr\u00e1cii s\u00fa viazan\u00e9 nejak\u00e9 \u010fal\u0161ie veci, predpokladajme, artefakty. A vo va\u0161ej spolo\u010dnosti je napr\u00edklad politika, \u017ee ka\u017ed\u00fd artefakt mus\u00ed by\u0165 ur\u010dit\u00fdm sp\u00f4sobom evidovan\u00fd v nejakej syst\u00e9me na skladovanie artefaktov. A to zaber\u00e1 ur\u010dit\u00fd \u010das. Osoba si mus\u00ed za\u0161krt\u00e1va\u0165, \u017ee ako release mana\u017e\u00e9r testoval tento artefakt na pripravenos\u0165 na nasadenie do produkcie. Ak to trv\u00e1 5-10-15 min\u00fat, ale pri tom rob\u00edte nasadenie raz za t\u00fd\u017ede\u0148, tak raz za t\u00fd\u017ede\u0148 str\u00e1vi\u0165 polhodinu \u2013 to je mal\u00fd da\u0148.<\/em> <\/p>\n<p><\/p>\n<p><em>Ak rob\u00edte Continuous Integration 10-kr\u00e1t denne, potom 10-kr\u00e1t mus\u00edte n\u00e1sobi\u0165 30 min\u00fatami. A to presahuje mno\u017estvo pracovn\u00e9ho \u010dasu tohto release mana\u017e\u00e9ra. Jednoducho sa unav\u00ed to robi\u0165. Existuj\u00fa st\u00e1le n\u00e1klady na nejak\u00e9 praktiky. A v\u0161etko.<\/em> <\/p>\n<p><\/p>\n<p><em>A potrebujete bu\u010f zru\u0161i\u0165 toto pravidlo, aby ste sa u\u017e viac nezapodievali tak\u00fdmi hl\u00fapos\u0165ami, t. j. neprira\u010fujete ru\u010dne \u00farove\u0148 zhody nie\u010doho s nie\u010d\u00edm. \u00daplne sa spoliehate na nejak\u00fd automatizovan\u00fd s\u00fabor testov pripravenosti.<\/em> <\/p>\n<p><\/p>\n<p><em>A ak potrebujete od niekoho potvrdenie, aby to hlavn\u00fd podp\u00edsal, a neleziete do produkcie bez toho, aby v\u00e1m Va\u0161a povedala, \u017ee to povolila at\u010f. \u2013 v\u0161etky tieto hl\u00faposti br\u00e1nia praktik\u00e1m. Preto\u017ee ak s\u00fa nejak\u00e9 aktivity viazan\u00e9 ako da\u0148, v\u0161etko sa stokr\u00e1t zv\u00fd\u0161i. Preto posun nie je \u010dasto vn\u00edman\u00fd v\u0161etk\u00fdmi pozit\u00edvne. Preto\u017ee zvyky \u013eud\u00ed s\u00fa \u0165a\u017ek\u00e9 na opravu.<\/em> <\/p>\n<p><\/p>\n<p><em>Ke\u010f \u010dlovek vykon\u00e1va svoju zvy\u010dajn\u00fa pr\u00e1cu, rob\u00ed ju prakticky bez prem\u00fd\u0161\u013eania. Jej kognit\u00edvne za\u0165a\u017eenie je nulov\u00e9. Proste to rob\u00ed, m\u00e1 v hlave u\u017e zoznam, tis\u00edckr\u00e1t to robil. A akon\u00e1hle pr\u00edde\u0161 a povie\u0161 mu: \u201eZru\u0161\u00edme t\u00fato prax a od pondelka zavedieme nov\u00fa\u201c pre neho to je obrovsk\u00e9 kognit\u00edvne za\u0165a\u017eenie. A to nast\u00e1va pre v\u0161etk\u00fdch naraz.<\/em> <\/p>\n<p><\/p>\n<p><em>Preto je najjednoduch\u0161ie, pravda, \u017ee t\u00fato luxus si nem\u00f4\u017ee dovoli\u0165 ka\u017ed\u00fd, ale ja to rob\u00edm v\u017edy takto. Ak sa sp\u00fa\u0161\u0165a nov\u00fd projekt, zvy\u010dajne sa do tohto projektu okam\u017eite zaprac\u00favaj\u00fa v\u0161etky nepodlo\u017een\u00e9 praktiky. K\u00fdm je projekt mlad\u00fd, nijako neriskujeme. Producent e\u0161te nie je, nem\u00e1me \u010do rozbi\u0165. Preto sa d\u00e1 vyu\u017ei\u0165 ako tr\u00e9ning. Tak\u00fdto pr\u00edstup funguje. Ale nie v\u0161etky firmy maj\u00fa mo\u017enos\u0165 sp\u00fa\u0161\u0165a\u0165 tak\u00e9to projekty \u010dasto. Hoci je to trochu zvl\u00e1\u0161tne, preto\u017ee teraz je v\u0161ade digital transformation, v\u0161etci by mali sp\u00fa\u0161\u0165a\u0165 experimenty, aby dr\u017eali krok s konkurenciou.<\/em> <\/p>\n<p><\/p>\n<p>Tu sa dost\u00e1va\u0161 k tomu, \u017ee najprv mus\u00ed\u0161 ma\u0165 jasnos\u0165 v tom, \u010do chce\u0161 robi\u0165. Sv\u011bt nie je dokonal\u00fd, ani produkcia nie je dokonal\u00e1. <\/p>\n<p><\/p>\n<p><em>\u00c1no, tieto veci s\u00fa prepojen\u00e9.<\/em><\/p>\n<p><\/p>\n<p>Podniky tie\u017e nie v\u017edy rozumej\u00fa, \u017ee musia \u00eds\u0165 pr\u00e1ve tam. <\/p>\n<p><\/p>\n<p><em>Existuje situ\u00e1cia, ke\u010f nie s\u00fa mo\u017en\u00e9 \u017eiadne zmeny. Je to situ\u00e1cia, ke\u010f na t\u00edm je vyv\u00edjan\u00fd v\u00e4\u010d\u0161\u00ed tlak. T\u00edm je u\u017e dos\u0165 vy\u010derpan\u00fd. Nem\u00e1 \u017eiadny \u010dasov\u00fd rezervu na experimenty. Od r\u00e1na do ve\u010dera prer\u00e1baj\u00fa funkcie. A vedeniu je st\u00e1le m\u00e1lo funkci\u00ed. Po\u017eaduje sa st\u00e1le viac a viac. V takejto situ\u00e1cii nie s\u00fa mo\u017en\u00e9 \u017eiadne zmeny. T\u00edm m\u00f4\u017ee iba po\u010du\u0165, \u017ee zajtra budeme robi\u0165 rovnako ako v\u010dera, len mus\u00edme urobi\u0165 o nie\u010do viac funkci\u00ed. \u017diadne prechody na \u017eiadne praktiky nie s\u00fa v tomto zmysle mo\u017en\u00e9. Je to klasick\u00e1 situ\u00e1cia, ke\u010f nie je \u010das na br\u00fasenie sekery, treba r\u00faba\u0165 stromy, a tak r\u00fabaj\u00fa tupou sekerou. Tu niet jednoduch\u00fdch r\u00e1d.<\/em> <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Pre\u010d\u00edtam upresnenie z chatu: \u201eAle potrebujete ve\u013ek\u00e9 pokrytie testami na r\u00f4znych \u00farovniach. Ko\u013eko \u010dasu sa venuje testom? Je to akosi drah\u00e9, berie to ve\u013ea \u010dasu.\u201c<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg) Toto je klasick\u00e1 myln\u00e1 predstava. Testov by malo by\u0165 dostatok na to, aby ste mali istotu sami v sebe. Continuous Integration nie je nie\u010do, kde najprv ide 100 % testov a a\u017e potom za\u010dnete t\u00fato prax uplat\u0148ova\u0165. Continuous Integration zni\u017euje va\u0161u kognit\u00edvnu z\u00e1\u0165a\u017e, preto\u017ee ka\u017ed\u00e1 z \u00faprav, ktor\u00fa vid\u00edte, je tak jasn\u00e1, \u017ee ch\u00e1pete, \u010di nie\u010do rozbije, aj bez testov. M\u00f4\u017eete to r\u00fdchlo otestova\u0165 vo svojej hlave, preto\u017ee s\u00fa to mal\u00e9 \u00fapravy. Aj ak m\u00e1te len manu\u00e1lnych testerov, je to pre nich jednoduch\u0161ie. Spustili ste nov\u00fd k\u00f3d a povedali: \u201ePozri, ni\u010d sa nerozbilo?\u201c Kontroluj\u00fa a hovoria: \u201eNie, ni\u010d sa nerozbilo.\u201c Preto\u017ee tester vie, na \u010do sa m\u00e1 pozera\u0165. M\u00e1te jeden commit spojen\u00fd s jedn\u00fdm \u00faryvkom k\u00f3du. A to sa konkr\u00e9tne spr\u00e1va takto.<\/em><\/p>\n<p><\/p>\n<p>Tu si samozrejme pridal na dramatike. <\/p>\n<p><\/p>\n<p><em>(Dmitry) Tu sa s tebou nes\u00fahlas\u00edm. Existuje prax \u2013 testovan\u00edm riaden\u00fd v\u00fdvoj, ktor\u00e1 \u0165a pr\u00e1ve od toho zachr\u00e1ni.<\/em> <\/p>\n<p><\/p>\n<p><em>(Oleg) E\u0161te som sa k tomu nedostal. Prv\u00e1 il\u00fazia je, \u017ee je potrebn\u00e9 nap\u00edsa\u0165 presne 100 % testov, alebo sa v\u00f4bec nezaobera\u0165 Continuous Integration. To nie je pravda. S\u00fa to dve paraleln\u00e9 praktiky. A priamo nez\u00e1visia. V\u00e1\u0161 pokrytie testami by malo by\u0165 optim\u00e1lne. Optim\u00e1lne znamen\u00e1, \u017ee ste si ist\u00ed, \u017ee kvalita master vetvy, ktor\u00e1 zostala po commite, v\u00e1m umo\u017e\u0148uje s d\u00f4verou stla\u010di\u0165 tla\u010didlo \u201eDeploy\u201c v piatok ve\u010der po zapit\u00ed. Ako to dosiahnete? V\u010faka review, pokrytiu a dobr\u00e9mu monitoringu.<\/em> <\/p>\n<p><\/p>\n<p><em>Dobr\u00fd monitoring nie je mo\u017en\u00e9 odl\u00ed\u0161i\u0165 od testov. Ak sp\u00fa\u0161\u0165ate testy len raz na pre-produkt, tak len raz overia v\u0161etky va\u0161e pou\u017e\u00edvate\u013esk\u00e9 scen\u00e1re a to je v\u0161etko. Ak ich v\u0161ak sp\u00fa\u0161\u0165ate v nekone\u010dnej slu\u010dke, tak je to v\u00e1\u0161 roz\u0161\u00edren\u00fd monitorovac\u00ed syst\u00e9m, ktor\u00fd neust\u00e1le testuje \u2013 padlo to alebo nie. V tomto pr\u00edpade je rozdiel len v jednorazovosti alebo opakovate\u013enosti. Ve\u013emi dobr\u00e1 sada testov \u2026, sp\u00fa\u0161\u0165an\u00e9 nekone\u010dne, je monitoring. A spr\u00e1vny monitoring by mal tak\u00fdmto sp\u00f4sobom fungova\u0165.<\/em> <\/p>\n<p><\/p>\n<p><em>A preto, ako presne dosiahnete stav, ke\u010f v piatok ve\u010der nasad\u00edte a idete domov, je in\u00e1 ot\u00e1zka. Mo\u017eno ste jednoducho odv\u00e1\u017eny bl\u00e1zon.<\/em> <\/p>\n<p><\/p>\n<p>Po\u010fme sa na chv\u00ed\u013eu vr\u00e1ti\u0165 k Continuous Integration. Trochu sme sa dostali do inej n\u00e1ro\u010dnej praktiky. <\/p>\n<p><\/p>\n<p><em>A druh\u00e1 il\u00fazia je, \u017ee MVP sa hovor\u00ed, \u017ee treba robi\u0165 r\u00fdchlo, preto tam testy vlastne nie s\u00fa potrebn\u00e9. To nie je celkom pravda. Ide o to, \u017ee ke\u010f p\u00ed\u0161ete user story do MVP, m\u00f4\u017eete ju vyv\u00edja\u0165 bu\u010f n\u00e1hodne, teda po\u010duli ste, \u017ee existuje nejak\u00e1 user story a hne\u010f ste sa pustili do k\u00f3dovania, alebo pracova\u0165 pod\u013ea TDD. A pod\u013ea TDD, ako ukazuje prax, to trv\u00e1 rovnako dlho, teda testy s\u00fa len ved\u013eaj\u0161\u00ed produkt. Podstata TDD nie je v testovan\u00ed. Napriek tomu, \u017ee sa to vol\u00e1 Test Driven Development, tam ide vlastne o nie\u010do in\u00e9. Je to sk\u00f4r architektonick\u00fd pr\u00edstup. Je to pr\u00edstup, ako p\u00edsa\u0165 presne to, \u010do potrebujete, a nep\u00edsa\u0165 to, \u010do nepotrebujete. T\u00e1to prax sa s\u00fastre\u010fuje na \u010fal\u0161iu iter\u00e1ciu v\u00e1\u0161ho myslenia v s\u00favislosti so zhotovovan\u00edm architekt\u00fary aplik\u00e1cie.<\/em> <\/p>\n<p><\/p>\n<p><em>Preto nie je tak\u00e9 jednoduch\u00e9 zbavi\u0165 sa t\u00fdchto il\u00fazi\u00ed. MVP a testy si navz\u00e1jom neprek\u00e1\u017eaj\u00fa. Sk\u00f4r naopak, ak rob\u00edte MVP pod\u013ea praxe TDD, ur\u010dite to urob\u00edte lep\u0161ie a r\u00fdchlej\u0161ie, ne\u017e keby ste to robili bez praxe a len n\u00e1hodne.<\/em><\/p>\n<p><\/p>\n<p>Je to ve\u013emi nejasn\u00e1 a zlo\u017eit\u00e1 my\u0161lienka. Ke\u010f po\u010dujete, \u017ee teraz budem p\u00edsa\u0165 aj testy a z\u00e1rove\u0148 nie\u010do urob\u00edm r\u00fdchlej\u0161ie, znie to absol\u00fatne neadekv\u00e1tne. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Mnoh\u00ed, ke\u010f hovoria o MVP, sa len vyh\u00fdbaj\u00fa nap\u00edsa\u0165 nie\u010do norm\u00e1lne. A predsa s\u00fa to r\u00f4zne veci. Netreba z MVP robi\u0165 nejak\u00fa zl\u00fa vec, ktor\u00e1 nefunguje.<\/em> <\/p>\n<p><\/p>\n<p>\u00c1no, m\u00e1\u0161 pravdu.<\/p>\n<p><\/p>\n<p><em>A potom zrazu MVP v prod.<\/em><\/p>\n<p><\/p>\n<p>Nav\u017edy. <\/p>\n<p><\/p>\n<p>A TDD znie ve\u013emi nezvy\u010dajne, ke\u010f po\u010duje\u0161, \u017ee p\u00ed\u0161e\u0161 testy a akoby rob\u00ed\u0161 viac pr\u00e1ce. Znie to ve\u013emi zvl\u00e1\u0161tne, ale v skuto\u010dnosti to ide r\u00fdchlej\u0161ie a poh\u013eadnej\u0161ie. Ke\u010f p\u00ed\u0161e\u0161 test, u\u017e v hlave ve\u013ea prem\u00fd\u0161\u013ea\u0161 o tom, ak\u00fd k\u00f3d a ako bude vyvol\u00e1van\u00fd, ako aj ak\u00e9 spr\u00e1vanie od neho o\u010dak\u00e1vame. Nehovor\u00ed\u0161 len to, \u017ee som nap\u00edsal nejak\u00fa funkciu a t\u00e1 nie\u010do rob\u00ed. Najprv si premyslel, ak\u00e9 m\u00e1 podmienky, ako bude vyvol\u00e1van\u00e1. Pokr\u00fdva\u0161 to testami a tak pochop\u00ed\u0161, ako bud\u00fa vyzera\u0165 rozhrania vo va\u0161om k\u00f3de. To ve\u013emi silno ovplyv\u0148uje architekt\u00faru. Tvoj k\u00f3d sa automaticky st\u00e1va modul\u00e1rnej\u0161\u00edm, preto\u017ee najprv sa sna\u017e\u00ed\u0161 pochopi\u0165, ako ho bude\u0161 testova\u0165 a a\u017e potom ho p\u00ed\u0161e\u0161. <\/p>\n<p><\/p>\n<p>M\u00e1m sk\u00fasenos\u0165 s TDD, kedy som si v ur\u010ditej f\u00e1ze najal mentora na Ruby, ke\u010f som e\u0161te programoval v Ruby. Povedal mi: \u201ePo\u010fme ti pom\u00f4c\u0165 s TDD.\u201c A ja som si pomyslel: \u201eBo\u017ee, teraz e\u0161te nie\u010do navy\u0161e p\u00edsa\u0165.\u201c Dohodli sme sa, \u017ee po\u010das dvoch t\u00fd\u017ed\u0148ov budem cel\u00fd svoj k\u00f3d v Pythone p\u00edsa\u0165 pod\u013ea TDD. Po dvoch t\u00fd\u017ed\u0148och som pochopil, \u017ee u\u017e nechcem sp\u00e4\u0165. Po\u010das t\u00fdch dvoch t\u00fd\u017ed\u0148ov, ke\u010f som sa to sna\u017eil aplikova\u0165 v\u0161ade, som si uvedomil, ak\u00e9 \u013eahk\u00e9 sa mi stalo aj len uva\u017eova\u0165. Nie je to v\u0161ak zrejm\u00e9, a preto v\u0161etk\u00fdm odpor\u00fa\u010dam, ak m\u00e1te pocit, \u017ee TDD je zlo\u017eit\u00e9, dlh\u00e9 a zbyto\u010dn\u00e9, sk\u00faste to dodr\u017eiava\u0165 aspo\u0148 dva t\u00fd\u017edne. Mne to na to sta\u010dilo.<\/p>\n<p><\/p>\n<p><em>(Dmitrij) M\u00f4\u017eeme t\u00fato my\u0161lienku rozvin\u00fa\u0165 z poh\u013eadu prev\u00e1dzky infra\u0161trukt\u00fary. Predt\u00fdm, ako spust\u00edme nie\u010do nov\u00e9, rob\u00edme monitoring a a\u017e potom to sp\u00fa\u0161\u0165ame. V tomto pr\u00edpade sa n\u00e1\u0161 monitoring st\u00e1va norm\u00e1lnym testovan\u00edm. A existuje v\u00fdvoj prostredn\u00edctvom monitorovania. Takmer v\u0161etci hovoria, \u017ee je to zd\u013ahav\u00e9, m\u00e1m leniv\u00fd pocit, vytvoril som do\u010dasn\u00fd koncept. Ak sme urobili monitoring spr\u00e1vne, ch\u00e1peme stav CI syst\u00e9mu. A v CI syst\u00e9me je ve\u013ea monitorovania. Ch\u00e1peme stav syst\u00e9mu a vieme, \u010do sa v \u0148om deje. Po\u010das v\u00fdvoja vytv\u00e1rame syst\u00e9m tak, aby dospel do po\u017eadovan\u00e9ho stavu.<\/em> <\/p>\n<p><\/p>\n<p><em>Tieto praktiky s\u00fa zn\u00e1me u\u017e d\u00e1vno. Diskutovali sme o tom pred asi 4 rokmi. Ale za 4 roky sa takmer ni\u010d nezmenilo.<\/em> <\/p>\n<p><\/p>\n<p><em>Na t\u00fato pozn\u00e1mku navrhujem ukon\u010di\u0165 ofici\u00e1lnu diskusiu.<\/em><\/p>\n<p><\/p>\n<p>Video (vlo\u017een\u00e9 ako medi\u00e1lny prvok, ale nefunguje):<\/p>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/zZ3qXVN3Oic\">https:\/\/youtu.be\/zZ3qXVN3Oic<\/a><\/noindex><br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/518406\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041e\u0431\u0441\u0443\u0434\u0438\u043c \u043f\u043e\u0447\u0435\u043c\u0443 CI-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438 CI \u2013 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u043e\u0435. \u041a\u0430\u043a\u0443\u044e \u0431\u043e\u043b\u044c CI \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0438\u0434\u0435\u044f, \u043a\u0430\u043a\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0447\u0442\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u0430\u043a \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 Jenkins. \u041c\u044b\u0441\u043b\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e Continuous Integration \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0435\u0449\u0435 \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434, \u043a\u043e\u0433\u0434\u0430 \u044f \u0445\u043e\u0434\u0438\u043b \u043f\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0438\u0441\u043a\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443. \u041f\u043e\u043e\u0431\u0449\u0430\u043b\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":93886,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-93885","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=\"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\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\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\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov\" \/>\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-09-10T17:42:23+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-10T17:42:23+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\udd47Continuous Integration ako prax, a nie Jenkins. Andrej Alexandrov | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","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\udd47Continuous Integration \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u0430 \u043d\u0435 Jenkins. \u0410\u043d\u0434\u0440\u0435\u0439 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u043e\u0432 | ProHoster","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","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-09-10T17:42:23+00:00","article:modified_time":"2020-09-10T17:42:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"93885","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 11:37:31","updated":"2022-09-27 15:57:30","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\/93885","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=93885"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/93885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/93886"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=93885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=93885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=93885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}