{"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\/pl\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","title":{"rendered":"Monorepozytoria: prosz\u0119, trzeba","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Monorepozytoria: prosz\u0119, trzeba\" src=\"\/wp-content\/uploads\/2019\/05\/a973a60a06e7b336c08db26fa6d72149.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>T\u0142umaczenie artyku\u0142u przygotowane dla student\u00f3w kursu <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/g5Rz\/\">\u201ePraktyki i narz\u0119dzia DevOps\u201c<\/a><\/noindex> w projekcie edukacyjnym OTUS.<\/em><\/p>\n<p>Musisz wybra\u0107 monorepo, poniewa\u017c zachowanie, kt\u00f3re ono wspiera w twoich zespo\u0142ach \u2013 to przejrzysto\u015b\u0107 i wsp\u00f3lna odpowiedzialno\u015b\u0107, szczeg\u00f3lnie przy wzro\u015bcie zespo\u0142\u00f3w. W ka\u017cdym razie b\u0119dziesz musia\u0142 zainwestowa\u0107 w narz\u0119dzia, ale zawsze lepiej, gdy zachowaniem domy\u015blnym jest to, kt\u00f3re chcesz widzie\u0107 w swoich zespo\u0142ach. <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h1 id=\"pochemu-my-govorim-ob-etom\">Dlaczego o tym m\u00f3wimy?<\/h1>\n<p><\/p>\n<p>Matt Klein napisa\u0142 artyku\u0142 <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@mattklein123\/monorepos-please-dont-e9a279be011b\">\u201eMonorepos: Prosz\u0119, nie r\u00f3bcie tego!\u201d<\/a><\/noindex>\u200a (przyp. t\u0142umacza: t\u0142umaczenie na habrze <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/435306\/\">\u201eMonorepo: prosz\u0119, nie r\u00f3bcie tego\u201d<\/a><\/noindex>). Lubi\u0119 Matta, my\u015bl\u0119, \u017ce jest bardzo m\u0105dry i powiniene\u015b przeczyta\u0107 jego punkt widzenia. Pocz\u0105tkowo opublikowa\u0142 ankiet\u0119 na Twitterze:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Monorepozytoria: prosz\u0119, trzeba\" src=\"\/wp-content\/uploads\/2019\/05\/edbc65b80288045e08394821c17a77a9.JPG\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><em>T\u0142umaczenie:<\/em><br \/>\n<em>W ten noworoczny dzie\u0144 zamierzam za\u0142o\u017cy\u0107, jak absurdalne s\u0105 monorepo. Rok 2019 rozpocz\u0105\u0142 si\u0119 niezauwa\u017calnie. W tym duchu proponuj\u0119 ci ankiet\u0119. Kto jest najwi\u0119kszym fanatykiem? Zwolennicy:<\/em><br \/>\n\u2014 <em>Monorepo<\/em><br \/>\n\u2014 <em>Rust<\/em><br \/>\n\u2014 <em>B\u0142\u0119dna ankieta \/ obaj<\/em><\/p>\n<p><\/p>\n<p>Moja odpowied\u017a brzmia\u0142a: \u201eJestem dos\u0142ownie obie te osoby\u201d. Zamiast m\u00f3wi\u0107 o tym, jak Rust to narkotyk, przyjrzyjmy si\u0119, dlaczego my\u015bl\u0119, \u017ce si\u0119 myli w sprawie monorepo. Troch\u0119 o sobie. Jestem dyrektorem technicznym w Chef Software. Mamy oko\u0142o 100 in\u017cynier\u00f3w, baz\u0119 kodu licz\u0105c\u0105 oko\u0142o 11-12 lat i 4 g\u0142\u00f3wne produkty. Cz\u0119\u015b\u0107 tego kodu znajduje si\u0119 w polirepo (moja pocz\u0105tkowa pozycja), cz\u0119\u015b\u0107 w monorepo (moje obecne stanowisko).<\/p>\n<p><\/p>\n<p>Zanim zaczn\u0119: ka\u017cdy argument, kt\u00f3ry tu przedstawiam, b\u0119dzie dotyczy\u0142 obydwu typ\u00f3w repozytori\u00f3w. Moim zdaniem nie ma \u017cadnych technicznych powod\u00f3w, dla kt\u00f3rych powiniene\u015b wybra\u0107 jeden lub drugi typ repozytorium. Mo\u017cesz sprawi\u0107, \u017ce jakiekolwiek podej\u015bcie zadzia\u0142a. Ch\u0119tnie o tym porozmawiam, ale nie interesuj\u0105 mnie sztuczne techniczne powody, dla kt\u00f3rych jedno jest lepsze od drugiego. <\/p>\n<p><\/p>\n<p>Zgadzam si\u0119 z pierwsz\u0105 cz\u0119\u015bci\u0105 punktu widzenia Matta:<\/p>\n<p><\/p>\n<p><em>Poniewa\u017c w du\u017cej skali monorepo b\u0119dzie rozwi\u0105zywa\u0107 te same problemy, kt\u00f3re rozwi\u0105zuje polirepo, jednocze\u015bnie prowokuj\u0105c ci\u0119 do silniejszej sp\u00f3jno\u015bci twojego kodu i wymagaj\u0105c niewiarygodnych wysi\u0142k\u00f3w w zakresie zwi\u0119kszania skalowalno\u015bci twojego systemu kontroli wersji.<\/em><\/p>\n<p><\/p>\n<p>B\u0119dziesz musia\u0142 zmierzy\u0107 si\u0119 z takimi samymi problemami, niezale\u017cnie od tego, czy wybierzesz monorepo, czy polirepo. Jak wydajesz wersje? Jakie masz podej\u015bcie do aktualizacji? Wsteczna kompatybilno\u015b\u0107? Wzajemne zale\u017cno\u015bci projekt\u00f3w? Jakie style architektury s\u0105 akceptowalne? Jak zarz\u0105dzasz swoj\u0105 infrastruktur\u0105 budowania i testowania? Lista jest niesko\u0144czona. I b\u0119dziesz rozwi\u0105zywa\u0107 je wszystkie w miar\u0119 rozwoju. Nic nie ma za darmo.<\/p>\n<p><\/p>\n<p>Uwa\u017cam, \u017ce argumentacja Matta odzwierciedla pogl\u0105dy wielu in\u017cynier\u00f3w (i mened\u017cer\u00f3w), kt\u00f3rych szanuj\u0119. Wynika to z perspektywy in\u017cyniera pracuj\u0105cego nad komponentem lub zespo\u0142u pracuj\u0105cego nad komponentem. S\u0142yszy si\u0119 takie rzeczy jak:<\/p>\n<p><\/p>\n<ul>\n<li>Baza kodu jest przyt\u0142aczaj\u0105ca - nie potrzebuj\u0119 ca\u0142ego tego ba\u0142aganu.<\/li>\n<li>Trudniej to testowa\u0107, poniewa\u017c musz\u0119 sprawdzi\u0107 ca\u0142y ten ba\u0142agan, kt\u00f3ry nie jest mi potrzebny.<\/li>\n<li>Trudniej jest pracowa\u0107 z zewn\u0119trznymi zale\u017cno\u015bciami.<\/li>\n<li>Potrzebuj\u0119 swoich w\u0142asnych system\u00f3w zarz\u0105dzania wersjami.<\/li>\n<\/ul>\n<p><\/p>\n<p>Z pewno\u015bci\u0105 wszystkie te punkty s\u0105 uzasadnione. Dotyczy to obu przypadk\u00f3w \u2014 w polirepo mam sw\u00f3j ba\u0142agan, opr\u00f3cz tego, kt\u00f3ry potrzebny jest do budowy... Mog\u0119 potrzebowa\u0107 jeszcze wi\u0119cej ba\u0142aganu. Dlatego po prostu tworz\u0119 narz\u0119dzia, kt\u00f3re wykonuj\u0105 checkout ca\u0142ego projektu. Albo tworz\u0119 fa\u0142szywe monorepo z submodu\u0142ami. Mogliby\u015bmy o tym rozmawia\u0107 ca\u0142y dzie\u0144. Ale my\u015bl\u0119, \u017ce argument Matta pomija g\u0142\u00f3wny pow\u00f3d, za kt\u00f3rym silnie opowiadam si\u0119 za monorepo:<\/p>\n<p><\/p>\n<h1 id=\"on-provociruet-obschenie-i-pokazyvaet-problemy\">Wzbudza to komunikacj\u0119 i ujawnia problemy.<\/h1>\n<p><\/p>\n<p>Kiedy dzielimy repozytoria, de facto tworzymy problem z koordynacj\u0105 i przejrzysto\u015bci\u0105. Odpowiada to temu, jak my\u015blimy o zespo\u0142ach (szczeg\u00f3lnie temu, jak my\u015bl\u0105 o nich poszczeg\u00f3lni cz\u0142onkowie): ponosimy odpowiedzialno\u015b\u0107 za okre\u015blony komponent. Pracujemy w stosunkowej izolacji. Granice s\u0105 ustalane na moim zespole i komponentach, nad kt\u00f3rymi pracujemy.<\/p>\n<p><\/p>\n<p>W miar\u0119 komplikacji architektury jedna dru\u017cyna nie mo\u017ce ju\u017c sama ni\u0105 zarz\u0105dza\u0107. Bardzo niewielu in\u017cynier\u00f3w ma ca\u0142y system w g\u0142owie. Za\u0142\u00f3\u017cmy, \u017ce zarz\u0105dzasz wsp\u00f3lnym komponentem A, kt\u00f3ry jest u\u017cywany przez zespo\u0142y B, C i D. Zesp\u00f3\u0142 A przeprowadza refaktoryzacj\u0119, ulepsza API, a tak\u017ce zmienia wewn\u0119trzn\u0105 implementacj\u0119. W rezultacie zmiany nie s\u0105 wstecznie kompatybilne. Jak\u0105 rad\u0119 by\u015b da\u0142?<\/p>\n<p><\/p>\n<ul>\n<li>Znajd\u017a wszystkie miejsca, w kt\u00f3rych u\u017cywane jest stare API.<\/li>\n<li>Czy s\u0105 miejsca, w kt\u00f3rych nowe API nie mo\u017ce by\u0107 u\u017cywane?<\/li>\n<li>Czy mo\u017cesz poprawi\u0107 i przetestowa\u0107 inne komponenty, aby upewni\u0107 si\u0119, \u017ce nie ulegn\u0105 awarii?<\/li>\n<li>Czy te zespo\u0142y mog\u0105 sprawdzi\u0107 twoje zmiany teraz?<\/li>\n<\/ul>\n<p><\/p>\n<p>Zauwa\u017c, \u017ce te pytania nie zale\u017c\u0105 od typu repozytorium. B\u0119dziesz musia\u0142 znale\u017a\u0107 zespo\u0142y B, C i D. Musisz z nimi porozmawia\u0107, ustali\u0107 czas, zrozumie\u0107 ich priorytety. Przynajmniej mamy nadziej\u0119, \u017ce to zrobisz.<\/p>\n<p><\/p>\n<p>Tak naprawd\u0119 nikt nie chce si\u0119 tym zaj\u0105\u0107. To znacznie mniej ekscytuj\u0105ce ni\u017c po prostu naprawienie cholernie API. To wszystko jest ludzkie i skomplikowane. W repozytorium polimorficznym mo\u017cesz po prostu wprowadza\u0107 zmiany, podda\u0107 to przegl\u0105dowi tym, kt\u00f3rzy pracuj\u0105 nad tym komponentem (prawdopodobnie nie B, C ani D), i i\u015b\u0107 dalej. Zespo\u0142y B, C i D mog\u0105 na razie pozosta\u0107 przy swojej aktualnej wersji. Zaktualizuj\u0105 si\u0119, gdy zdob\u0119d\u0105 twoj\u0105 genialno\u015b\u0107!<\/p>\n<p><\/p>\n<p>W monorepozytorium odpowiedzialno\u015b\u0107 przesuwa si\u0119 domy\u015blnie. Zesp\u00f3\u0142 A zmienia sw\u00f3j komponent i, je\u015bli nie zachowa ostro\u017cno\u015bci, natychmiast \u0142amie B, C i D. To prowadzi do sytuacji, w kt\u00f3rej B, C i D pojawiaj\u0105 si\u0119 u drzwi A, zastanawiaj\u0105c si\u0119, dlaczego zesp\u00f3\u0142 A z\u0142ama\u0142 budow\u0119. To uczy A, \u017ce nie mog\u0105 pomin\u0105\u0107 mojej listy powy\u017cej. Musz\u0105 rozmawia\u0107 o tym, co zamierzaj\u0105 zrobi\u0107. Czy B, C i D mog\u0105 dzia\u0142a\u0107? Co je\u015bli B i C mog\u0105, ale D by\u0142o \u015bci\u015ble zwi\u0105zane z efektem ubocznym zachowania starego algorytmu?<\/p>\n<p><\/p>\n<p>Nast\u0119pnie musimy porozmawia\u0107 o tym, jak wyj\u015b\u0107 z tej sytuacji:<\/p>\n<p><\/p>\n<ol>\n<li>Wsparcie wielu wewn\u0119trznych API, przy czym stary algorytm b\u0119dzie oznaczony jako przestarza\u0142y, dop\u00f3ki D nie b\u0119dzie mog\u0142o przesta\u0107 go u\u017cywa\u0107.<\/li>\n<li>Wsparcie wielu wersji wyda\u0144, jedna ze starym interfejsem, jedna z nowym.<\/li>\n<li>Op\u00f3\u017anienie wydania zmian A, dop\u00f3ki jednocze\u015bnie B, C i D nie b\u0119d\u0105 mog\u0142y ich zaakceptowa\u0107.<\/li>\n<\/ol>\n<p><\/p>\n<p>Za\u0142\u00f3\u017cmy, \u017ce wybrali\u015bmy 1, kilka interfejs\u00f3w API. W takim przypadku mamy dwa kawa\u0142ki kodu. Stary i nowy. Do\u015b\u0107 wygodne w niekt\u00f3rych sytuacjach. Przywracamy stary kod, oznaczamy go jako przestarza\u0142y (deprecated) i uzgadniamy harmonogram jego usuni\u0119cia z zespo\u0142em D. Zasadniczo jest to identyczne zar\u00f3wno dla poli, jak i dla monorepozytori\u00f3w.<\/p>\n<p><\/p>\n<p>Do wydania kilku wersji potrzebujemy ga\u0142\u0119zi. Teraz mamy dwa komponenty \u2014 A1 i A2. Zespo\u0142y B i C korzystaj\u0105 z A2, a D z A1. Musimy upewni\u0107 si\u0119, \u017ce ka\u017cdy komponent jest gotowy do wydania, poniewa\u017c zanim D b\u0119dzie mog\u0142o p\u00f3j\u015b\u0107 dalej, mog\u0105 by\u0107 wymagane aktualizacje zabezpiecze\u0144 i poprawki b\u0142\u0119d\u00f3w. W poli-repozytorium mo\u017cemy to ukry\u0107 w d\u0142ugo\u017cyj\u0105cej ga\u0142\u0119zi, kt\u00f3ra czuje si\u0119 dobrze. W monorepozytorium wymuszamy tworzenie kodu w nowym module. Zesp\u00f3\u0142 D wci\u0105\u017c b\u0119dzie musia\u0142 wprowadzi\u0107 zmiany w \"starym\" komponencie. Ka\u017cdy mo\u017ce zobaczy\u0107 koszty, kt\u00f3re tutaj ponosimy \u2014 mamy teraz dwa razy wi\u0119cej kodu, a wszelkie poprawki b\u0142\u0119d\u00f3w, kt\u00f3re s\u0105 stosowane do A1 i A2, musz\u0105 by\u0107 stosowane do obu. Przy podej\u015bciu z u\u017cyciem ga\u0142\u0119zi w poli-repozytorium jest to ukryte za cherry-pick. Uwa\u017camy koszt za mniejszy, poniewa\u017c nie ma tam dublowania. Z praktycznego punktu widzenia, koszt jest taki sam: b\u0119dziesz tworzy\u0107, wydawa\u0107 i utrzymywa\u0107 dwa zasadniczo identyczne bazy kodu, dop\u00f3ki nie b\u0119dziesz m\u00f3g\u0142 usun\u0105\u0107 jednego z nich. R\u00f3\u017cnica polega na tym, \u017ce w monorepozytorium ten b\u00f3l jest bezpo\u015bredni i widoczny. <strong>To jeszcze gorsze, a to dobrze.<\/strong><\/p>\n<p><\/p>\n<p>W ko\u0144cu dotarli\u015bmy do trzeciego punktu. Op\u00f3\u017anienie w wydaniu. Mo\u017cliwe, \u017ce zmiany wprowadzone przez zesp\u00f3\u0142 A poprawi\u0105 \u017cycie zespo\u0142u A. Wa\u017cne, ale nie pilne. Czy mo\u017cemy po prostu to op\u00f3\u017ani\u0107? W monorepozytorium popychamy to do ustalenia artefaktu. Oczywi\u015bcie m\u00f3wimy o tym z zespo\u0142em D. Po prostu pozosta\u0144cie przy starej wersji, a\u017c nadrobicie! To sprawia, \u017ce gra si\u0119 w strach. Zesp\u00f3\u0142 A ci\u0105gle pracuje nad swoim komponentem, ignoruj\u0105c fakt, \u017ce zesp\u00f3\u0142 D u\u017cywa coraz bardziej przestarza\u0142ej wersji (to problem zespo\u0142u D, s\u0105 g\u0142upi). W mi\u0119dzyczasie zesp\u00f3\u0142 D \u017ale si\u0119 wypowiada o lekkomy\u015blnym podej\u015bciu zespo\u0142u A do stabilno\u015bci kodu, je\u015bli w og\u00f3le o tym m\u00f3wi\u0105. Mijaj\u0105 miesi\u0105ce. W ko\u0144cu zesp\u00f3\u0142 D postanawia spojrze\u0107 na mo\u017cliwo\u015b\u0107 aktualizacji, ale zmian w A tylko przybywa. Zesp\u00f3\u0142 A ledwo pami\u0119ta, kiedy i jak z\u0142amali D. Aktualizacja jest bardziej bolesna i zajmie wi\u0119cej czasu. Co przesuwa to dalej w d\u00f3\u0142 listy priorytet\u00f3w. Do momentu, gdy pojawi si\u0119 problem z bezpiecze\u0144stwem w A, co zmusza nas do utworzenia ga\u0142\u0119zi. Zesp\u00f3\u0142 A musi cofn\u0105\u0107 si\u0119 w czasie, znale\u017a\u0107 moment, w kt\u00f3rym D by\u0142o stabilne, naprawi\u0107 problem i przygotowa\u0107 je do wydania. <strong>To de facto wyb\u00f3r, kt\u00f3ry ludzie robi\u0105, i z pewno\u015bci\u0105 jest to najgorsze.<\/strong> Wydaje si\u0119, \u017ce to dobrze zar\u00f3wno dla zespo\u0142u A, jak i D, dop\u00f3ki mo\u017cemy ignorowa\u0107 si\u0119 nawzajem.<\/p>\n<p><\/p>\n<p>W monorepozytorium trzeci \u2014 naprawd\u0119 nie jest opcj\u0105. Musicie radzi\u0107 sobie z sytuacj\u0105 na jeden z dw\u00f3ch sposob\u00f3w. Musicie widzie\u0107 koszty posiadania dw\u00f3ch ga\u0142\u0119zi wydania. Nauczy\u0107 si\u0119 chroni\u0107 przed aktualizacjami, kt\u00f3re \u0142ami\u0105 zgodno\u015b\u0107 wsteczn\u0105. Ale najwa\u017cniejsze: <em>nie unikniesz trudnej rozmowy.<\/em><\/p>\n<p><\/p>\n<p>Z mojego do\u015bwiadczenia, gdy zespo\u0142y staj\u0105 si\u0119 du\u017ce, nie ma ju\u017c mo\u017cliwo\u015bci \u015bledzenia ca\u0142ego systemu, i to jest najwa\u017cniejsza cz\u0119\u015b\u0107. Musisz poprawi\u0107 widoczno\u015b\u0107 rozbie\u017cno\u015bci w systemie. Musisz aktywnie pracowa\u0107, aby sk\u0142oni\u0107 zespo\u0142y do oderwania wzroku od swoich komponent\u00f3w i spojrzenia na prac\u0119 innych zespo\u0142\u00f3w i u\u017cytkownik\u00f3w.<\/p>\n<p><\/p>\n<p>Tak, mo\u017cesz stworzy\u0107 narz\u0119dzia, kt\u00f3re spr\u00f3buj\u0105 rozwi\u0105za\u0107 problem polirepozytori\u00f3w. Jednak moje do\u015bwiadczenie w zakresie ci\u0105g\u0142ej dostawy i automatyzacji w du\u017cych przedsi\u0119biorstwach m\u00f3wi mi jedno: domy\u015blne zachowanie, bez u\u017cycia dodatkowych narz\u0119dzi, to w\u0142a\u015bnie to, czego mo\u017cesz si\u0119 spodziewa\u0107. <strong>Domy\u015blne zachowanie polirepozytori\u00f3w to izolacja, to jest ca\u0142y sens. Domy\u015blne zachowanie monorepozytori\u00f3w to wsp\u00f3lna odpowiedzialno\u015b\u0107 i przezroczysto\u015b\u0107, to jest ca\u0142y sens.<\/strong> W obu przypadkach zamierzam stworzy\u0107 narz\u0119dzie, kt\u00f3re pozwoli wyg\u0142adzi\u0107 ostre kraw\u0119dzie. Jako lider wybior\u0119 monorepozytorium za ka\u017cdym razem, poniewa\u017c narz\u0119dzia powinny wzmacnia\u0107 kultur\u0119, kt\u00f3r\u0105 pragn\u0119, a kultura wynika z drobnych decyzji i codziennej pracy zespo\u0142u.<\/p>\n<p class=\"for_users_only_msg\">Tylko zarejestrowani u\u017cytkownicy mog\u0105 bra\u0107 udzia\u0142 w ankiecie. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Zaloguj si\u0119<\/a><\/noindex>, prosz\u0119.<\/p>\n<h2 class=\"default-block__polling-title\">Kto jest wi\u0119kszym fanatykiem? Zwolennicy:<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Monorepo<\/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>                    B\u0142\u0119dna ankieta \/ obaj<\/p>\n<\/li>\n<\/ul>\n<p>    33 u\u017cytkownik\u00f3w zag\u0142osowa\u0142o. 13 u\u017cytkownik\u00f3w wstrzyma\u0142o si\u0119 od g\u0142osu.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <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.1.1 - 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\/pl\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Monorepozytoria: prosz\u0119, trzeba | ProHoster","description":"T\u0142umaczenie artyku\u0142u przygotowane dla student\u00f3w.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/monorepozitorii-pozhalujsta-nado","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/34744","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=34744"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/34744\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/26181"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=34744"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=34744"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=34744"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}