{"id":34744,"date":"2019-10-31T22:00:10","date_gmt":"2019-10-31T19:00:10","guid":{"rendered":"https:\/\/prohoster.info\/blog\/monorepozitorii-pozhalujsta-nado\/"},"modified":"2019-10-31T22:00:10","modified_gmt":"2019-10-31T19:00:10","slug":"monorepozitorii-pozhalujsta-nado","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","title":{"rendered":"Monorepozit\u00e1\u0159e: pros\u00edm, je to nutn\u00e9","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Monorepozit\u00e1\u0159e: pros\u00edm, je to nutn\u00e9\" src=\"\/wp-content\/uploads\/2019\/05\/a973a60a06e7b336c08db26fa6d72149.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>P\u0159eklad \u010dl\u00e1nku byl p\u0159ipraven pro studenty kurzu <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/g5Rz\/\">\u201eDevOps praktiky a n\u00e1stroje\u201c<\/a><\/noindex> v edukativn\u00edm projektu OTUS.<\/em><\/p>\n<p>Mus\u00edte zvolit monorepo, proto\u017ee chov\u00e1n\u00ed, kter\u00e9 podporuje ve va\u0161ich t\u00fdmech, je transparentnost a kolektivn\u00ed odpov\u011bdnost, zejm\u00e9na p\u0159i r\u016fstu t\u00fdm\u016f. Tak \u010di onak, budete muset investovat do n\u00e1stroj\u016f, ale je v\u017edy lep\u0161\u00ed, kdy\u017e je v\u00fdchoz\u00ed chov\u00e1n\u00ed to, kter\u00e9 chcete vid\u011bt ve sv\u00fdch t\u00fdmech. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h1 id=\"pochemu-my-govorim-ob-etom\">Pro\u010d o tom mluv\u00edme?<\/h1>\n<p><\/p>\n<p>Matt Klein napsal \u010dl\u00e1nek <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@mattklein123\/monorepos-please-dont-e9a279be011b\">\u201eMonorepos: Pros\u00edm, ned\u011blejte to!\u201c<\/a><\/noindex>\u200a (pozn. p\u0159ekladatele: p\u0159eklad na Habru <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/435306\/\">\u201eMonorepozit\u00e1\u0159e: pros\u00edm, ned\u011blejte to\u201c<\/a><\/noindex>). M\u00e1m r\u00e1d Matta, mysl\u00edm, \u017ee je velmi inteligentn\u00ed a m\u011bli byste si p\u0159e\u010d\u00edst jeho pohled. P\u016fvodn\u011b zve\u0159ejnil anketu na Twitteru:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Monorepozit\u00e1\u0159e: pros\u00edm, je to nutn\u00e9\" src=\"\/wp-content\/uploads\/2019\/05\/edbc65b80288045e08394821c17a77a9.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>P\u0159eklad:<\/em><br \/>\n<em>Na tento novoro\u010dn\u00ed den se chci dohadovat o tom, jak absurdn\u00ed monorepo jsou. Rok 2019 za\u010dal nen\u00e1padn\u011b. V tomto duchu v\u00e1m navrhuji anketu. Kdo jsou velc\u00ed fanou\u0161ci? P\u0159\u00edznivci:<\/em><br \/>\n\u2014 <em>Monorepozit\u00e1\u0159<\/em><br \/>\n\u2014 <em>Rust<\/em><br \/>\n\u2014 <em>\u0160patn\u00e1 anketa \/ oboje<\/em><\/p>\n<p><\/p>\n<p>Moje odpov\u011b\u010f byla: \u201eJ\u00e1 jsem doslova oba tito lid\u00e9\u201c. M\u00edsto toho, abychom mluvili o tom, jak\u00fd je Rust droga, poj\u010fme se pod\u00edvat na to, pro\u010d si mysl\u00edm, \u017ee se m\u00fdl\u00ed ohledn\u011b monorepozit\u00e1\u0159\u016f. Trochu o sob\u011b. Jsem technick\u00fd \u0159editel spole\u010dnosti Chef Software. M\u00e1me asi 100 in\u017een\u00fdr\u016f, k\u00f3dovou z\u00e1kladnu, kter\u00e1 m\u00e1 asi 11-12 let, a 4 hlavn\u00ed produkty. N\u011bkter\u00e9 z tohoto k\u00f3du se nach\u00e1zej\u00ed v polyrepo (moje v\u00fdchoz\u00ed pozice), \u010d\u00e1st v monorepo (moje sou\u010dasn\u00e1 pozice).<\/p>\n<p><\/p>\n<p>Ne\u017e za\u010dnu: ka\u017ed\u00fd argument, kter\u00fd zde p\u0159ednesu, bude pou\u017eiteln\u00fd pro oba typy repozit\u00e1\u0159\u016f. Podle m\u00e9ho n\u00e1zoru nejsou \u017e\u00e1dn\u00e9 technick\u00e9 d\u016fvody, pro\u010d byste m\u011bli zvolit ten nebo onen typ repozit\u00e1\u0159e. M\u016f\u017eete nechat fungovat jak\u00fdkoli p\u0159\u00edstup. R\u00e1d o tom budu diskutovat, ale nezaj\u00edm\u00e1 m\u011b um\u011bl\u00e9 technick\u00e9 d\u016fvody, pro\u010d jedno p\u0159evy\u0161uje druh\u00e9. <\/p>\n<p><\/p>\n<p>Souhlas\u00edm s prvn\u00ed \u010d\u00e1st\u00ed n\u00e1zoru Matta:<\/p>\n<p><\/p>\n<p><em>Proto\u017ee na velk\u00e9m m\u011b\u0159\u00edtku monorepo vy\u0159e\u0161\u00ed v\u0161echny stejn\u00e9 probl\u00e9my, kter\u00e9 \u0159e\u0161\u00ed polyrepo, ale z\u00e1rove\u0148 v\u00e1s provokuje k siln\u00e9 prov\u00e1zanosti va\u0161eho k\u00f3du a vy\u017eaduje enormn\u00ed \u00fasil\u00ed p\u0159i zvy\u0161ov\u00e1n\u00ed \u0161k\u00e1lovatelnosti va\u0161eho syst\u00e9mu spr\u00e1vy verz\u00ed.<\/em><\/p>\n<p><\/p>\n<p>Budete \u010delit stejn\u00fdm probl\u00e9m\u016fm, a\u0165 u\u017e si vyberete monorepozit\u00e1\u0159 nebo polyrepozitor. Jak vyd\u00e1v\u00e1te verze? Jak\u00fd m\u00e1te p\u0159\u00edstup k aktualizac\u00edm? Zp\u011btn\u00e1 kompatibilita? P\u0159esn\u011b z\u00e1vislosti mezi projekty? Jak\u00e9 architektonick\u00e9 styly jsou akceptovateln\u00e9? Jak spravujete svou infrastrukturu pro sestavov\u00e1n\u00ed a testov\u00e1n\u00ed? Seznam je nekone\u010dn\u00fd. A budete je \u0159e\u0161it v\u0161echny, jakmile porostete. Zdarma nic nen\u00ed.<\/p>\n<p><\/p>\n<p>Mysl\u00edm, \u017ee Matt\u016fv argument je podobn\u00fd n\u00e1zor\u016fm, kter\u00e9 sd\u00edl\u00ed mnoz\u00ed in\u017een\u00fd\u0159i (a mana\u017ee\u0159i), kter\u00e9 respektuji. To vych\u00e1z\u00ed z pohledu in\u017een\u00fdra pracuj\u00edc\u00edho na komponent\u011b, nebo t\u00fdmu, kter\u00fd na komponent\u011b pracuje. Sly\u0161\u00edte takov\u00e9 v\u011bci, jako:<\/p>\n<p><\/p>\n<ul>\n<li>K\u00f3dov\u00e1 z\u00e1kladna je objemn\u00e1 \u2014 nepot\u0159ebuji cel\u00fd tento nepo\u0159\u00e1dek.<\/li>\n<li>Je to t\u011b\u017e\u0161\u00ed testovat, proto\u017ee mus\u00edm zkontrolovat cel\u00fd ten nepo\u0159\u00e1dek, kter\u00fd nepot\u0159ebuji.<\/li>\n<li>Je slo\u017eit\u011bj\u0161\u00ed pracovat s extern\u00edmi z\u00e1vislostmi.<\/li>\n<li>Pot\u0159ebuji sv\u00e9 vlastn\u00ed virtu\u00e1ln\u00ed syst\u00e9my spr\u00e1vy verz\u00ed.<\/li>\n<\/ul>\n<p><\/p>\n<p>Rozhodn\u011b v\u0161echny tyto body jsou opr\u00e1vn\u011bn\u00e9. Plat\u00ed to v obou p\u0159\u00edpadech \u2014 v polyrepozitoru m\u00e1m sv\u016fj nepo\u0159\u00e1dek, krom\u011b toho, kter\u00fd pot\u0159ebuji k sestaven\u00ed... Mo\u017en\u00e1 budu pot\u0159ebovat dal\u0161\u00ed nepo\u0159\u00e1dek. Tak\u017ee 'jen' vytv\u00e1\u0159\u00edm n\u00e1stroje, kter\u00e9 prov\u00e1d\u011bj\u00ed checkout cel\u00e9ho projektu. Nebo vytv\u00e1\u0159\u00edm fale\u0161n\u00fd monorepozit\u00e1\u0159 s podmoduly. Mohli bychom kolem toho chodit cel\u00fd den. Ale mysl\u00edm, \u017ee Matt\u016fv argument opom\u00edj\u00ed hlavn\u00ed d\u016fvod, kter\u00fd jsem dost siln\u011b obracel ve prosp\u011bch monorepozit\u00e1\u0159e:<\/p>\n<p><\/p>\n<h1 id=\"on-provociruet-obschenie-i-pokazyvaet-problemy\">Podn\u011bcuje komunikaci a odhaluje probl\u00e9my.<\/h1>\n<p><\/p>\n<p>Kdy\u017e d\u011bl\u00edme repozit\u00e1\u0159e, de facto vytv\u00e1\u0159\u00edme probl\u00e9m koordinace a transparentnosti. To odpov\u00edd\u00e1 tomu, jak p\u0159em\u00fd\u0161l\u00edme o t\u00fdmech (zejm\u00e9na jak o nich p\u0159em\u00fd\u0161l\u00ed jednotliv\u00ed \u00fa\u010dastn\u00edci): neseme odpov\u011bdnost za konkr\u00e9tn\u00ed komponentu. Pracujeme relativn\u011b izolovan\u011b. Hranice jsou stanoveny na m\u00e9m t\u00fdmu a komponent\u011b(-\u00e1ch), na kter\u00fdch pracujeme.<\/p>\n<p><\/p>\n<p>P\u0159i komplikaci architektury ji\u017e jeden t\u00fdm nem\u016f\u017ee spravovat syst\u00e9m s\u00e1m. Velmi m\u00e1lo in\u017een\u00fdr\u016f m\u00e1 celou syst\u00e9m v pam\u011bti. P\u0159edstavte si, \u017ee spravujete spole\u010dnou komponentu A, kterou pou\u017e\u00edvaj\u00ed t\u00fdmy B, C a D. T\u00fdm A prov\u00e1d\u00ed refactoring, zlep\u0161uje API a m\u011bn\u00ed vnit\u0159n\u00ed implementaci. V d\u016fsledku toho jsou zm\u011bny zp\u011btn\u011b nekompatibiln\u00ed. Jakou radu byste dali?<\/p>\n<p><\/p>\n<ul>\n<li>Zjistit v\u0161echna m\u00edsta, kde se pou\u017e\u00edv\u00e1 star\u00e9 API.<\/li>\n<li>Existuj\u00ed m\u00edsta, kde nelze pou\u017e\u00edt nov\u00e9 API?<\/li>\n<li>M\u016f\u017eete opravit a otestovat jin\u00e9 komponenty, abyste se ujistili, \u017ee se nezlom\u00ed?<\/li>\n<li>Mohou tyto t\u00fdmy zkontrolovat va\u0161e zm\u011bny hned te\u010f?<\/li>\n<\/ul>\n<p><\/p>\n<p>V\u0161imn\u011bte si, \u017ee tyto ot\u00e1zky nez\u00e1vis\u00ed na typu repozit\u00e1\u0159e. Budete muset naj\u00edt t\u00fdmy B, C a D. Budete muset s nimi promluvit, zjistit \u010das, pochopit jejich priority. Minim\u00e1ln\u011b douf\u00e1me, \u017ee to ud\u011bl\u00e1te.<\/p>\n<p><\/p>\n<p>Ve skute\u010dnosti to nikdo nechce d\u011blat. Je to mnohem m\u00e9n\u011b vzru\u0161uj\u00edc\u00ed ne\u017e pouh\u00e1 oprava proklet\u00e9ho API. V\u0161echno je to lidsk\u00e9 a zamotan\u00e9. V poli repozit\u00e1\u0159e m\u016f\u017eete jednodu\u0161e prov\u00e9st zm\u011bny, d\u00e1t je k revizi t\u011bm, kte\u0159\u00ed pracuj\u00ed na t\u00e9to komponent\u011b (pravd\u011bpodobn\u011b ne B, C nebo D), a j\u00edt d\u00e1l. T\u00fdmy B, C a D mohou zat\u00edm z\u016fstat na sv\u00e9 aktu\u00e1ln\u00ed verzi. Aktualizuj\u00ed se, kdy\u017e si uv\u011bdom\u00ed va\u0161i genialitu!<\/p>\n<p><\/p>\n<p>V monorepo je odpov\u011bdnost ve defaultu posunuta. T\u00fdm A zm\u011bn\u00ed svou komponentu a pokud neprojev\u00ed obez\u0159etnost, okam\u017eit\u011b rozbije B, C a D. To vede k tomu, \u017ee se B, C a D objevuj\u00ed u dve\u0159\u00ed A, udiveni, pro\u010d t\u00fdm A rozbil sestaven\u00ed. To u\u010d\u00ed A, \u017ee nemohou p\u0159ehl\u00e9dnout m\u016fj v\u00fd\u0161e uveden\u00fd seznam. Mus\u00ed mluvit o tom, co maj\u00ed v pl\u00e1nu ud\u011blat. Mohou B, C a D pokra\u010dovat? Co kdy\u017e B a C mohou, ale D byl \u00fazce spojen s vedlej\u0161\u00edm efektem chov\u00e1n\u00ed star\u00e9ho algoritmu?<\/p>\n<p><\/p>\n<p>Pak bychom m\u011bli hovo\u0159it o tom, jak se z t\u00e9to situace dostat:<\/p>\n<p><\/p>\n<ol>\n<li>Podpora v\u00edce intern\u00edch API, p\u0159i\u010dem\u017e star\u00fd algoritmus bude ozna\u010den jako zastaral\u00fd, dokud D nebude moci p\u0159estat jej pou\u017e\u00edvat.<\/li>\n<li>Podpora v\u00edce verz\u00ed vyd\u00e1n\u00ed, jedna se star\u00fdm rozhran\u00edm, jedna s nov\u00fdm.<\/li>\n<li>Zpo\u017ed\u011bn\u00ed vyd\u00e1n\u00ed zm\u011bn A, dokud sou\u010dasn\u011b B, C a D nebudou moci je p\u0159ijmout.<\/li>\n<\/ol>\n<p><\/p>\n<p>P\u0159edstavme si, \u017ee jsme vybrali 1, n\u011bkolik API. V takov\u00e9m p\u0159\u00edpad\u011b m\u00e1me dva kousky k\u00f3du. Star\u00fd a nov\u00fd. Je to docela pohodln\u00e9 v n\u011bkter\u00fdch situac\u00edch. Vrac\u00edme star\u00fd k\u00f3d zp\u011bt, ozna\u010dujeme ho jako zastaral\u00fd (deprecated) a dohodneme se na pl\u00e1nu jeho odstran\u011bn\u00ed s t\u00fdmem D. V z\u00e1sad\u011b je to identick\u00e9 pro poly a monorepozit\u00e1\u0159.<\/p>\n<p><\/p>\n<p>Pro vyd\u00e1n\u00ed n\u011bkolika verz\u00ed pot\u0159ebujeme v\u011btev. Nyn\u00ed m\u00e1me dva komponenty - A1 a A2. T\u00fdmy B a C pou\u017e\u00edvaj\u00ed A2, zat\u00edmco D pou\u017e\u00edv\u00e1 A1. Pot\u0159ebujeme, aby byl ka\u017ed\u00fd komponent p\u0159ipraven k vyd\u00e1n\u00ed, proto\u017ee ne\u017e D m\u016f\u017ee pokra\u010dovat d\u00e1l, mohou b\u00fdt pot\u0159eba bezpe\u010dnostn\u00ed aktualizace a opravy dal\u0161\u00edch chyb. V polyrepozit\u00e1\u0159i m\u016f\u017eeme toto skr\u00fdt v dlouhodob\u00e9 v\u011btvi, kter\u00e1 se zd\u00e1 b\u00fdt v po\u0159\u00e1dku. V monorepozit\u00e1\u0159i vytv\u00e1\u0159\u00edme k\u00f3d n\u00e1siln\u011b v nov\u00e9m modulu. T\u00fdmu D st\u00e1le bude muset prov\u00e9st zm\u011bny ve \"star\u00e9m\" komponentu. Ka\u017ed\u00fd m\u016f\u017ee vid\u011bt n\u00e1klady, kter\u00e9 zde plat\u00edme - nyn\u00ed m\u00e1me dvakr\u00e1t v\u00edce k\u00f3du a v\u0161echny opravy chyb, kter\u00e9 se aplikuj\u00ed na A1 a A2, mus\u00ed b\u00fdt aplikov\u00e1ny na oba. S p\u0159\u00edstupem pou\u017eit\u00ed v\u011btv\u00ed v polyrepozit\u00e1\u0159i je to skryt\u00e9 za cherry-pick. Pova\u017eujeme n\u00e1klady za men\u0161\u00ed, proto\u017ee tam nen\u00ed duplicita. Z praktick\u00e9ho hlediska jsou n\u00e1klady stejn\u00e9: budete vytv\u00e1\u0159et, vyd\u00e1vat a podporovat dv\u011b, v\u011bt\u0161inou identick\u00e9, b\u00e1ze k\u00f3du, dokud nebudete moci jednu z nich odstranit. Rozd\u00edl je v tom, \u017ee v monorepozit\u00e1\u0159i je tento probl\u00e9m p\u0159\u00edm\u00fd a je na o\u010d\u00edch. <strong>To je je\u0161t\u011b hor\u0161\u00ed, a to je dob\u0159e.<\/strong><\/p>\n<p><\/p>\n<p>Kone\u010dn\u011b jsme se dostali k t\u0159et\u00edmu bodu. Zpo\u017ed\u011bn\u00ed uvoln\u011bn\u00ed. Je mo\u017en\u00e9, \u017ee zm\u011bny proveden\u00e9 t\u00fdmem A zlep\u0161\u00ed \u017eivot t\u00fdmu D. D\u016fle\u017eit\u00e9, ale ne urgentn\u00ed. M\u016f\u017eeme to prost\u011b zpozdit? V monorepozit\u00e1\u0159i tla\u010d\u00edme to k upevn\u011bn\u00ed artefaktu. Samoz\u0159ejm\u011b, \u017ee o tom mluv\u00edme s t\u00fdmem D. Jen z\u016fsta\u0148te na star\u00e9 verzi, dokud to nedohn\u00e1te! To nastavuje atmosf\u00e9ru k \u00fato\u010dnosti. T\u00fdm A d\u00e1l pracuje na sv\u00e9m komponentu, ignoruj\u00edc fakt, \u017ee t\u00fdm D pou\u017e\u00edv\u00e1 st\u00e1le star\u0161\u00ed verzi (to je probl\u00e9m t\u00fdmu D, jsou hloup\u00ed). Mezit\u00edm t\u00fdm D \u0161patn\u011b hovo\u0159\u00ed o nezodpov\u011bdn\u00e9m p\u0159\u00edstupu t\u00fdmu A ke stabilit\u011b k\u00f3du, pokud o tom v\u016fbec mluv\u00ed. Uplynou m\u011bs\u00edce. Nakonec se t\u00fdm D rozhodne pod\u00edvat na mo\u017enost aktualizace, ale zm\u011bn v A jen p\u0159ib\u00fdv\u00e1. T\u00fdm A sotva pamatuje, kdy a jak D rozbili. Aktualizace bude bolestiv\u011bj\u0161\u00ed a zabere v\u00edce \u010dasu. Co posunuje tuto z\u00e1le\u017eitost d\u00e1le dol\u016f v priorit\u00e1ch. A\u017e do dne, kdy nastane bezpe\u010dnostn\u00ed probl\u00e9m v A, kter\u00fd n\u00e1s donut\u00ed prov\u00e9st branch. T\u00fdm A se mus\u00ed vr\u00e1tit zp\u011bt v \u010dase, naj\u00edt moment, kdy D byl stabiln\u00ed, opravit tam probl\u00e9m a p\u0159ipravit ho na uvoln\u011bn\u00ed. <strong>To je de facto volba, kterou lid\u00e9 d\u011blaj\u00ed, a ur\u010dit\u011b je to to nejhor\u0161\u00ed.<\/strong> Vypad\u00e1 to, \u017ee je to dobr\u00e9 jak pro t\u00fdm A, tak pro D, dokud se m\u016f\u017eeme ignorovat navz\u00e1jem.<\/p>\n<p><\/p>\n<p>V monorepozit\u00e1\u0159i t\u0159et\u00ed mo\u017enost opravdu nen\u00ed. Mus\u00edte se s touto situac\u00ed vypo\u0159\u00e1dat jedn\u00edm ze dvou zp\u016fsob\u016f. Mus\u00edte vid\u011bt n\u00e1klady na existenci dvou uvol\u0148ovac\u00edch branches. Nau\u010dit se chr\u00e1nit sami sebe p\u0159ed aktualizacemi, kter\u00e9 rozb\u00edjej\u00ed zp\u011btnou kompatibilitu. Ale hlavn\u011b: <em>nelze se vyhnout obt\u00ed\u017en\u00e9mu rozhovoru.<\/em><\/p>\n<p><\/p>\n<p>Z m\u00e9 zku\u0161enosti, kdy\u017e t\u00fdmy rostou, u\u017e nen\u00ed mo\u017en\u00e9 udr\u017eet si celou syst\u00e9m v hlav\u011b, a to je ta nejd\u016fle\u017eit\u011bj\u0161\u00ed \u010d\u00e1st. Mus\u00edte zlep\u0161it viditelnost neshod v syst\u00e9mu. Mus\u00edte aktivn\u011b pracovat na tom, aby t\u00fdmy odtrhly pohled od sv\u00fdch komponent a pod\u00edvaly se na pr\u00e1ci ostatn\u00edch t\u00fdm\u016f a u\u017eivatel\u016f.<\/p>\n<p><\/p>\n<p>Ano, m\u016f\u017eete vytvo\u0159it n\u00e1stroje, kter\u00e9 se pokus\u00ed vy\u0159e\u0161it probl\u00e9m poly-repozit\u00e1\u0159\u016f. Ale m\u00e9 zku\u0161enosti s kontinu\u00e1ln\u00edm dod\u00e1v\u00e1n\u00edm a automatizac\u00ed ve velk\u00fdch podnic\u00edch mi \u0159\u00edkaj\u00ed n\u00e1sleduj\u00edc\u00ed: chov\u00e1n\u00ed ve v\u00fdchoz\u00edm nastaven\u00ed bez pou\u017eit\u00ed dodate\u010dn\u00fdch n\u00e1stroj\u016f je to, co o\u010dek\u00e1v\u00e1te vid\u011bt. <strong>Chov\u00e1n\u00ed poly-repozit\u00e1\u0159e ve v\u00fdchoz\u00edm nastaven\u00ed je izolace, to je cel\u00fd smysl. Chov\u00e1n\u00ed mono-repozit\u00e1\u0159e ve v\u00fdchoz\u00edm nastaven\u00ed je spole\u010dn\u00e1 odpov\u011bdnost a transparentnost, to je cel\u00fd smysl.<\/strong> V obou p\u0159\u00edpadech hodl\u00e1m vytvo\u0159it n\u00e1stroj, kter\u00fd vyhlad\u00ed ost\u0159ej\u0161\u00ed hrany. Jako vedouc\u00ed budu v\u017edy volit mono-repozit\u00e1\u0159, proto\u017ee n\u00e1stroje by m\u011bly posilovat kulturu, kterou chci, a kultura vych\u00e1z\u00ed z drobn\u00fdch rozhodnut\u00ed a ka\u017edodenn\u00ed pr\u00e1ce t\u00fdmu.<\/p>\n<p class=\"for_users_only_msg\">Pouze registrovan\u00ed u\u017eivatel\u00e9 se mohou \u00fa\u010dastnit ankety. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">P\u0159ihlaste se<\/a><\/noindex>, pros\u00edm.<\/p>\n<h2 class=\"default-block__polling-title\">Kdo jsou v\u011bt\u0161\u00ed fanatici? Zast\u00e1nci:<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Monorepozit\u00e1\u0159<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Rust<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    \u0160patn\u00e1 anketa \/ oboje<\/p>\n<\/li>\n<\/ul>\n<p>    Hlasovalo 33 u\u017eivatel\u016f. Zdr\u017eelo se 13 u\u017eivatel\u016f.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/453958\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432 \u043a\u0443\u0440\u0441\u0430 \u00abDevOps \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b\u00bb \u0432 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 OTUS. \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d \u0441\u043f\u043e\u0441\u043e\u0431\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0432\u0430\u0448\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u043d\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u2014 \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26181,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-34744","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432.\" \/>\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\/monorepozitorii-pozhalujsta-nado\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0430\u0434\u043e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:00:10+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:00:10+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\udd47Mono-repozit\u00e1\u0159e: pros\u00edm, je t\u0159eba | ProHoster","description":"P\u0159eklad \u010dl\u00e1nku byl p\u0159ipraven pro studenty.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438: \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0430\u0434\u043e | ProHoster","og:description":"\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u043e\u0432.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:00:10+00:00","article:modified_time":"2019-10-31T19:00:10+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"34744","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 20:28:56","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:15:38","updated":"2026-01-21 20:28:56","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\/34744","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=34744"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/34744\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/26181"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=34744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=34744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=34744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}