{"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\/cs\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","title":{"rendered":"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/ed8a32ae63b8dccfc8b4893ab27f1527.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Probereme, pro\u010d jsou CI n\u00e1stroje a CI zcela odli\u0161n\u00e9 v\u011bci.<\/p>\n<p><\/p>\n<p>Jak\u00fd probl\u00e9m m\u00e1 CI \u0159e\u0161it, odkud n\u00e1pad poch\u00e1z\u00ed, jak\u00e9 jsou posledn\u00ed d\u016fkazy o tom, \u017ee to funguje, jak pochopit, \u017ee m\u00e1te skute\u010dnou praxi a ne pouze nainstalovan\u00fd Jenkins.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>N\u00e1pad ud\u011blat prezentaci o Continuous Integration p\u0159i\u0161el u\u017e p\u0159ed rokem, kdy\u017e jsem chodil na pohovory a hledal pr\u00e1ci. Mluvil jsem s 10-15 spole\u010dnostmi, z nich\u017e jen jedna dok\u00e1zala srozumiteln\u011b odpov\u011bd\u011bt, co to CI je, a vysv\u011btlit, jak pochopili, \u017ee to u nich chyb\u00ed. Ostatn\u00ed jen hl\u00e1sali nesmysly o Jenkinsu \ud83d\ude42 No m\u00e1me Jenkins, d\u011bl\u00e1 buildy, CI! Na prezentaci se pokus\u00edm vysv\u011btlit, co vlastn\u011b Continuous Integration je a pro\u010d Jenkins a podobn\u00e9 n\u00e1stroje maj\u00ed k tomu velmi slab\u00fd vztah.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/a57813a652c0d788e5a927dc8a7130ba.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A co obvykle \u010dlov\u011bku p\u0159ijde na mysl, kdy\u017e sly\u0161\u00ed CI? V\u011bt\u0161in\u011b lidem se vybav\u00ed Jenkins, Gitlab CI, Travis atd.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c9799c11ba7bb7bbdb2048c2f314b22a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>I kdy\u017e vyhled\u00e1me, zobraz\u00ed se n\u00e1m tyto n\u00e1stroje.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/028ef088b28b73e7905b1666d9d53d1b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pokud se pt\u00e1te zn\u00e1m\u00fdch, hned po vyjmenov\u00e1n\u00ed n\u00e1stroj\u016f v\u00e1m vysv\u011btl\u00ed, \u017ee CI je, kdy\u017e se v Pull Requestu pro commit prov\u00e1d\u00ed build a testy.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli 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 nen\u00ed o n\u00e1stroj\u00edch, nen\u00ed o buildov\u00e1n\u00ed a testech ve v\u011btvi! Continuous Integration je praxe velmi \u010dast\u00e9 integrace nov\u00e9ho k\u00f3du a k jej\u00edmu pou\u017eit\u00ed v\u016fbec nen\u00ed nutn\u00e9 budovat Jenkinsy, GitLaby a podobn\u011b.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/c3a12b4a875050550b42714607e787c7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ne\u017e se pod\u00edv\u00e1me na to, jak vypad\u00e1 plnohodnotn\u00fd CI, poj\u010fme se nejprve pono\u0159it do kontextu lid\u00ed, kte\u0159\u00ed to vymysleli, a pro\u017e\u00edt bolest, kterou se sna\u017eili vy\u0159e\u0161it.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/2ab9c0f4dba2887fed5744c8b021b424.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A \u0159e\u0161ili bolest spolupr\u00e1ce v t\u00fdmu!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/11a5f3b1075f8b8d0f169fe07adf6c91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Poj\u010fme se pod\u00edvat na p\u0159\u00edklady, s jak\u00fdmi obt\u00ed\u017eemi se v\u00fdvoj\u00e1\u0159i pot\u00fdkaj\u00ed p\u0159i t\u00fdmov\u00e9m v\u00fdvoji. M\u00e1me projekt, master v\u011btev v gitu a dva v\u00fdvoj\u00e1\u0159e.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/8138a52376e87239ff5f7b0af5cd8fee.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A za\u010dali pracovat jako v\u0161ichni, na co jsou zvykl\u00ed. Vzali \u00fakol v JIRA, zalo\u017eili feature branch a p\u00ed\u0161\u00ed k\u00f3d.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/54720c40d9bbd9631b411a2a26c4083f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jeden dokon\u010dil funkci d\u0159\u00edve a slou\u010dil do masteru.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli 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 zabralo v\u00edce \u010dasu, slou\u010dil se pozd\u011bji a dostal konflikt. Te\u010f m\u00edsto toho, aby psal pot\u0159ebn\u00e9 funkce pro byznys, tr\u00e1v\u00ed v\u00fdvoj\u00e1\u0159 sv\u016fj \u010das a \u00fasil\u00ed \u0159e\u0161en\u00edm konflikt\u016f.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli 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 slo\u017eit\u011bj\u0161\u00ed je spojit svou funkci se spole\u010dn\u00fdm masterem, t\u00edm v\u00edce \u010dasu na to pot\u0159ebujeme. A to jsem uk\u00e1zal je\u0161t\u011b docela jednoduch\u00fd p\u0159\u00edklad. To je p\u0159\u00edklad, kde jsou v\u00fdvoj\u00e1\u0159i jen dva. A p\u0159edstavte si, pokud 10, 15 nebo 100 lid\u00ed ve firm\u011b p\u00ed\u0161e do jednoho repozit\u00e1\u0159e. Zbl\u00e1znili byste se, kdy\u017e byste m\u011bli vy\u0159e\u0161it v\u0161echny tyto konflikty. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli 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 jin\u00fd p\u0159\u00edpad. M\u00e1me mastera a n\u011bkolik v\u00fdvoj\u00e1\u0159\u016f, kte\u0159\u00ed n\u011bco d\u011blaj\u00ed.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/21b78ad8d0cb7cb5bded6ef9d49707c5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vytvo\u0159ili si ka\u017ed\u00fd v\u011btev.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/b85d8aa0080f08c1ad8ad83f3a9ab084.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jeden se slou\u010dil, v\u0161e bylo v po\u0159\u00e1dku, splnil \u00fakol.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli 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\u00e1\u0159 mezit\u00edm splnil sv\u016fj \u00fakol. \u0158ekn\u011bme, \u017ee ho dal na revizi. Ve mnoha firm\u00e1ch existuje praxe \u2013 revize. Na jedn\u00e9 stran\u011b je to dobr\u00e1 a u\u017eite\u010dn\u00e1 praxe, na druh\u00e9 stran\u011b n\u00e1s to v mnoha ohledech zpomaluje. Nezab\u00edhejme do toho, ale je to v\u00fdborn\u00fd p\u0159\u00edklad, kam m\u016f\u017ee v\u00e9st \u0161patn\u00e1 historie s revizemi. Dal jste pull request na revizi. V\u00fdvoj\u00e1\u0159 nem\u00e1 u\u017e co d\u011blat. Co za\u010dne d\u011blat? Za\u010dne br\u00e1t dal\u0161\u00ed \u00fakoly. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/7b8e121be99432606056acf11e20f518.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Za tu dobu druh\u00fd v\u00fdvoj\u00e1\u0159 je\u0161t\u011b n\u011bco stihl ud\u011blat. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/ceaa5ba5b3b5014fad527362f5794e94.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prvn\u00ed splnil t\u0159et\u00ed \u00fakol. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli 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 del\u0161\u00ed dob\u011b bylo jeho revize zkontrolov\u00e1no a pokou\u0161\u00ed se slou\u010dit. A co se stane? Chyt\u00e1 obrovsk\u00e9 mno\u017estv\u00ed konflikt\u016f. Pro\u010d? Proto\u017ee zat\u00edmco jeho pull request visel na revizi, v k\u00f3du u\u017e se hodn\u011b zm\u011bnilo. <\/p>\n<p><\/p>\n<p>Krom\u011b historie konflikt\u016f existuje i p\u0159\u00edb\u011bh s komunikac\u00ed. Dokud m\u00e1 va\u0161e v\u011btev vis\u00edc\u00ed na revizi, dokud n\u011bco \u010dek\u00e1, dokud dlouho vyv\u00edj\u00edte funkci, p\u0159est\u00e1v\u00e1te sledovat, co se je\u0161t\u011b m\u011bn\u00ed v k\u00f3dov\u00e9 z\u00e1kladn\u011b va\u0161eho servisu. Mo\u017en\u00e1, \u017ee to, co te\u010f se sna\u017e\u00edte vy\u0159e\u0161it, ji\u017e v\u010dera vy\u0159e\u0161ili a m\u016f\u017eete vz\u00edt a znovu pou\u017e\u00edt n\u011bjakou metodu. Ale to neuvid\u00edte, proto\u017ee v\u017edy pracujete se zastaralou v\u011btv\u00ed. A tato zastaral\u00e1 v\u011btev v\u017edy vede k tomu, \u017ee budete muset \u0159e\u0161it merge konflikt. <\/p>\n<p><\/p>\n<p>Vych\u00e1z\u00ed to tak, \u017ee pokud pracujeme v t\u00fdmu, tj. pokud v repozit\u00e1\u0159i nepracuje jen jedna osoba, ale 5-10 lid\u00ed, t\u00edm d\u00e9le nebudeme p\u0159id\u00e1vat sv\u016fj k\u00f3d do masteru, t\u00edm v\u00edce trp\u00edme t\u00edm, \u017ee nakonec mus\u00edme n\u011bco slou\u010dit. A \u010d\u00edm v\u00edce m\u00e1me konflikt\u016f a \u010d\u00edm star\u0161\u00ed verzi pou\u017e\u00edv\u00e1me, t\u00edm v\u00edce m\u00e1me probl\u00e9m\u016f.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/55c070f65a4d3838fb8c02bb9684c76b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Spole\u010dn\u011b n\u011bco d\u011blat \u2013 to je bolest! V\u017edy si navz\u00e1jem p\u0159ek\u00e1\u017e\u00edme. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli 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 se upozor\u0148ovalo p\u0159ed v\u00edce ne\u017e 20 lety. Prvn\u00ed zm\u00ednka o praxi Continuous Integration se na\u0161la v extr\u00e9mn\u00edm programov\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p>Extr\u00e9mn\u00ed programov\u00e1n\u00ed je prvn\u00ed agiln\u00ed framework. Str\u00e1nka se objevila v roce 96. Byla my\u0161lenka vyu\u017e\u00edvat ur\u010dit\u00e9 praktiky programov\u00e1n\u00ed, pl\u00e1nov\u00e1n\u00ed a podobn\u011b, aby v\u00fdvoj byl co nejflexibiln\u011bj\u0161\u00ed, abychom mohli rychleji reagovat na n\u011bjak\u00e9 zm\u011bny a po\u017eadavky na\u0161ich klient\u016f. A ji\u017e p\u0159ed 24 lety se za\u010dali pot\u00fdkat s t\u00edm, \u017ee pokud d\u011bl\u00e1te n\u011bco velmi dlouho a bokem, tr\u00e1v\u00edte t\u00edm v\u00edce \u010dasu, proto\u017ee m\u00e1te konflikty. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/93a80838bdb3b297557dbf2ac7587965.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nyn\u00ed si rozebere slovn\u00ed spojen\u00ed \u201eContinuous Integration\u201c po jednotliv\u00fdch slovech. Pokud bychom to p\u0159elo\u017eili doslovn\u011b, dost\u00e1v\u00e1me nep\u0159etr\u017eitou integraci. Ale jak moc je nep\u0159etr\u017eit\u00e1, to nen\u00ed \u00fapln\u011b jasn\u00e9, je to sp\u00ed\u0161e p\u0159eru\u0161ovan\u00e1. A tak\u00e9 nen\u00ed jasn\u00e9, jak moc je integration. <\/p>\n<p><\/p>\n<p>A proto v\u00e1m nyn\u00ed p\u0159in\u00e1\u0161\u00edm citace z extr\u00e9mn\u00edho programov\u00e1n\u00ed. Ob\u011b slova si rozebere jednotliv\u011b. <\/p>\n<p><\/p>\n<p>Integration \u2014 Jak jsem ji\u017e \u0159ekl, usilujeme o to, aby ka\u017ed\u00fd in\u017een\u00fdr pracoval s nejaktu\u00e1ln\u011bj\u0161\u00ed verz\u00ed k\u00f3du, aby co nej\u010dast\u011bji p\u0159id\u00e1val sv\u016fj k\u00f3d do hlavn\u00ed v\u011btve, aby to byly mal\u00e9 v\u011btve. Proto\u017ee pokud jsou velk\u00e9, m\u016f\u017eeme snadno uv\u00e1znout na t\u00fdden s merge konflikty. Obzvl\u00e1\u0161\u0165 kdy\u017e m\u00e1me dlouh\u00fd v\u00fdvojov\u00fd cyklus typu waterfall, kde v\u00fdvoj\u00e1\u0159 odejde na m\u011bs\u00edc k\u00f3dovat n\u011bjakou obrovskou funkci. A v etap\u011b integrace se m\u016f\u017ee zaseknout po velmi dlouhou dobu. <\/p>\n<p><\/p>\n<p>Integration \u2014 to je, kdy\u017e vezmeme svou v\u011btev a integrujeme ji s master, mergeujeme ji. Existuje ultim\u00e1tn\u00ed varianta, kdy transbase developer c\u00edl\u00edme na to, \u017ee hned p\u00ed\u0161eme do master bez jak\u00fdchkoli zbyte\u010dn\u00fdch v\u011btv\u00ed.<\/p>\n<p><\/p>\n<p>Obecn\u011b, integration \u2014 to je vz\u00edt sv\u016fj k\u00f3d a dostat ho do master. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/8950103e6a59ed7132ec321ac6abe600.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Co se zde mysl\u00ed slovem \u201econtinuous\u201c, co to vlastn\u011b znamen\u00e1 nep\u0159etr\u017eitost? Praxe znamen\u00e1, \u017ee v\u00fdvoj\u00e1\u0159 se sna\u017e\u00ed co nejrychleji integrovat sv\u016fj k\u00f3d. To je jeho c\u00edl p\u0159i vykon\u00e1v\u00e1n\u00ed jak\u00e9koliv \u00falohy \u2013 dostat sv\u016fj k\u00f3d do masteru co nejrychleji. V ide\u00e1ln\u00edm sv\u011bt\u011b by to v\u00fdvoj\u00e1\u0159i d\u011blali ka\u017ed\u00fdch p\u00e1r hodin. Tedy vezmete malou \u00falohu, slou\u010d\u00edte ji do masteru. V\u0161e je skv\u011bl\u00e9. O to usilujete. A to je t\u0159eba d\u011blat nep\u0159etr\u017eit\u011b. Jakmile n\u011bco ud\u011bl\u00e1te, hned to za\u0159ad\u00edte do masteru. <\/p>\n<p><\/p>\n<p>A v\u00fdvoj\u00e1\u0159, kter\u00fd n\u011bco d\u011bl\u00e1, nese odpov\u011bdnost za to, co ud\u011blal, aby to fungovalo a nic nezdokumentovalo. Zde obvykle vyvst\u00e1v\u00e1 ot\u00e1zka s testy. Chceme spustit n\u011bjak\u00e9 testy na na\u0161em commitu, na na\u0161em merge, abychom si byli jisti, \u017ee to funguje. A zde v\u00e1m m\u016f\u017ee pomoci Jenkins.<\/p>\n<p><\/p>\n<p>Ale pokud jde o my\u0161lenky: poj\u010fme, aby zm\u011bny byly mal\u00e9, a poj\u010fme, aby \u00falohy byly mal\u00e9, a poj\u010fme, abychom \u00falohu ud\u011blali a hned se sna\u017eili n\u011bjak ji slou\u010dit do masteru \u2013 tady v\u00e1m \u017e\u00e1dn\u00fd Jenkins nepom\u016f\u017ee. Proto\u017ee Jenkins v\u00e1m pom\u016f\u017ee v\u00fdhradn\u011b spustit testy. <\/p>\n<p><\/p>\n<p>M\u016f\u017eete se obej\u00edt i bez nich. To v\u00e1m nijak nep\u0159ek\u00e1\u017e\u00ed. Proto\u017ee c\u00edlem praxe je slu\u010dovat se co nej\u010dast\u011bji, abyste nepl\u00fdtvali obrovsk\u00fdm mno\u017estv\u00edm \u010dasu na n\u011bjak\u00e9 konflikty v budoucnosti. <\/p>\n<p><\/p>\n<p>P\u0159edstavme si, \u017ee m\u00e1me rok 2020, a z n\u011bjak\u00e9ho d\u016fvodu bez internetu. A pracujeme lok\u00e1ln\u011b. Nem\u00e1me Jenkins. To je v po\u0159\u00e1dku. St\u00e1le si m\u016f\u017eete vytvo\u0159it lok\u00e1ln\u00ed v\u011btev. Napsali jste n\u011bjak\u00fd k\u00f3d. \u00dakol jste splnili za 3-4 hodinky. P\u0159epnuli jste se na master, ud\u011blali git pull, slou\u010dili tam svou v\u011btev. Hotovo. Pokud to d\u011bl\u00e1te \u010dasto \u2013 gratuluji, m\u00e1te Continuous Integration!<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/1f2117b65994b940edb04e0e119f6e8a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak\u00e9 jsou v sou\u010dasn\u00e9m sv\u011bt\u011b d\u016fkazy, \u017ee na to stoj\u00ed za to vynalo\u017eit s\u00edly? Proto\u017ee celkov\u011b je to obt\u00ed\u017en\u00e9. Pokud se pokus\u00edte takto pracovat, zjist\u00edte, \u017ee se nyn\u00ed budete muset v\u011bnovat n\u011bjak\u00e9mu pl\u00e1nov\u00e1n\u00ed, budete muset v\u00edce \u010dasu v\u011bnovat dekompozici \u00faloh. Proto\u017ee pokud budete d\u011blat velk\u00e9 \u00fakoly, nebudete se moci rychle slou\u010dit a tud\u00ed\u017e se dostanete do nesn\u00e1z\u00ed. Praktiky u\u017e m\u00edt nebudete. <\/p>\n<p><\/p>\n<p>A to bude drah\u00e9. Hned od z\u00edt\u0159ka nebude mo\u017en\u00e9 pracovat s Continuous Integration. V\u0161ichni si na to budete velmi dlouho zvykat, velmi dlouho se budete u\u010dit, jak rozd\u011blovat \u00fakoly, velmi dlouho se budete p\u0159eu\u010dovat na praxi revize, pokud ji m\u00e1te. Na\u0161\u00edm c\u00edlem je, aby se to dnes slou\u010dilo. A pokud d\u011bl\u00e1te revizi po dobu t\u0159\u00ed dn\u016f, m\u00e1te probl\u00e9my a Continuous Integration nem\u00e1te. <\/p>\n<p><\/p>\n<p>Ale m\u00e1me n\u011bjak\u00e9 aktu\u00e1ln\u00ed d\u016fkazy, kter\u00e9 n\u00e1m \u0159\u00edkaj\u00ed, \u017ee investovat do t\u00e9to praxe m\u00e1 smysl?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/2026a8f1d72fb05613511e7bab57e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Prvn\u00ed, co m\u011b napadlo, je State of DevOps. Je to v\u00fdzkum, kter\u00fd lid\u00e9 prov\u00e1d\u011bj\u00ed ji\u017e 7 let. Te\u010f to d\u011blaj\u00ed jako nez\u00e1visl\u00e1 organizace, ale pod Google.<\/p>\n<p><\/p>\n<p>A jejich v\u00fdzkum v roce 2018 uk\u00e1zal korelaci mezi spole\u010dnostmi, kter\u00e9 se sna\u017e\u00ed pou\u017e\u00edvat kr\u00e1tkodob\u00e9 v\u011btve, kter\u00e9 se rychle integruj\u00ed a \u010dasto integruj\u00ed, a maj\u00ed lep\u0161\u00ed v\u00fdsledky v\u00fdkonnosti IT.<\/p>\n<p><\/p>\n<p>Jak\u00e9 jsou to ukazatele? Jsou to 4 metriky, kter\u00e9 shroma\u017e\u010fuj\u00ed ze v\u0161ech spole\u010dnost\u00ed v jejich dotazn\u00edc\u00edch: frekvence nasazen\u00ed, doba pot\u0159ebn\u00e1 na zm\u011bny, doba na obnovu slu\u017eeb, m\u00edra selh\u00e1n\u00ed zm\u011bn.<\/p>\n<p><\/p>\n<p>A za prv\u00e9, je zde tato korelace, v\u00edme, \u017ee spole\u010dnosti, kter\u00e9 se \u010dasto slu\u010duj\u00ed, maj\u00ed tyto metriky mnohem lep\u0161\u00ed. A maj\u00ed rozd\u011blen\u00ed spole\u010dnost\u00ed do n\u011bkolika kategori\u00ed: jsou to pomal\u00e9 spole\u010dnosti, kter\u00e9 produkuj\u00ed n\u011bco pomalu, st\u0159edn\u00ed v\u00fdkonnost, vysok\u00e1 v\u00fdkonnost a elita. Elita \u2013 to jsou Netflix, Amazon, kte\u0159\u00ed jsou velmi rychl\u00ed, v\u0161echno d\u011blaj\u00ed rychle, kr\u00e1sn\u011b a kvalitn\u011b.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli 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 v\u011bc, kter\u00e1 se stala p\u0159ed m\u011bs\u00edcem. V Technology Radar se objevila skv\u011bl\u00e1 pozn\u00e1mka o Gitflow. Gitflow se li\u0161\u00ed od v\u0161ech ostatn\u00edch t\u00edm, \u017ee jeho v\u011btve \u017eij\u00ed dlouho. Existuj\u00ed release v\u011btve, kter\u00e9 \u017eij\u00ed dlouho, a feature v\u011btve, kter\u00e9 tak\u00e9 \u017eij\u00ed dlouho. Tato praxe v Technology Radar byla p\u0159e\u0159azena do HOLD. Pro\u010d? Proto\u017ee lid\u00e9 se pot\u00fdkaj\u00ed s bolest\u00ed integrace. <\/p>\n<p><\/p>\n<p>Pokud va\u0161e v\u011btev \u017eije velmi dlouho, zasekne se, ztrat\u00ed se, za\u010d\u00edn\u00e1me tr\u00e1vit v\u00edce \u010dasu na tom, abychom do n\u00ed provedli n\u011bjakou zm\u011bnu. <\/p>\n<p><\/p>\n<p>A ned\u00e1vno autor Gitflow uvedl, \u017ee pokud se sna\u017e\u00edte o Continuous Integration a chcete prov\u00e1d\u011bt integrace co nej\u010dast\u011bji, Gitflow nen\u00ed dobr\u00fd n\u00e1pad. Ve sv\u00e9 \u010dl\u00e1nku tak\u00e9 poznamenal, \u017ee pokud m\u00e1te backend, kde se k tomu m\u016f\u017eete p\u0159ibl\u00ed\u017eit, Gitflow pro v\u00e1s nen\u00ed nutn\u00fd, proto\u017ee v\u00e1s zpomal\u00ed a p\u0159inese v\u00e1m probl\u00e9my s integrac\u00ed. <\/p>\n<p><\/p>\n<p>To neznamen\u00e1, \u017ee Gitflow je \u0161patn\u00fd a nem\u011bli byste ho pou\u017e\u00edvat. Je vhodn\u00fd pro jin\u00e9 p\u0159\u00edpady. Nap\u0159\u00edklad kdy\u017e pot\u0159ebujete udr\u017eovat v\u00edce verz\u00ed slu\u017eby \u010di aplikace, tedy kdy\u017e pot\u0159ebujete poskytovat podporu po del\u0161\u00ed dobu. <\/p>\n<p><\/p>\n<p>Ale pokud se zept\u00e1te lid\u00ed, kte\u0159\u00ed takov\u00e9 slu\u017eby podporuj\u00ed, usly\u0161\u00edte spoustu bolesti ohledn\u011b toho, \u017ee verze byla 3.2, kter\u00e1 byla p\u0159ed 4 m\u011bs\u00edci, a tento oprava se do n\u00ed nedostala, a nyn\u00ed, abyste ji p\u0159idali, mus\u00edte ud\u011blat spoustu zm\u011bn. A tak se znovu ocitaj\u00ed v patov\u00e9 situaci, kdy t\u00fddny bojuj\u00ed s t\u00edm, aby vzali a slou\u010dili n\u011bjakou novou funkci. <\/p>\n<p><\/p>\n<p>Jak spr\u00e1vn\u011b poznamenal Alexander Kovalev v chatu, korelace neznamen\u00e1 kauz\u00e1ln\u00ed vztah. To je pravda. Jen proto, \u017ee m\u00e1te Continuous Integration, neznamen\u00e1, \u017ee v\u0161echny metriky budou skv\u011bl\u00e9. Existuje ale pozitivn\u00ed korelace, \u017ee pokud je jedno, pravd\u011bpodobn\u011b je i druh\u00e9. Nen\u00ed to jist\u00e9, ale pravd\u011bpodobn\u00e9. Je to jen korelace. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Kontinu\u00e1ln\u00ed integrace jako praxe, nikoli Jenkins. Andrej Alexandrov\" src=\"\/wp-content\/uploads\/2020\/09\/d5fc050550b0e9f86a1fdf85fff32fa5.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Zd\u00e1 se, \u017ee u\u017e n\u011bco d\u011bl\u00e1me, vypad\u00e1 to, \u017ee u\u017e se slu\u010dujeme, ale jak zjistit, \u017ee m\u00e1me Continuous Integration, \u017ee se slu\u010dujeme dostate\u010dn\u011b \u010dasto?<\/p>\n<p><\/p>\n<p>Jez Humble je autorem Handbook, Accelerate, webu Continuous Delivery a knihy \u201eContinuous Delivery\u201c. Navrhuje takov\u00fd test:<\/p>\n<p><\/p>\n<ul>\n<li>K\u00f3d in\u017een\u00fdra se dost\u00e1v\u00e1 do masteru ka\u017ed\u00fd den. <\/li>\n<li>Na ka\u017ed\u00fd commit spou\u0161t\u00edte unit testy.<\/li>\n<li>Build v masteru spadl, opravil se p\u0159ibli\u017en\u011b za 10 minut.<\/li>\n<\/ul>\n<p><\/p>\n<p>Navrhuje pou\u017e\u00edt takov\u00fd test, abyste se ujistili, \u017ee tuto praxi opravdu m\u00e1te. <\/p>\n<p><\/p>\n<p>To posledn\u00ed pova\u017euji za pon\u011bkud sporn\u00e9. Tj. pokud to m\u016f\u017eete opravit za 10 minut, znamen\u00e1 to, \u017ee m\u00e1te Continuous Integration, to mi zn\u00ed pon\u011bkud divn\u011b, ale d\u00e1v\u00e1 to smysl. Pro\u010d? Proto\u017ee pokud se m\u00edch\u00e1te \u010dasto, znamen\u00e1 to, \u017ee va\u0161e zm\u011bny jsou drobn\u00e9. Pokud mal\u00e1 zm\u011bna zp\u016fsob\u00ed, \u017ee se v\u00e1m rozpadne build mastera, m\u016f\u017eete rychle naj\u00edt p\u0159\u00edklad, proto\u017ee zm\u011bna je mali\u010dk\u00e1. M\u011bli jste mal\u00fd merge, ve kter\u00e9m se zm\u011bnilo 20\u201330 \u0159\u00e1dk\u016f. A odpov\u00eddaj\u00edc\u00edm zp\u016fsobem m\u016f\u017eete rychle pochopit, v \u010dem byl probl\u00e9m, proto\u017ee zm\u011bny jsou drobn\u00e9, m\u00e1te velmi malou oblast hled\u00e1n\u00ed probl\u00e9mu. <\/p>\n<p><\/p>\n<p>A i kdy\u017e se n\u00e1m po vyd\u00e1n\u00ed rozpadne prod, pokud m\u00e1me praxi Continuous Integration, je pro n\u00e1s mnohem snaz\u0161\u00ed jednat, proto\u017ee zm\u011bny jsou drobn\u00e9. Ano, to ovlivn\u00ed pl\u00e1nov\u00e1n\u00ed. Bude to bolet. A asi nejv\u011bt\u0161\u00ed probl\u00e9m v t\u00e9to praxi spo\u010d\u00edv\u00e1 v tom, zvyknout si rozd\u011blit \u00fakoly, tj. jak ud\u011blat n\u011bco za p\u00e1r hodin a z\u00e1rove\u0148 proj\u00edt reviz\u00ed, pokud ji m\u00e1te. Revize je samostatn\u00e1 bolest. <\/p>\n<p><\/p>\n<p>Unit testy jsou prost\u011b pomocn\u00edk, kter\u00fd v\u00e1m pom\u00e1h\u00e1 pochopit, zda va\u0161e integrace prob\u011bhla \u00fasp\u011b\u0161n\u011b, zda se nic nezlomilo. Podle m\u011b to nen\u00ed \u00fapln\u011b povinn\u00fd bod, proto\u017ee smyslem praxe to nen\u00ed. <\/p>\n<p><\/p>\n<p>To je stru\u010dn\u00e9 shrnut\u00ed o Continuous Integration. To je v\u0161echno, co v t\u00e9to praxi existuje. Jsem p\u0159ipraven na ot\u00e1zky. <\/p>\n<p><\/p>\n<p>Stru\u010dn\u011b je\u0161t\u011b jednou shrnu:<\/p>\n<p><\/p>\n<ul>\n<li>Continuous Integration \u2013 to nen\u00ed Jenkins, to nen\u00ed Gitlab.<\/li>\n<li>To nen\u00ed n\u00e1stroj, je to praxe, \u017ee co nej\u010dast\u011bji m\u00edch\u00e1me n\u00e1\u0161 k\u00f3d do masteru. <\/li>\n<li>D\u011bl\u00e1me to, abychom se vyhnuli obrovsk\u00e9 bolesti, kter\u00e1 vznik\u00e1 s m\u00edch\u00e1n\u00edm v budoucnu, tj. nyn\u00ed za\u017e\u00edv\u00e1me malou bolest, abychom se vyhnuli velk\u00e9 v budoucnosti. V tom je cel\u00fd smysl. <\/li>\n<li>Z pohledu proch\u00e1z\u00ed komunikace prost\u0159ednictv\u00edm k\u00f3du, ale to velmi vz\u00e1cn\u011b vid\u00edm, ale pro to byla tak\u00e9 zam\u00fd\u0161lena.<\/li>\n<\/ul>\n<p><\/p>\n<p><strong>Ot\u00e1zky<\/strong><\/p>\n<p><\/p>\n<p><em>Co d\u011blat s nedekomponovan\u00fdmi \u00fakoly?<\/em><\/p>\n<p><\/p>\n<p>Dekomponovat. V \u010dem je probl\u00e9m? M\u016f\u017eete uv\u00e9st p\u0159\u00edklad, \u017ee je \u00fakol a ten nen\u00ed dekomponovateln\u00fd?<\/p>\n<p><\/p>\n<p><em>Existuj\u00ed takov\u00e9 \u00fakoly, kter\u00e9 nelze dekomponovat, od slova \"v\u016fbec\", nap\u0159\u00edklad ty, kter\u00e9 vy\u017eaduj\u00ed velmi hlubokou odbornost a kter\u00e9 mohou b\u00fdt skute\u010dn\u011b \u0159e\u0161eny po m\u011bs\u00edci, ne\u017e dos\u00e1hnou n\u011bjak\u00e9ho p\u0159ijateln\u00e9ho v\u00fdsledku.<\/em> <\/p>\n<p><\/p>\n<p>Pokud jsem t\u011b spr\u00e1vn\u011b pochopil, existuje n\u011bjak\u00fd velk\u00fd a slo\u017eit\u00fd \u00fakol, jeho\u017e v\u00fdsledek uvid\u00edme a\u017e za m\u011bs\u00edc?<\/p>\n<p><\/p>\n<p><em>Ano, je to spr\u00e1vn\u011b. V\u00fdsledek budeme moci posoudit nejd\u0159\u00edve za m\u011bs\u00edc.<\/em> <\/p>\n<p><\/p>\n<p>Dob\u0159e. To obecn\u011b nen\u00ed probl\u00e9m. Pro\u010d? Proto\u017ee v tomto p\u0159\u00edpad\u011b, kdy\u017e mluv\u00edme o v\u011btv\u00edch, nemluv\u00edme o v\u011btvi s funkc\u00ed. Funkce mohou b\u00fdt velk\u00e9 a slo\u017eit\u00e9. Mohou se t\u00fdkat mnoha komponent\u016f. A mo\u017en\u00e1 je nem\u016f\u017eeme ud\u011blat zcela v jedn\u00e9 v\u011btvi. To je v po\u0159\u00e1dku. Mus\u00edme tuto z\u00e1le\u017eitost jen rozd\u011blit. Pokud funkce nen\u00ed \u00fapln\u011b hotov\u00e1, neznamen\u00e1 to, \u017ee n\u011bkter\u00e9 \u010d\u00e1sti jej\u00edho k\u00f3du nelze slou\u010dit. \u0158ekn\u011bme, \u017ee jsi p\u0159idal migraci a uvnit\u0159 funkce jsou n\u011bjak\u00e9 f\u00e1ze. Nap\u0159\u00edklad m\u00e1\u0161 f\u00e1zi \u2013 ud\u011blat migraci, p\u0159idat novou metodu. A tyto v\u011bci u\u017e m\u016f\u017ee\u0161 slou\u010dit denn\u011b. <\/p>\n<p><\/p>\n<p><em>Dob\u0159e. Jak\u00fd m\u00e1 tedy smysl?<\/em><\/p>\n<p><\/p>\n<p>Jak\u00fd m\u00e1 smysl slou\u010dit mal\u00e9 v\u011bci denn\u011b?<\/p>\n<p><\/p>\n<p><em>Ano.<\/em><\/p>\n<p><\/p>\n<p>Pokud ti n\u011bco rozbilo, vid\u00ed\u0161 to hned. M\u00e1\u0161 mal\u00fd kousek, kter\u00fd n\u011bco rozbil, a je snaz\u0161\u00ed to opravit. Smysl je v tom, \u017ee slou\u010dit mal\u00fd kousek te\u010f je mnohem snaz\u0161\u00ed ne\u017e slou\u010dit n\u011bco velk\u00e9ho za n\u011bkolik t\u00fddn\u016f. A t\u0159et\u00ed smysl je v tom, \u017ee ostatn\u00ed in\u017een\u00fd\u0159i budou pracovat s aktu\u00e1ln\u00ed verz\u00ed k\u00f3du. Uvid\u00ed, \u017ee tady byly p\u0159id\u00e1ny n\u011bjak\u00e9 migrace a tady se objevila n\u011bjak\u00e1 metoda, kterou mohou tak\u00e9 cht\u00edt pou\u017e\u00edt. V\u0161ichni uvid\u00ed, co se v k\u00f3du d\u011bje. Pr\u00e1v\u011b kv\u016fli t\u011bmto t\u0159em d\u016fvod\u016fm se tato praxe d\u011bl\u00e1. <\/p>\n<p><\/p>\n<p><em>D\u011bkuji, ot\u00e1zka je uzav\u0159ena!<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg Soroka) M\u016f\u017eu se p\u0159idat? \u0158ekl jsi to spr\u00e1vn\u011b, chci jen p\u0159idat jednu v\u011btu.<\/em><\/p>\n<p><\/p>\n<p>Tak.<\/p>\n<p><\/p>\n<p><em>P\u0159i Continuous Integration se k\u00f3d slu\u010duje do hlavn\u00ed v\u011btve ne tehdy, kdy\u017e je funkce \u00fapln\u011b hotov\u00e1, ale tehdy, kdy\u017e se zastavil rozpad buildu. A nebojte se commitovat do masteru, kolikr\u00e1t chcete za den. Druh\u00fd aspekt \u2013 pokud z n\u011bjak\u00e9ho d\u016fvodu nem\u016f\u017eete rozd\u011blit m\u011bs\u00ed\u010dn\u00ed \u00fakol na \u00fakoly alespo\u0148 po t\u0159ech dnech, nemluv\u011b o t\u0159ech hodin\u00e1ch, m\u00e1te obrovsk\u00fd probl\u00e9m. A skute\u010dnost, \u017ee nem\u00e1te Continuous Integration, je men\u0161\u00ed z t\u011bchto probl\u00e9m\u016f. To znamen\u00e1, \u017ee m\u00e1te probl\u00e9my s architekturou a in\u017een\u00fdrsk\u00e9 praktiky jsou na nule. Proto\u017ee i kdy\u017e jde o v\u00fdzkum, je to stejn\u011b t\u0159eba prezentovat formou hypot\u00e9z nebo cykl\u016f.<\/em> <\/p>\n<p><\/p>\n<p><em>Hovo\u0159ili jsme o 4 metrik\u00e1ch, kter\u00e9 odd\u011bluj\u00ed \u00fasp\u011b\u0161n\u00e9 spole\u010dnosti od t\u011bch, co zaost\u00e1vaj\u00ed. Je\u0161t\u011b se mus\u00edme dostat k t\u011bmto 4 metrik\u00e1m. Pokud pr\u016fm\u011brn\u00e1 \u00faloha trv\u00e1 m\u011bs\u00edc, m\u011bl bych se nejprve soust\u0159edit na tuto metriku. Zkr\u00e1til bych ji nejprve na 3 dny. A a\u017e pot\u00e9 bych za\u010dal p\u0159em\u00fd\u0161let o Continuous.<\/em><\/p>\n<p><\/p>\n<p>Spr\u00e1vn\u011b t\u011b ch\u00e1pu, \u017ee si mysl\u00ed\u0161, \u017ee investice do in\u017een\u00fdrsk\u00fdch praktik, kdy\u017e m\u00e1\u0161 jakoukoli \u00falohu na m\u011bs\u00edc, zat\u00edm ned\u00e1v\u00e1 smysl?<\/p>\n<p><\/p>\n<p><em>M\u00e1\u0161 Continuous Integration. A tam je takov\u00e1 v\u011bc, \u017ee za 10 minut bu\u010f oprav\u00ed\u0161 chybu, nebo ji vr\u00e1t\u00ed\u0161 zp\u011bt. P\u0159edstav si, \u017ee jsi ji nasadil. Dokonce m\u00e1\u0161 i continuous deployment, nasadil jsi ji na prod a a\u017e pot\u00e9 sis v\u0161iml, \u017ee n\u011bco nefunguje. A mus\u00ed\u0161 ji vr\u00e1tit zp\u011bt, a u\u017e do\u0161lo k migraci datab\u00e1ze. U\u017e m\u00e1\u0161 sch\u00e9ma datab\u00e1ze v nov\u00e9 verzi, nav\u00edc u\u017e prob\u011bhla n\u011bjak\u00e1 z\u00e1loha, nav\u00edc byly zaps\u00e1ny n\u011bjak\u00e9 \u00fadaje.<\/em><\/p>\n<p><\/p>\n<p><em>A jakou alternativu m\u00e1\u0161? Pokud vrac\u00ed\u0161 k\u00f3d zp\u011bt, pak u\u017e nem\u016f\u017ee pracovat s touto aktualizovanou datab\u00e1z\u00ed.<\/em><\/p>\n<p><\/p>\n<p>Datab\u00e1ze se posouv\u00e1 pouze vp\u0159ed, ano. <\/p>\n<p><\/p>\n<p><em>Lid\u00e9, kte\u0159\u00ed maj\u00ed \u0161patnou in\u017een\u00fdrskou praxi, pravd\u011bpodobn\u011b ani ne\u010detli tlustou knihu o ... Co d\u011blat se z\u00e1lohou? Pokud se obnovuje\u0161 ze z\u00e1lohy, znamen\u00e1 to, \u017ee ztr\u00e1c\u00ed\u0161 data, kter\u00e1 byla shrom\u00e1\u017ed\u011bna od t\u00e9 doby. Nap\u0159\u00edklad jsi pracoval t\u0159i hodiny s novou verz\u00ed datab\u00e1ze, u\u017e se zaregistrovali u\u017eivatel\u00e9. Vr\u00e1t\u00ed\u0161 se k star\u00e9 z\u00e1loze, proto\u017ee se s novou verz\u00ed sch\u00e9ma nefunguje, \u010d\u00edm\u017e tyto u\u017eivatele ztrat\u00ed\u0161. A jsou nespokojen\u00ed, nad\u00e1vaj\u00ed.<\/em><\/p>\n<p><\/p>\n<p><em>Aby ovl\u00e1dli cel\u00fd soubor praktik podporuj\u00edc\u00edch Continuous Integration a Continuous Delivery, nesta\u010d\u00ed se pouze nau\u010dit programovat.... Za prv\u00e9, m\u016f\u017ee jich b\u00fdt velmi mnoho, co\u017e bude nepraktick\u00e9. Nav\u00edc jsou tu i dal\u0161\u00ed praktiky, jako je Scientific. Existuje takov\u00e1 praktika, kterou popularizoval GitHub. To se d\u011bje, kdy\u017e sou\u010dasn\u011b b\u011b\u017e\u00ed star\u00fd a nov\u00fd k\u00f3d. To je, kdy\u017e vytv\u00e1\u0159\u00edte nedokon\u010denou funkci, ale ta m\u016f\u017ee vracet n\u011bjakou hodnotu: bu\u010f jako funkci, nebo jako Rest API. Spou\u0161t\u00edte jak nov\u00fd k\u00f3d, tak star\u00fd k\u00f3d a porovn\u00e1v\u00e1te rozd\u00edl mezi nimi. A pokud je n\u011bjak\u00fd rozd\u00edl, logujete tuto ud\u00e1lost. T\u00edmto zp\u016fsobem v\u00edte, \u017ee va\u0161e nov\u00e1 funkce je p\u0159ipravena b\u00fdt nasazena na starou, pokud b\u011bhem ur\u010dit\u00e9 doby nedo\u0161lo k rozd\u00edlu mezi t\u011bmito dv\u011bma.<\/em> <\/p>\n<p><\/p>\n<p><em>Takov\u00fdch praktik jsou stovky. Doporu\u010dil bych za\u010d\u00edt s transbase development. Nen\u00ed to 100% o Continuous Integration, ale praktiky jsou stejn\u00e9, jedna bez druh\u00e9 \u0161patn\u011b \u017eije.<\/em> <\/p>\n<p><\/p>\n<p>Uvedl jsi transbase development jako p\u0159\u00edklad, kde se daj\u00ed vid\u011bt praktiky, nebo navrhuje\u0161 lidem za\u010d\u00edt pou\u017e\u00edvat transbase development?<\/p>\n<p><\/p>\n<p><em>Pod\u00edvat se, proto\u017ee pou\u017e\u00edvat je nebudou moci. Aby je mohli pou\u017e\u00edvat, je pot\u0159eba si mnoho v\u011bc\u00ed p\u0159e\u010d\u00edst. A kdy\u017e m\u00e1 \u010dlov\u011bk ot\u00e1zku: \u201eCo d\u011blat s funkc\u00ed, kter\u00e1 trv\u00e1 m\u011bs\u00edc\u201c, znamen\u00e1 to, \u017ee si ne\u010detl o transbase development. A j\u00e1 bych to zat\u00edm nedoporu\u010doval. Doporu\u010dil bych se zam\u011b\u0159it v\u00fdhradn\u011b na t\u00e9ma, jak spr\u00e1vn\u011b architektonicky rozd\u011blovat velk\u00e9 \u00fakoly na men\u0161\u00ed. V tom je podstata dekompozice.<\/em><\/p>\n<p><\/p>\n<p><em>Dekompozice je jedn\u00edm z n\u00e1stroj\u016f architekta. Nejprve d\u011bl\u00e1me anal\u00fdzu, pot\u00e9 dekompozici, pak synt\u00e9zu, a pak integraci. A t\u00edmto zp\u016fsobem n\u00e1m v\u0161e do sebe zapad\u00e1. A k Continuous Integration je t\u0159eba je\u0161t\u011b dosp\u011bt skrze dekompozici. Na prvn\u00ed etap\u011b se objevuj\u00ed ot\u00e1zky, a my u\u017e mluv\u00edme o \u010dtvrt\u00e9 etap\u011b, tj. \u010d\u00edm \u010dast\u011bji prov\u00e1d\u011bt integraci, t\u00edm l\u00e9pe. Je je\u0161t\u011b brzy na to, abychom ji prov\u00e1d\u011bli, nebylo by \u0161patn\u00e9 nejprve roz\u010dlenit sv\u016fj monolit.<\/em> <\/p>\n<p><\/p>\n<p><em>Je pot\u0159eba nakreslit n\u011bkolik \u0161ipek a \u010dtverc\u016f na n\u011bjak\u00e9m sch\u00e9matu. Nem\u016f\u017ee\u0161 \u0159\u00edct, \u017ee te\u010f uk\u00e1\u017eu architektonick\u00e9 sch\u00e9ma nov\u00e9 aplikace a uk\u00e1\u017eu jeden \u010dtverec, ve kter\u00e9m je zelen\u00e9 tla\u010d\u00edtko pro aplikaci. V ka\u017ed\u00e9m p\u0159\u00edpad\u011b bude v\u00edce \u010dtverc\u016f a \u0161ipek. Na jak\u00e9mkoli sch\u00e9matu, kter\u00e9 jsem vid\u011bl, jich bylo v\u00edce ne\u017e jeden. A dekompozice u\u017e na \u00farovni grafick\u00e9ho zobrazen\u00ed prob\u00edh\u00e1. Proto mohou b\u00fdt \u010dtverce nez\u00e1visl\u00e9. Pokud ne, m\u00e1m velk\u00e9 ot\u00e1zky k architektovi.<\/em> <\/p>\n<p><\/p>\n<p>Je ot\u00e1zka z chatu: \u201ePokud je revize povinn\u00e1 a trv\u00e1 dlouho, n\u011bkde den a v\u00edce?\u201c.<\/p>\n<p><\/p>\n<p>M\u00e1te probl\u00e9my s prax\u00ed. Revize by nem\u011bla trvat den a v\u00edce. To je p\u0159\u00edb\u011bh k p\u0159edchoz\u00ed ot\u00e1zce, jen trochu m\u011bk\u010d\u00ed. Pokud revize trv\u00e1 den, znamen\u00e1 to, \u017ee pravd\u011bpodobn\u011b jde o revizi n\u011bjak\u00e9 velmi velk\u00e9 zm\u011bny. To znamen\u00e1, \u017ee by se m\u011blo d\u011blat m\u00e9n\u011b. V transbase development, kter\u00e9 doporu\u010dil Oleg, existuje takov\u00e1 v\u011bc, kter\u00e1 se naz\u00fdv\u00e1 continuous review. Jej\u00ed my\u0161lenka je, \u017ee d\u011bl\u00e1me z\u00e1m\u011brn\u011b tak mal\u00e9 pull requesty, proto\u017ee se sna\u017e\u00edme neust\u00e1le slu\u010dovat a postupn\u011b. A proto pull request m\u011bn\u00ed jednu abstrakci nebo 10 \u0159\u00e1dk\u016f. D\u00edky tomu n\u00e1m revize zabere p\u00e1r minut. <\/p>\n<p><\/p>\n<p>Pokud revize trv\u00e1 den a v\u00edce, znamen\u00e1 to, \u017ee n\u011bco nen\u00ed v po\u0159\u00e1dku. Za prv\u00e9, mo\u017en\u00e1 m\u00e1te n\u011bjak\u00e9 probl\u00e9my s architekturou. Nebo se jedn\u00e1 o velk\u00fd kus k\u00f3du, nap\u0159\u00edklad na 1 000 \u0159\u00e1dk\u016f. Nebo m\u00e1te tak slo\u017eitou architekturu, \u017ee ji \u010dlov\u011bk nedok\u00e1\u017ee pochopit. To je probl\u00e9m trochu bokem, ale tak\u00e9 se s t\u00edm bude muset n\u011bco ud\u011blat. Mo\u017en\u00e1 v\u016fbec nen\u00ed pot\u0159eba revize. Nad t\u00edm byste m\u011bli tak\u00e9 p\u0159em\u00fd\u0161let. Revize je n\u011bco, co v\u00e1s brzd\u00ed. D\u00e1v\u00e1 sv\u00e9 v\u00fdhody celkov\u011b, ale mus\u00edte pochopit, pro\u010d to d\u011bl\u00e1te. Je to pro v\u00e1s zp\u016fsob, jak rychle p\u0159edat informace, je to v\u00e1\u0161 zp\u016fsob, jak stanovit uvnit\u0159 n\u011bjak\u00e9 standardy, nebo co? Pro\u010d to pot\u0159ebujete? Proto\u017ee revizi je pot\u0159eba d\u011blat bu\u010f velmi rychle, nebo ji \u00fapln\u011b zru\u0161it. Je to jako transbase development - velmi hezk\u00fd p\u0159\u00edb\u011bh, ale jen pro rozvinut\u00e9 lidi. <\/p>\n<p><\/p>\n<p>Pokud jde o 4 metriky, doporu\u010dil bych je p\u0159ece jenom odstranit, abychom pochopili, k \u010demu to vede. Pod\u00edvat se na \u010d\u00edsla, pod\u00edvat se na obr\u00e1zek, jak moc je to \u0161patn\u00e9. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Jsem p\u0159ipraven s tebou diskutovat o t\u00e9to z\u00e1le\u017eitosti. \u010c\u00edsla a metriky \u2013 to v\u0161e je skv\u011bl\u00e9, praxe je skv\u011bl\u00e1. Ale mus\u00edme pochopit, zda je to pro podnik\u00e1n\u00ed pot\u0159ebn\u00e9. Existuj\u00ed podniky, kter\u00e9 nepot\u0159ebuj\u00ed tak rychl\u00e9 zm\u011bny. Zn\u00e1m firmy, ve kter\u00fdch nen\u00ed mo\u017en\u00e9 prov\u00e1d\u011bt zm\u011bny ka\u017ed\u00fdch 15 minut. A ne proto, \u017ee by byly \u0161patn\u00e9. Je to takov\u00fd \u017eivotn\u00ed cyklus. A abyste mohli d\u011blat funkci branches, funkci toggle, pot\u0159ebujete hlubok\u00e9 znalosti.<\/em> <\/p>\n<p><\/p>\n<p>Je to slo\u017eit\u00e9. Pokud se chcete dozv\u011bd\u011bt v\u00edce o historii funkce toggle, doporu\u010duji to. <noindex><a rel=\"nofollow\" href=\"https:\/\/trunkbaseddevelopment.com\/\">https:\/\/trunkbaseddevelopment.com\/<\/a><\/noindex>. A existuje skv\u011bl\u00fd \u010dl\u00e1nek od Martina Fowlera o funkci toggle: o tom, jak\u00e9 typy existuj\u00ed, \u017eivotn\u00ed cykly atd. Funkce toggle \u2013 to je slo\u017eit\u00e9. <\/p>\n<p><\/p>\n<p><em>A p\u0159esto jsi neodpov\u011bd\u011bl na ot\u00e1zku: \u201eJe Jenkins pot\u0159eba nebo ne?\u201c<\/em><\/p>\n<p><\/p>\n<p>Jenkins ve skute\u010dnosti nen\u00ed pot\u0159eba. Pokud to mysl\u00edm v\u00e1\u017en\u011b, pak n\u00e1stroje: Jenkins, Gitlab v\u00e1m p\u0159inesou pohodl\u00ed. Uvid\u00edte, jestli se sestava povedla nebo ne. Mohou v\u00e1m pomoci, ale praktiku v\u00e1m nezajist\u00ed. Mohou v\u00e1m pouze d\u00e1t krou\u017eek \u2013 OK, ne OK. A to, pokud je\u0161t\u011b p\u00ed\u0161ete testy, proto\u017ee pokud nejsou testy, je to t\u00e9m\u011b\u0159 bezv\u00fdznamn\u00e9. Tak\u017ee je to pot\u0159eba, proto\u017ee \u2013 je to pohodln\u011bj\u0161\u00ed, ale celkov\u011b m\u016f\u017eete \u017e\u00edt i bez n\u011bj, moc neztrat\u00edte. <\/p>\n<p><\/p>\n<p><em>Tedy, pokud m\u00e1te praxe, znamen\u00e1 to, \u017ee ho nepot\u0159ebujete?<\/em><\/p>\n<p><\/p>\n<p>P\u0159esn\u011b tak. Doporu\u010duji test Jez Humble. Tam m\u00e1m dvoj\u00ed postoj k posledn\u00edmu bodu. Ale celkov\u011b, pokud m\u00e1te t\u0159i v\u011bci, neust\u00e1le se slu\u010dujete, spou\u0161t\u00edte testy na commity v masteru, rychle opravujete build v masteru, pak mo\u017en\u00e1 u\u017e nic jin\u00e9ho nepot\u0159ebujete. <\/p>\n<p><\/p>\n<p><em>Zat\u00edmco \u010dek\u00e1me na ot\u00e1zky od \u00fa\u010dastn\u00edk\u016f, m\u00e1m ot\u00e1zku. Hovo\u0159ili jsme o produktu k\u00f3du. Pou\u017e\u00edval jsi tak\u00e9 pro infrastrukturn\u00ed k\u00f3d? Je to stejn\u00fd k\u00f3d, m\u00e1 stejn\u00e9 principy a stejn\u00fd \u017eivotn\u00ed cyklus, nebo tam jsou jin\u00e9 \u017eivotn\u00ed cykly a principy? Obvykle, kdy\u017e v\u0161ichni mluv\u00ed o Continuous Integration a Development, zapom\u00ednaj\u00ed na to, \u017ee existuje tak\u00e9 infrastrukturn\u00ed k\u00f3d. A v posledn\u00ed dob\u011b ho p\u0159ib\u00fdv\u00e1. M\u011bli bychom tam p\u0159en\u00e9st v\u0161echna tato pravidla?<\/em><\/p>\n<p><\/p>\n<p>Ani ne to, \u017ee bychom m\u011bli, to by bylo skv\u011bl\u00e9, proto\u017ee to ur\u010dit\u011b usnadn\u00ed \u017eivot. Jakmile pracujeme s k\u00f3dem, ne se skripty na bash, ale m\u00e1me norm\u00e1ln\u00ed k\u00f3d.<\/p>\n<p><\/p>\n<p><em>Stop-stop, skript na bash \u2013 to je tak\u00e9 k\u00f3d. Nedot\u00fdkej se m\u00e9 star\u00e9 l\u00e1sky.<\/em> <\/p>\n<p><\/p>\n<p>Dob\u0159e, nebudu ti naru\u0161ovat vzpom\u00ednky. M\u00e1m k bash osobn\u00ed averzi. Neust\u00e1le se rozpad\u00e1, a to velmi nevzhledn\u011b a stra\u0161ideln\u011b. A pad\u00e1 nep\u0159edv\u00eddateln\u011b, a proto ho nem\u00e1m r\u00e1d. Ale dob\u0159e, p\u0159edpokl\u00e1dejme, \u017ee m\u00e1\u0161 k\u00f3d v bash. Mo\u017en\u00e1 opravdu nerozum\u00edm a existuj\u00ed tam norm\u00e1ln\u00ed testovac\u00ed frameworky. Prost\u011b se v tom nevyzn\u00e1m. A z\u00edsk\u00e1v\u00e1me stejn\u00e9 v\u00fdhody.<\/p>\n<p><\/p>\n<p>Jakmile pracujeme s infrastrukturou jako s k\u00f3dem, dost\u00e1v\u00e1me stejn\u00e9 probl\u00e9my jako v\u00fdvoj\u00e1\u0159i. P\u0159ed n\u011bkolika m\u011bs\u00edci jsem se setkal se situac\u00ed, kdy mi kolega poslal pull request na 1 000 \u0159\u00e1dk\u016f v bash. A ty jsi z\u016fstal na revizi 4 hodiny. Probl\u00e9my jsou op\u011bt stejn\u00e9. Je to st\u00e1le k\u00f3d. A st\u00e1le spole\u010dn\u00e1 pr\u00e1ce. Zasekneme se nad pull request a naraz\u00edme na stejn\u00e9 merge konflikty bash. <\/p>\n<p><\/p>\n<p>V sou\u010dasnosti se velmi aktivn\u011b d\u00edv\u00e1m na maxim\u00e1ln\u011b hezk\u00e9 programov\u00e1n\u00ed infrastruktury. Nyn\u00ed jsem do infrastruktury p\u0159idal Pulumi. To je programov\u00e1n\u00ed v \u010dist\u00e9 podob\u011b. Je to tam je\u0161t\u011b sympati\u010dt\u011bj\u0161\u00ed, proto\u017ee m\u00e1m v\u0161echny mo\u017enosti programovac\u00edho jazyka, tj. ud\u011blal jsem kr\u00e1sn\u00e9 toggle s norm\u00e1ln\u00edmi if, a v\u0161echno vypad\u00e1 dob\u0159e. Tedy m\u00e1 zm\u011bna u\u017e je v masteru. U\u017e si ji v\u0161ichni mohou prohl\u00e9dnout. Ostatn\u00ed in\u017een\u00fd\u0159i o n\u00ed v\u011bd\u00ed. U\u017e to na n\u011bco vliv m\u00e1. Ale z\u00e1rove\u0148 se to nezapnulo pro v\u0161echny infrastruktury. Zapnulo se to pro m\u00e9 testovac\u00ed stanice, nap\u0159\u00edklad. Proto, abych odpov\u011bd\u011bl na tvoji ot\u00e1zku znovu, je to pot\u0159eba. N\u00e1m, jako in\u017een\u00fdr\u016fm pracuj\u00edc\u00edm s k\u00f3dem, to ur\u010dit\u011b usnad\u0148uje \u017eivot. <\/p>\n<p><\/p>\n<p><em>M\u00e1 je\u0161t\u011b n\u011bkdo dal\u0161\u00ed ot\u00e1zky?<\/em> <\/p>\n<p><\/p>\n<p>M\u00e1m ot\u00e1zku. Chci pokra\u010dovat v diskuzi s Olegem. Obecn\u011b si mysl\u00edm, \u017ee m\u00e1\u0161 pravdu, \u017ee pokud ti \u00fakol trv\u00e1 m\u011bs\u00edc, m\u00e1\u0161 probl\u00e9m s architekturou, m\u00e1\u0161 probl\u00e9m s anal\u00fdzou, dekompozic\u00ed, pl\u00e1nov\u00e1n\u00edm atd. Ale m\u00e1m pocit, \u017ee pokud za\u010dne\u0161 \u017e\u00edt podle Continuous Integration, za\u010dne\u0161 opravovat bolesti s pl\u00e1nov\u00e1n\u00edm, proto\u017ee se od toho nikam jinam nedostane\u0161. <\/p>\n<p><\/p>\n<p><em>(Oleg) Ano, je to tak. Co se t\u00fd\u010de pracovn\u00edho zat\u00ed\u017een\u00ed, tato praxe se d\u00e1 srovnat s jakoukoli jinou z\u00e1va\u017enou prax\u00ed, kter\u00e1 m\u011bn\u00ed kulturu. Nejt\u011b\u017e\u0161\u00ed na p\u0159ekon\u00e1n\u00ed jsou zvyky, zejm\u00e9na \u0161patn\u00e9 zvyky. A pokud pro zaveden\u00ed t\u00e9to praxe je t\u0159eba z\u00e1sadn\u00ed zm\u011bna zvyklost\u00ed kolem v\u00e1s: v\u00fdvoj\u00e1\u0159i, veden\u00ed, produk\u010dn\u00ed mana\u017eer, \u010dekaj\u00ed v\u00e1s p\u0159ekvapen\u00ed.<\/em> <\/p>\n<p><\/p>\n<p><em>Jak\u00e1 p\u0159ekvapen\u00ed to mohou b\u00fdt? P\u0159edstavte si, \u017ee jste se rozhodli, \u017ee budete \u010dast\u011bji prov\u00e1d\u011bt integraci. A na integraci m\u00e1te nav\u00e1z\u00e1ny dal\u0161\u00ed v\u011bci, nap\u0159\u00edklad artefakty. A ve va\u0161\u00ed firm\u011b plat\u00ed politika, \u017ee ka\u017ed\u00fd artefakt mus\u00ed b\u00fdt n\u011bjak\u00fdm zp\u016fsobem evidov\u00e1n v syst\u00e9mu pro skladov\u00e1n\u00ed artefakt\u016f. A to zab\u00edr\u00e1 n\u011bjak\u00fd \u010das. \u010clov\u011bk mus\u00ed za\u0161krtnout, \u017ee jako release mana\u017eer schv\u00e1lil tento artefakt k uvoln\u011bn\u00ed do produkce. Pokud to zabere 5-10-15 minut a p\u0159itom d\u011bl\u00e1te uvoln\u011bn\u00ed jednou t\u00fddn\u011b, tak utratit p\u016fl hodiny jednou t\u00fddn\u011b je mal\u00e1 da\u0148.<\/em> <\/p>\n<p><\/p>\n<p><em>Pokud prov\u00e1d\u00edte Continuous Integration 10kr\u00e1t denn\u011b, mus\u00edte 10kr\u00e1t vyn\u00e1sobit 30 minutami. A to p\u0159evy\u0161uje pracovn\u00ed \u010das tohoto release mana\u017eera. Jednodu\u0161e se unav\u00ed. Existuj\u00ed st\u00e1l\u00e9 n\u00e1klady na n\u011bkter\u00e9 praktiky. A to je v\u0161e.<\/em> <\/p>\n<p><\/p>\n<p><em>A bu\u010f mus\u00edte zru\u0161it toto pravidlo, aby se takov\u00fdmi hloupostmi u\u017e nezab\u00fdval, tj. nebudete ru\u010dn\u011b p\u0159i\u0159azovat shodu n\u011b\u010deho n\u011b\u010demu. \u00dapln\u011b se spolehnete na n\u011bjakou automatizovanou sadu test\u016f p\u0159ipravenosti.<\/em> <\/p>\n<p><\/p>\n<p><em>A pokud pot\u0159ebujete od n\u011bkoho potvrzen\u00ed, aby vedouc\u00ed podepsal, a nekryjete se do produkce, dokud v\u00e1m Va\u0161ek ne\u0159ekl, \u017ee to povoluje, atd. \u2013 cel\u00e1 tato zbyte\u010dnost br\u00e1n\u00ed praktik\u00e1m. Proto\u017ee pokud existuj\u00ed n\u011bjak\u00e9 aktivity ve form\u011b dan\u011b, v\u0161e se stokr\u00e1t zkomplikuje. A proto bude posun \u010dasto p\u0159ijat jen s neochotou. Proto\u017ee zm\u011bnit zvyky lid\u00ed je obt\u00ed\u017en\u00e9.<\/em> <\/p>\n<p><\/p>\n<p><em>Kdy\u017e \u010dlov\u011bk d\u011bl\u00e1 svoji obvyklou pr\u00e1ci, d\u011bl\u00e1 ji prakticky bez p\u0159em\u00fd\u0161len\u00ed. Jej\u00ed kognitivn\u00ed zat\u00ed\u017een\u00ed je nulov\u00e9. Jednodu\u0161e se pust\u00ed do hotov\u00e9ho, v hlav\u011b u\u017e m\u00e1 checklist, d\u011blal to tis\u00edckr\u00e1t. A jakmile p\u0159ijde\u0161 a \u0159ekne\u0161 mu: \u201eZru\u0161\u00edme tuto praxi a od pond\u011bl\u00ed zavedeme novou,\u201c st\u00e1v\u00e1 se to pro n\u011bj zna\u010dn\u00fdm kognitivn\u00edm zat\u00ed\u017een\u00edm. A to pro v\u0161echny nastupuje najednou.<\/em> <\/p>\n<p><\/p>\n<p><em>Proto\u017ee to nejjednodu\u0161\u0161\u00ed je, \u017ee tuto luxus si nemus\u00ed dovolit ka\u017ed\u00fd, ale j\u00e1 to d\u011bl\u00e1m v\u017edy takto: kdy\u017e se spou\u0161t\u00ed nov\u00fd projekt, obvykle se do n\u011bj hned za\u0159ad\u00ed v\u0161echny neov\u011b\u0159en\u00e9 praktiky. Zat\u00edmco je projekt nov\u00fd, neriskujeme p\u0159\u00edli\u0161. Prod je\u0161t\u011b nen\u00ed, nen\u00ed co rozpadnout. Tak\u017ee je mo\u017en\u00e9 to pou\u017e\u00edt jako tr\u00e9nink. Tento p\u0159\u00edstup funguje. Ale ne v\u0161echny firmy maj\u00ed mo\u017enost spou\u0161t\u011bt takov\u00e9 projekty \u010dasto. I kdy\u017e se to zd\u00e1 trochu zvl\u00e1\u0161tn\u00ed, proto\u017ee te\u010f prob\u00edh\u00e1 masivn\u00ed digit\u00e1ln\u00ed transformace, v\u0161ichni by m\u011bli spou\u0161t\u011bt experimenty, aby se p\u0159izp\u016fsobili konkurenci.<\/em> <\/p>\n<p><\/p>\n<p>Zde se dost\u00e1v\u00e1te k tomu, \u017ee mus\u00edte m\u00edt nejprve jasnou p\u0159edstavu o tom, co pot\u0159ebujete d\u011blat. Sv\u011bt nen\u00ed dokonal\u00fd, prod tak\u00e9 nen\u00ed dokonal\u00fd. <\/p>\n<p><\/p>\n<p><em>Ano, tyto v\u011bci spolu souvisej\u00ed.<\/em><\/p>\n<p><\/p>\n<p>Firmy tak\u00e9 ne v\u017edy ch\u00e1pou, \u017ee by m\u011bly j\u00edt pr\u00e1v\u011b tam. <\/p>\n<p><\/p>\n<p><em>Existuje situace, kdy jsou jak\u00e9koliv zm\u011bny zcela nemo\u017en\u00e9. Je to situace, kdy na t\u00fdm p\u016fsob\u00ed v\u011bt\u0161\u00ed tlak. T\u00fdm je ji\u017e docela vy\u010derpan\u00fd. Nem\u00e1 \u017e\u00e1dn\u00fd \u010das na \u017e\u00e1dn\u00e9 experimenty. Od r\u00e1na do ve\u010dera vytv\u00e1\u0159\u00ed funkce. A veden\u00ed pot\u0159ebuje st\u00e1le v\u00edce a v\u00edce funkc\u00ed. V takov\u00e9 situaci nejsou mo\u017en\u00e9 \u017e\u00e1dn\u00e9 zm\u011bny. T\u00fdmu mohou jen \u0159\u00edci, \u017ee z\u00edtra to ud\u011bl\u00e1me stejn\u011b jako v\u010dera, prost\u011b mus\u00edme ud\u011blat o n\u011bco v\u00edce funkc\u00ed. \u017d\u00e1dn\u00e9 p\u0159echody k jin\u00fdm praktik\u00e1m v tomto smyslu nejsou mo\u017en\u00e9. To je klasick\u00e1 situace, kdy nen\u00ed \u010das na brou\u0161en\u00ed sekery, je t\u0159eba k\u00e1cet stromy, proto se k\u00e1c\u00ed tupou sekerou. Zde nejsou \u017e\u00e1dn\u00e9 jednoduch\u00e9 rady.<\/em> <\/p>\n<p><\/p>\n<p><em>(Dmitrij) P\u0159e\u010dtu up\u0159esn\u011bn\u00ed z chatu: \u201eAle pot\u0159ebujeme vysok\u00e9 pokryt\u00ed testy na r\u016fzn\u00fdch \u00farovn\u00edch. Kolik \u010dasu se v\u011bnuje testov\u00e1n\u00ed? Je to trochu drah\u00e9, zab\u00edr\u00e1 to hodn\u011b \u010dasu\u201c.<\/em><\/p>\n<p><\/p>\n<p><em>(Oleg) To je klasick\u00e1 myln\u00e1 p\u0159edstava. Test\u016f by m\u011blo b\u00fdt dostatek na to, abyste m\u011bli jistotu sami v sob\u011b. Continuous Integration nen\u00ed n\u011bco, kde nejprve prob\u011bhne 100 % test\u016f a a\u017e pot\u00e9 za\u010dnete tuto praxi aplikovat. Continuous Integration sni\u017euje va\u0161i kognitivn\u00ed z\u00e1t\u011b\u017e t\u00edm, \u017ee ka\u017ed\u00e1 zm\u011bna, kterou vid\u00edte, je tak z\u0159ejm\u00e1, \u017ee ch\u00e1pete \u2013 zda n\u011bco rozbije, nebo ne, dokonce i bez test\u016f. M\u016f\u017eete to rychle otestovat ve sv\u00e9 hlav\u011b, proto\u017ee zm\u011bny jsou mal\u00e9. I kdy\u017e m\u00e1te pouze manu\u00e1ln\u00ed testery, je to pro n\u011b tak\u00e9 jednodu\u0161\u0161\u00ed. Nasad\u00edte to a \u0159\u00edk\u00e1te: \u201ePod\u00edvej se, nic se neporouchalo?\u201c Odpov\u00ed v\u00e1m: \u201eNe, nic se neporouchalo.\u201c Proto\u017ee tester v\u00ed, na co se m\u00e1 zam\u011b\u0159it. Jeden commit je spojen s jedn\u00edm fragmentem k\u00f3du. A to se odv\u00edj\u00ed od konkr\u00e9tn\u00edho chov\u00e1n\u00ed.<\/em><\/p>\n<p><\/p>\n<p>Tady jsi to samoz\u0159ejm\u011b trochu p\u0159ikr\u00e1\u0161lil. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) S t\u00edm nesouhlas\u00edm. Existuje praxe \u2013 test-driven development, kter\u00e1 t\u011b pr\u00e1v\u011b od toho zachr\u00e1n\u00ed.<\/em> <\/p>\n<p><\/p>\n<p><em>(Oleg) To jsem se je\u0161t\u011b k tomu nedostal. Prvn\u00ed iluze \u2013 je to, \u017ee je pot\u0159eba napsat p\u0159esn\u011b 100 % test\u016f, nebo se v\u016fbec nezab\u00fdvat Continuous Integration. To nen\u00ed pravda. To jsou dv\u011b paraleln\u00ed praktiky. A p\u0159\u00edmo na sob\u011b nez\u00e1vis\u00ed. Va\u0161e pokryt\u00ed testy by m\u011blo b\u00fdt optim\u00e1ln\u00ed. Optim\u00e1ln\u00ed \u2013 to znamen\u00e1, \u017ee si sami jste jisti t\u00edm, \u017ee kvalita va\u0161eho mastera, kter\u00e1 z\u016fstala po commitu, v\u00e1m umo\u017e\u0148uje s jistotou stisknout tla\u010d\u00edtko \u201eDeploy\u201c v p\u00e1tek ve\u010der pod vlivem alkoholu. Jak toho dos\u00e1hnete? P\u0159es revizi, p\u0159es pokryt\u00ed, p\u0159es dobr\u00e9 monitorov\u00e1n\u00ed.<\/em> <\/p>\n<p><\/p>\n<p><em>Dobr\u00fd monitoring se neli\u0161\u00ed od test\u016f. Pokud spou\u0161t\u00edte testy jednou na pre prod, ov\u011b\u0159uj\u00ed jednou v\u0161echny va\u0161e u\u017eivatelsk\u00e9 sc\u00e9n\u00e1\u0159e a t\u00edm to kon\u010d\u00ed. Pokud je spou\u0161t\u00edte v nekone\u010dn\u00e9m cyklu, pak m\u00e1te rozvinut\u00fd syst\u00e9m monitorov\u00e1n\u00ed, kter\u00fd nekone\u010dn\u011b testuje \u2013 spadlo to, nebo ne. V tomto p\u0159\u00edpad\u011b je rozd\u00edl pouze v jednor\u00e1zovosti nebo v\u00edcen\u00e1sobnosti. Velmi dobr\u00e1 sada test\u016f\u2026, spu\u0161t\u011bn\u00e1 nekone\u010dn\u011b, je monitoring. A spr\u00e1vn\u00fd monitoring by takov\u00fd m\u011bl b\u00fdt.<\/em> <\/p>\n<p><\/p>\n<p><em>A proto, jak p\u0159esn\u011b dos\u00e1hnete stavu, kdy se v p\u00e1tek ve\u010der nasad\u00edte a p\u016fjdete dom\u016f, je jin\u00e1 ot\u00e1zka. Mo\u017en\u00e1 jste jen odv\u00e1\u017en\u00fd bl\u00e1zen.<\/em> <\/p>\n<p><\/p>\n<p>Poj\u010fme se na chv\u00edli vr\u00e1tit k Continuous Integration. Trochu jsme utekli do jin\u00e9 komplikovan\u00e9 praxe. <\/p>\n<p><\/p>\n<p><em>A druh\u00e1 iluze je, \u017ee MVP se pr\u00fd mus\u00ed d\u011blat rychle, tak\u017ee tam vlastn\u011b testy nejsou pot\u0159eba. To nen\u00ed \u00fapln\u011b pravda. Kdy\u017e p\u00ed\u0161ete user story pro MVP, m\u016f\u017eete ji vyvinout bu\u010f na koleni \u2013 to znamen\u00e1, \u017ee sly\u0161\u00edte, \u017ee n\u011bjak\u00e1 user story existuje, a hned se do jej\u00edho k\u00f3dov\u00e1n\u00ed vrhnete, nebo pracovat podle TDD. A podle TDD, jak ukazuje praxe, to trv\u00e1 fakticky stejn\u011b dlouho, testy jsou vedlej\u0161\u00edm produktem. Podstata TDD nespo\u010d\u00edv\u00e1 v testov\u00e1n\u00ed. I kdy\u017e se to jmenuje Test Driven Development, ve skute\u010dnosti nejde v\u016fbec o testy. Je to sp\u00ed\u0161e architektonick\u00fd p\u0159\u00edstup. Jde o to, jak ps\u00e1t p\u0159esn\u011b to, co je pot\u0159eba, a nep\u0159id\u00e1vat to, co nen\u00ed pot\u0159ebn\u00e9. Tato praxe soust\u0159ed\u00ed pozornost na dal\u0161\u00ed iteraci va\u0161eho my\u0161len\u00ed v r\u00e1mci budov\u00e1n\u00ed architektury aplikace.<\/em> <\/p>\n<p><\/p>\n<p><em>Proto nen\u00ed snadn\u00e9 se t\u011bchto iluz\u00ed zbavit. MVP a testy se navz\u00e1jem nevylu\u010duj\u00ed. Naopak, pokud d\u011bl\u00e1te MVP podle princip\u016f TDD, ud\u011bl\u00e1te to l\u00e9pe a rychleji, ne\u017e pokud byste to d\u011blali bez t\u00e9to praxe, na koleni.<\/em><\/p>\n<p><\/p>\n<p>To je velmi nepopirateln\u00e1 a slo\u017eit\u00e1 my\u0161lenka. Kdy\u017e sly\u0161\u00edte, \u017ee te\u010f budu tak\u00e9 ps\u00e1t testy a p\u0159itom n\u011bco ud\u011bl\u00e1m rychleji, zn\u00ed to naprosto neadekv\u00e1tn\u011b. <\/p>\n<p><\/p>\n<p><em>(Dmitrij) Mnoz\u00ed, kdy\u017e mluv\u00ed o MVP, se prost\u011b necht\u011bj\u00ed nam\u00e1hat s psan\u00edm n\u011b\u010deho norm\u00e1ln\u00edho. A to jsou nakonec dv\u011b odli\u0161n\u00e9 v\u011bci. Nen\u00ed dobr\u00e9, aby se MVP prom\u011bnilo v n\u011bco \u0161patn\u00e9ho, co nefunguje.<\/em> <\/p>\n<p><\/p>\n<p>Ano, m\u00e1\u0161 pravdu.<\/p>\n<p><\/p>\n<p><em>A pak n\u00e1hle MVP v produkci.<\/em><\/p>\n<p><\/p>\n<p>Nav\u017edy. <\/p>\n<p><\/p>\n<p>A TDD zn\u00ed velmi nezvykle, kdy\u017e sly\u0161\u00edte, \u017ee p\u00ed\u0161ete testy a jakoby d\u011bl\u00e1te v\u00edce pr\u00e1ce. Zn\u00ed to zvl\u00e1\u0161tn\u011b, ale ve skute\u010dnosti to jde rychleji a esteticky l\u00e9pe. Kdy\u017e p\u00ed\u0161ete test, u\u017e v hlav\u011b hodn\u011b p\u0159em\u00fd\u0161l\u00edte o tom, jak\u00fd k\u00f3d a jak bude vol\u00e1n a jak\u00e9 chov\u00e1n\u00ed od n\u011bj o\u010dek\u00e1v\u00e1me. Nejen \u0159\u00edk\u00e1te, \u017ee jsem napsal n\u011bjakou funkci a ta n\u011bco d\u011bl\u00e1. Nejd\u0159\u00edve p\u0159em\u00fd\u0161l\u00edte o tom, jak\u00e9 podm\u00ednky to m\u00e1, jak bude vol\u00e1na. To pokr\u00fdv\u00e1te testy a z toho ch\u00e1pete, jak budou vypadat rozhran\u00ed uvnit\u0159 va\u0161eho k\u00f3du. To m\u00e1 siln\u00fd vliv na architekturu. V\u00e1\u0161 k\u00f3d se automaticky st\u00e1v\u00e1 v\u00edce modul\u00e1rn\u00edm, proto\u017ee se nejprve sna\u017e\u00edte pochopit, jak ho budete testovat, a teprve potom ho p\u00ed\u0161ete. <\/p>\n<p><\/p>\n<p>M\u011bl jsem s TDD takovou zku\u0161enost, \u017ee jsem si v ur\u010dit\u00e9m okam\u017eiku najal mentora na Ruby, kdy\u017e jsem byl je\u0161t\u011b program\u00e1tor na Ruby. A on \u0159\u00edk\u00e1: \u201eD\u00e1me se do TDD\u201c. Pomyslel jsem si: \u201eM\u011b to te\u010f bude ob\u00edrat o \u010das\u201c. Domluvili jsme se, \u017ee po dobu dvou t\u00fddn\u016f budu ps\u00e1t ve\u0161ker\u00fd pracovn\u00ed k\u00f3d na Python pomoc\u00ed TDD. Po dvou t\u00fddnech jsem zjistil, \u017ee se zp\u011bt vr\u00e1tit u\u017e nechci. B\u011bhem t\u011bch dvou t\u00fddn\u016f, kdy jsem to v\u0161ude zkou\u0161el, jsem si uv\u011bdomil, jak snadn\u011bj\u0161\u00ed je prost\u011b p\u0159em\u00fd\u0161let. Ale to nen\u00ed o\u010dividn\u00e9, tak\u017ee doporu\u010duji v\u0161em, \u017ee pokud m\u00e1te pocit, \u017ee TDD je komplikovan\u00e9, zdlouhav\u00e9 a zbyte\u010dn\u00e9, zkuste se tomu dr\u017eet po dobu dvou t\u00fddn\u016f. Mn\u011b to sta\u010dilo.<\/p>\n<p><\/p>\n<p><em>(Dmitrij) Tuto my\u0161lenku m\u016f\u017eeme rozvinout z pohledu provozu infrastruktury. Ne\u017e n\u011bco nov\u00e9ho spust\u00edme, provedeme monitoring, a a\u017e pak spou\u0161t\u00edme. V tomto p\u0159\u00edpad\u011b se monitoring st\u00e1v\u00e1 b\u011b\u017en\u00fdm testov\u00e1n\u00edm. A existuje v\u00fdvoj p\u0159es monitoring. Ale t\u00e9m\u011b\u0159 ka\u017ed\u00fd \u0159\u00edk\u00e1, \u017ee to trv\u00e1 dlouho, je mu l\u00edno, ud\u011blal jsem do\u010dasn\u00fd n\u00e1vrh. Pokud jsme provedli monitoring po\u0159\u00e1dn\u011b, ch\u00e1peme stav CI syst\u00e9mu. A v CI syst\u00e9mu je hodn\u011b monitoringu. Ch\u00e1peme stav syst\u00e9mu, v\u00edme, co se uvnit\u0159 d\u011bje. A b\u011bhem v\u00fdvoje vytv\u00e1\u0159\u00edme syst\u00e9m, aby dosp\u011bl do po\u017eadovan\u00e9ho stavu.<\/em> <\/p>\n<p><\/p>\n<p><em>Tyto praktiky jsou zn\u00e1my u\u017e dlouho. Diskutovali jsme o tom p\u0159ed \u010dty\u0159mi lety. Ale za \u010dty\u0159i roky se prakticky nic nezm\u011bnilo.<\/em> <\/p>\n<p><\/p>\n<p><em>Na t\u00e9to pozn\u00e1mce navrhuji ofici\u00e1ln\u00ed diskuzi ukon\u010dit.<\/em><\/p>\n<p><\/p>\n<p>Video (vlo\u017een\u00e9 jako medi\u00e1ln\u00ed prvek, ale z n\u011bjak\u00e9ho d\u016fvodu 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\/cs\/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=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\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\/cs\/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 jako praxe, ne Jenkins. Andrej Alexandrov | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/continuous-integration-kak-praktika-a-ne-jenkins-andrej-aleksandrov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/93885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=93885"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/93885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/93886"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=93885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=93885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=93885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}