Es ist ein häufiges Szenario, dass sich die Codebasis eines Produkts, das sich in einem Repository in einem VCS-System befindet, so weit entwickelt, dass diese Codebasis möglicherweise mehrere Produkte enthält. Die Aufteilung der Codebasis auf mehrere VCS-Repositorys, von denen jedes einem einzelnen Produkt zugeordnet ist, kann verschiedene Vorteile bieten (siehe Vorteile eines Produkts pro VCS-Repository gegenüber dem Bloat-Repository-Modell weiter unten). Auf der technischen Seite ist das Aufteilen der Codebasis ein ziemlich einfacher Schritt, da die meisten VCS diesen Vorgang unterstützen. Die Aufteilung kann jedoch zu technischen Problemen im Zusammenhang mit automatisierten Tests, kontinuierlicher Bereitstellung, Service-Integration oder Überwachung führen (siehe Durch die Aufteilung aufgeworfene Probleme).) Organisationen, die eine solche Aufteilung planen, müssen daher wissen, wie dieser Übergang so reibungslos wie möglich durchgeführt werden kann, dh ohne dass ihre Liefer- und Überwachungs-Pipeline unterbrochen wird. Der erste Schritt besteht wahrscheinlich darin, den Projektbegriff besser zu verstehen und die Aufteilung in eine monolithische Codebasis zu skizzieren.
Bei den Antworten auf diese Fragen würde ich gerne sehen:
Ein Versuch, eine funktionierende Definition des Begriffs "Produkt" zu geben, die praktische Kriterien für die tatsächliche Abgrenzung von Produkten in einer vorhandenen Codebasis enthält.
Erstellen Sie gemäß dieser Arbeitsdefinition einen Plan, der die Aufteilung tatsächlich ausführt. Wir können die vereinfachende Annahme treffen, dass die Codebasis von einem vollautomatisierten SDLC verarbeitet wird, der eine kontinuierliche Integration und eine kontinuierliche Lieferung implementiert . Das heißt, jeder Zweig wird von einer automatisierten Testsuite validiert, die in der aktuellen Codebasis implementiert ist, und jeder Zusammenschluss zu einem „magischen“ Zweig generiert Produktartefakte , die getestet und bereitgestellt werden. ( Produktartefakte sind zB Quell-Tarballs, Dokumentation, binäre Softwarepakete, Docker- Images, AMIs, Unikerne.)
Ein solcher Plan ist zufriedenstellend, wenn er erklärt, wie man das umgeht
Durch die Trennung aufgeworfene Fragen
Wie hängen automatisierte Testverfahren mit dem bereits vorhandenen monolithischen Repository und den geteilten Repositorys zusammen?
Wie hängen automatisierte Bereitstellungsverfahren mit dem bereits vorhandenen monolithischen Repository und den geteilten Repositorys zusammen?
Wo ist der Code für die automatisierten Bereitstellungsverfahren selbst gespeichert?
Wo sind Strategien für gespeicherte Infrastruktur , Überwachung und Hochverfügbarkeit ?
So stellen Sie sicher, dass ein Entwickler jeweils nur eine Codebasis benötigt (verwendet jedoch möglicherweise Artefakte aus anderen Codebasen).
Wie kann ein Werkzeug wie Git-Bisect
Randnotiz: Vorteile eines Produkts pro VCS-Repository gegenüber dem Aufblähungs-Repository-Modell
Mehrere kleine Repositories, die die Codebasis für ein bestimmtes Produkt enthalten, bieten die folgenden Vorteile gegenüber dem Ansatz des "Aufblasen-Repositorys":
Mit einem Bloat-Repository ist es schwierig, ein Release zurückzusetzen, wenn ein Produkt instabil ist, da die Historie mit der Historie anderer Produkte gemischt ist.
Bei einem Aufblähungs-Repository ist es schwierig, den Projektverlauf zu überprüfen oder Informationen abzurufen. Bei kleinen Repositorys ist es wahrscheinlicher, dass wir diese Informationen lesen. (Dies ist möglicherweise spezifisch für VCS wie git, wo wir im Gegensatz zu svn keine Teilbäume auschecken können!)
Mit einem Bloat-Repository müssen wir viel mehr Branch-Dance machen, wenn wir uns entwickeln. Wenn wir N Repositorys haben, können wir parallel an N Zweigen arbeiten, wenn wir nur 1 Repository haben, können wir nur an einem Zweig arbeiten, oder wir haben eine Menge Arbeitskopien, die ebenfalls mühsam zu handhaben sind.
Mit mehreren kleinen Repositorys geben die Protokolle eine Heatmap des Projekts. Sie können sogar als Proxy für die Wissensverbreitung im Entwicklerteam verwendet werden: Wenn ich mich seit 3 Monaten nicht für repo X engagiere, kann es sinnvoll sein, mich einem Team zuzuordnen, das an repo X arbeitet, damit ich über die Entwicklungen auf dem Laufenden bin in dieser Komponente.
Mit kleinen Repositories ist es einfacher, sich einen klaren Überblick über eine Komponente zu verschaffen. Wenn sich alles in einem einzigen großen Speicher befindet, gibt es kein greifbares Artefakt, das jede Komponente abgrenzt, und die Codebasis kann leicht in Richtung der großen Schlammkugel driften .
Kleine Repositories zwingen uns, an Schnittstellen zwischen Komponenten zu arbeiten. Aber da wir eine gute Kapselung haben wollen, ist dies eine Arbeit, die wir sowieso tun sollten, deshalb würde ich dies als einen Vorteil für kleine Repositories ansehen.
Mit mehreren kleinen Repositories ist es einfacher, mehrere Produktbesitzer zu haben.
Bei mehreren kleinen Repositorys ist es einfacher, einfache Codestandards zu haben, die für ein vollständiges Repository relevant sind und die automatisch überprüft werden können.