Am 15. und 16. April fand die CITCON Europe in Cluj-Napoca (Transsylvanien) statt. Die CITCON ist eine Open-Spaces-Konferenz. Die Tagesordnung wird von den Konferenzteilnehmern selbst zusammengestellt. Daher gibt es immer ein paar nette Mitbringsel. In diesem Jahr stellte Ivan Moore(@ivanrmoore) die Behauptung auf, dass Sie ohne Monorepos keine CI betreiben können. Ein Monorepo ist einfach ein Repository, in dem der gesamte Quellcode landet. Dies steht im Gegensatz zu einer Einrichtung mit (zum Beispiel) Git Source Control, bei der Sie ein einzelnes Repository pro Modul haben. Die Idee, ein einziges (großes) Repository mit dem gesamten Code zu haben, erscheint seltsam. Nach einer gründlichen Diskussion waren mir die Vorzüge von Monorepos klar.
Nehmen wir ein Szenario mit 2 Diensten, die von einem Modul mit gemeinsamem Code abhängen. Jeder Dienst muss die Version des gemeinsamen Moduls selbst verwalten - daher werden die letzten Änderungen am gemeinsamen Modul nicht in die Dienste integriert. Jetzt erhöhen Sie die Version des gemeinsamen Moduls.
Ganz zu schweigen von der Buchhaltung, die Sie erledigen müssen, wenn Sie sie brauchen
- Entwicklung einiger allgemeiner Funktionen in Service 1
- Sobald es für Service 1 funktioniert, verschieben Sie den Code in das gemeinsame Repo
- Erstellen Sie die Freigabe des Repos
- Aktualisieren Sie die Version des gemeinsamen Moduls in Dienst 1
- Aktualisieren Sie eventuell die Version des gemeinsamen Moduls in Dienst 2
- Das Repository kann ziemlich groß werden. Dies verlangsamt nur den ersten Checkout[1]. Es würde aber wahrscheinlich mehr Zeit in Anspruch nehmen, eine Reihe von Repos auszuchecken.
- Wird das Repository langsam werden? Nun, der Linux-Kernel wird in einem einzigen Repository verwaltet. Wenn Ihre Codebasis so viele Codezeilen umfasst (derzeit etwa 17 Millionen), können Sie entscheiden, ob es sinnvoll ist, die Codebasis aufzuteilen oder in Werkzeuge zu investieren.
- Jeder kann jeden Code ändern. Ja, natürlich! Deshalb haben Sie ja auch die Versionskontrolle. Das Wichtigste ist, dass Sie die Codeänderungen verfolgen und sehen können, wer sie vorgenommen hat.
- Alle pushen den gesamten Code in ein Repository, so dass Sie die ganze Zeit aktualisieren/ziehen/rebasieren müssen. In der Praxis erweist sich dies nicht als wirkliches Problem: Wenn Sie Pull Requests verwenden, ist die Anzahl der Commits auf dem Master-Zweig nicht so groß. Wenn Sie eine trunk-basierte Entwicklung betreiben ( ), integrieren Sie ständig alles. Es gibt keine Überschneidungen zwischen Code, der für Service 1 und Service 2 übertragen wurde, d.h. es gibt keine Merge-Konflikte.
- Sie müssen Ihre CI-Builds auf intelligente Weise einrichten, so dass nicht alles bei jedem Commit gebaut wird. Moderne Build-Tools können damit umgehen. Wenn nicht, müssen Sie ein Skript schreiben, das diese Aufgabe übernimmt. Das ist kein Problem, denn es wird in dasselbe Repository übertragen und ist daher immer auf dem neuesten Stand mit dem Rest des Codes.
Verfasst von

Arjan Molenaar
Contact