Entschuldigung für diesen langen Beitrag, aber ich denke, es lohnt sich.
Ich habe gerade mit einem kleinen .NET-Shop angefangen, der ganz anders funktioniert als andere Orte, an denen ich gearbeitet habe. Im Gegensatz zu meinen vorherigen Positionen richtet sich die hier beschriebene Software an mehrere Kunden und nicht jeder Kunde erhält gleichzeitig die neueste Version der Software. Daher gibt es keine "aktuelle Produktionsversion". Wenn ein Kunde ein Update erhält, erhält er auch alle Funktionen, die der Software seit dem letzten Update hinzugefügt wurden. Dies ist möglicherweise schon lange her. Die Software ist in hohem Maße konfigurierbar und Funktionen können ein- und ausgeschaltet werden: sogenannte "Feature-Toggles". Die Release-Zyklen sind hier sehr eng, tatsächlich liegen sie nicht im Zeitplan: Wenn eine Funktion abgeschlossen ist, wird die Software für den jeweiligen Kunden bereitgestellt.
Das Team ist erst letztes Jahr von Visual Source Safe zu Team Foundation Server gewechselt. Das Problem ist, dass sie TFS weiterhin wie VSS verwenden und Checkout-Sperren für einen einzelnen Codezweig erzwingen. Immer wenn eine Fehlerbehebung ins Feld gebracht wird (sogar für einen einzelnen Kunden), erstellen sie einfach alles, was in TFS enthalten ist. Testen Sie, ob der Fehler behoben wurde, und stellen Sie ihn dem Kunden zur Verfügung! (Ich komme aus einem Pharma-und Medizinprodukte-Software-Hintergrund das ist unglaublich!). Das Ergebnis ist, dass halb gebackener Entwicklercode in die Produktion geht, ohne dass er getestet wird. Bugs schlüpfen immer in Release-Builds, aber oft sieht ein Kunde, der gerade einen Build erhalten hat, diese Bugs nicht, wenn er die Funktion, in der sich der Bug befindet, nicht verwendet. Der Director weiß, dass dies ein Problem ist, da das Unternehmen langsam wächst plötzlich mit einigen großen Kunden an Bord und mehr kleineren.
Ich wurde gebeten, mir die Optionen für die Quellcodeverwaltung anzuschauen, um die Bereitstellung von fehlerhaftem oder unvollendetem Code zu verhindern, aber nicht die etwas asynchrone Natur der Teamversionen zu opfern. Ich habe in meiner Karriere VSS, TFS, SVN und Bazaar verwendet, aber TFS ist der Ort, an dem ich am meisten Erfahrung gesammelt habe.
Früher haben die meisten Teams, mit denen ich gearbeitet habe, eine Zwei- oder Drei-Zweig-Lösung von Dev-Test-Prod verwendet, bei der Entwickler einen Monat lang direkt in Dev arbeiten und dann die Änderungen zu Test, dann zu Prod zusammengeführt oder "wenn es fertig ist" befördert werden ein fester Zyklus. Es wurden automatisierte Builds verwendet, entweder mit Tempomat oder Teambuild. In meinem vorherigen Job wurde Bazaar über SVN verwendet: Entwickler arbeiteten in ihren eigenen kleinen Feature-Zweigen und setzten dann ihre Änderungen auf SVN (das mit TeamCity verknüpft war). Das war insofern schön, als es einfach war, Veränderungen zu isolieren und sie mit anderen Völkern zu teilen.
Bei beiden Modellen gab es einen zentralen Entwicklungs- und Prod-Zweig (und manchmal auch einen Testzweig), durch den Code gesendet wurde (und Labels wurden verwendet, um Builds in Prod zu kennzeichnen, aus denen Releases erstellt wurden ... und diese wurden zu Zweigen für Bugfixes gemacht zu Releases und fusionierte zurück zu dev). Dies passt jedoch nicht wirklich zur Arbeitsweise hier: Es gibt keine Reihenfolge, wann verschiedene Features veröffentlicht werden, sie werden gepusht, wenn sie vollständig sind.
Mit dieser Anforderung bricht der Ansatz der "kontinuierlichen Integration", wie ich ihn sehe, zusammen. Um ein neues Feature mit kontinuierlicher Integration herauszubringen, muss es über dev-test-prod gepusht werden, und noch nicht abgeschlossene Arbeiten in dev werden erfasst.
Ich denke, um dies zu überwinden, sollten wir ein stark funktionsverzweigtes Modell ohne Dev-Test-Prod-Verzweigungen verwenden. Stattdessen sollte die Quelle als eine Reihe von Funktionsverzweigungen existieren, die nach Abschluss der Entwicklungsarbeiten gesperrt, getestet, repariert und gesperrt werden getestet und dann freigegeben. Andere Feature-Zweige können Änderungen von anderen Zweigen abrufen, wenn sie benötigt werden / möchten, sodass alle Änderungen letztendlich in alle anderen übernommen werden. Das passt sehr gut zu einem reinen Basarmodell, das ich bei meinem letzten Job erlebt habe.
So flexibel das auch klingt, es scheint seltsam, irgendwo keinen Dev-Trunk oder Prod-Zweig zu haben, und ich mache mir Sorgen, dass Zweige sich nicht wieder integrieren lassen oder kleine späte Änderungen vorgenommen werden, über die sich andere Zweige und Entwickler nicht beschweren Zusammenführen von Katastrophen ...
Was denken die Leute darüber?
Eine zweite letzte Frage: Ich bin etwas verwirrt über die genaue Definition der verteilten Quellcodeverwaltung: Einige Leute scheinen zu vermuten, dass es sich nur um kein zentrales Repository wie TFS oder SVN handelt, andere sagen, dass die Verbindung getrennt wird (SVN ist zu 90% getrennt) und TFS hat einen perfekt funktionierenden Offline-Modus) und andere sagen, es geht um Feature Branching und die einfache Zusammenführung zwischen Zweigen ohne Eltern-Kind-Beziehung (TFS hat auch eine unbegründete Zusammenführung!). Vielleicht ist das eine zweite Frage!