Monorepo
Jak działa
Wszystkie projekty żyją w jednym drzewie katalogów jednego repozytorium. Dedykowane narzędzia (np. Nx, Turborepo, Bazel) analizują zależności między projektami i budują graf zadań, dzięki czemu operacje budowania, testowania i lintowania wykonują się tylko dla projektów dotkniętych daną zmianą oraz dla ich zależnych. Wyniki zadań są cache’owane (lokalnie i zdalnie), co pozwala pomijać ponowne wykonywanie niezmienionej pracy. Pojedyncza zmiana może atomowo zmodyfikować kilka projektów naraz w jednym commicie, a wspólny pipeline CI weryfikuje całość. Organizacje o bardzo dużych bazach kodu stosują dodatkowo wyspecjalizowane systemy kontroli wersji skalujące się do miliardów linii (Piper w Google, Sapling w Meta).
Rozwiązany problem
W modelu wielu osobnych repozytoriów (polyrepo) współdzielenie kodu wymaga publikowania i wersjonowania pakietów, a zmiana obejmująca kilka projektów rozpada się na wiele ręcznie koordynowanych commitów i pull requestów. Prowadzi to do utraty kontekstu, duplikacji konfiguracji i rozjazdu wersji zależności. Monorepo rozwiązuje te problemy, umożliwiając atomowe zmiany międzyprojektowe, jedno źródło prawdy dla zależności i współdzielenie kodu bez narzutu publikacji pakietów.
Komponenty
Jedno repozytorium (np. Git) przechowujące cały kod organizacji lub produktu w jednym drzewie katalogów.
Jawnie wydzielone projekty (aplikacje, biblioteki, narzędzia) z enkapsulacją, odróżniające monorepo od zwykłej kolokacji kodu.
Model zależności między projektami, na podstawie którego narzędzia określają, co zbudować i przetestować po zmianie.
Narzędzia (Nx, Turborepo, Bazel) wykonujące zadania tylko dla zmienionych projektów i cache’ujące wyniki lokalnie oraz zdalnie.
Implementacja
Ewolucja
Artykuł Rachel Potvin i Josha Levenberga „Why Google Stores Billions of Lines of Code in a Single Repository” spopularyzował monorepo w dużej skali.
Hiperparametry (konfigurowalne osie)
Jak drobnoziarniście definiowane są projekty i ich wzajemne zależności.
Strategia cache’owania wyników zadań (lokalnie i/lub zdalnie), kluczowa dla skalowalności monorepo.
Sposób zrównoleglania i kolejkowania zadań budowania/testów w oparciu o graf zależności.
Reguły własności i uprawnień (np. CODEOWNERS) wyznaczające odpowiedzialność zespołów za części monorepo.