Was ist der beste Weg, um die Produktversionierung und Verzweigung langfristiger Projekte zu handhaben?


21

Wie lassen sich Produktversionen und Verzweigungen der Codebasis im Allgemeinen bei langfristigen Projekten, für die während des Produktlebenszyklus möglicherweise mehrere Releases vorliegen und die Unterstützung früherer Produkte erfordern, am besten handhaben?

Nehmen Sie genauer an, dass eine ordnungsgemäße verteilte Versionskontrolle vorhanden ist (z. B. Git) und dass die Teams klein bis groß sind und dass der Entwickler möglicherweise an mehreren Projekten gleichzeitig arbeitet. Das Hauptproblem ist, dass es eine vertragliche Verpflichtung gibt, alte Versionen zu unterstützen, wie sie zu der Zeit existierten, was bedeutet, dass Neuentwicklungen alten Code nicht patchen können (Microsoft Office-Produkte könnten ein Beispiel dafür sein, Sie erhalten nur Patches für das Spieljahr, das Sie besitzen).

Infolgedessen ist die aktuelle Produktversionierung ein bisschen kompliziert, da jedes Hauptprodukt mehrere Abhängigkeiten aufweist, von denen jede eine eigene Version hat, die sich zwischen den jährlichen Releases ändern kann. Während jedes Produkt über ein eigenes Repository verfügt, wird der größte Teil der Arbeit nicht auf dem Hauptquellstamm, sondern auf einem Zweig für die Produktfreigabe in diesem Jahr ausgeführt, wobei ein neuer Zweig erstellt wird, wenn das Produkt freigegeben wird, damit es unterstützt wird. Dies bedeutet wiederum, dass das Abrufen der Codebasis eines Produkts keine einfache Angelegenheit ist, wie man vielleicht bei der Verwendung der Versionskontrolle denkt.


2
Ohne weitere Informationen zu den Produkten, Projekten und der Organisation der Entwicklungsteams ist es sehr schwierig, eine Antwort zu finden, die nicht mit Einschränkungen behaftet ist.
ChrisF

@ChrisF - Ich arbeite an Hintergrundinformationen, aber ich bin mir ziemlich sicher, dass auch andere Entwickler hier rumhängen, also muss ich die Unschuldigen / Schuldigen beschützen.
rjzii


Am besten überprüfen Sie andere Fragen - wie die oben genannten - und fragen Sie dann nach den Stellen, die sie nicht behandeln.
ChrisF

@ChrisF - Ja, ich habe einige der anderen Fragen durchgearbeitet und mich wegen dieser Fragen in die Warteschlange gestellt, aber die bringen mich noch nicht ganz hin. Wahrscheinlich werde ich diese Frage im Laufe der Zeit viel bearbeiten. Das größte Problem, auf das wir stoßen, ist die Unterstützung früherer Builds, was die Verwendung des Trunks für Versionsmeilensteine ​​ausschließt, die andere für git erwähnt haben.
rjzii

Antworten:


20

Wie viel (und welche Art von) Struktur Sie benötigen, hängt stark davon ab, was Sie können möchten. Finde heraus, ohne was du nicht leben kannst, was du haben möchtest und was dir egal ist.

Ein gutes Beispiel für eine Reihe von Entscheidungen könnte sein:

Dinge, ohne die wir nicht leben können:

  • in der Lage sein, frühere Releases jederzeit zu rekonstruieren
  • Sie können jederzeit mehrere unterstützte Hauptversionen des Produkts verwalten

Dinge, die wir gerne hätten:

  • in der Lage sein, fortlaufend wichtige Funktionen (für die nächste Hauptversion) zu entwickeln, ohne sich um Zusammenführungen von Zweigen sorgen zu müssen
  • in der Lage sein, Wartungsupdates für frühere Versionen durchzuführen

Dinge, ohne die wir leben können:

  • automatisierte Rückportierung von Änderungen aus der aktuellen Arbeit in frühere Versionen
  • Unterbrechen Sie niemals die Entwicklung wichtiger Funktionen, auch nicht für einige Tage oder eine Woche

Wenn die oben genannten Ziele Ihre wären, könnten Sie einen Prozess wie den folgenden anwenden:

  1. Mach alle Entwicklungsarbeiten am Trunk deines VCS ("master" in git)
  2. Wenn Sie sich einer Hauptversion nähern, halten Sie die Entwicklung der Hauptfunktionen an und konzentrieren Sie sich eine Woche lang auf die Systemstabilität
  3. Wenn der Stamm stabil zu sein scheint, erstellen Sie einen Zweig für diese Hauptversion
  4. Die Hauptfeature-Entwicklung kann nun auf dem Trunk fortgesetzt werden, während auf dem Zweig nur Bugfixes und Release-Vorbereitungen zulässig sind
  5. Alle Fehlerkorrekturen, die am Zweig vorgenommen werden sollen, müssen jedoch zuerst am Trunk getestet werden. dies stellt sicher, dass sie auch in zukünftigen Versionen vorhanden sind
  6. Erstellen Sie ein (VCS) -Tag in der Verzweigung, wenn Sie bereit sind, es freizugeben. Mit diesem Tag kann das Release jederzeit neu erstellt werden, auch nach weiteren Arbeiten an demselben Zweig
  7. Weitere Wartungsversionen zu dieser Hauptversion (Nebenversionen) können jetzt in der Zweigstelle vorbereitet werden. Jedes wird vor der Veröffentlichung markiert
  8. In der Zwischenzeit kann die Entwicklung der Hauptfunktionen, die auf die nächste Hauptversion abzielen, auf dem Kofferraum fortgesetzt werden
  9. Wenn Sie sich dieser Version nähern, wiederholen Sie die obigen Schritte, und erstellen Sie einen neuen Versionszweig für diese Version . Auf diese Weise können Sie mehrere Hauptversionen, die sich jeweils in einem Zweig befinden, gleichzeitig im unterstützten Status haben und separate Nebenversionen für jede Version freigeben.

Dieser Prozess beantwortet nicht alle Ihre Fragen. Insbesondere benötigen Sie einen Prozess, um zu entscheiden, welche Korrekturen an einem Release-Zweig vorgenommen werden können, und um sicherzustellen, dass Fehler nicht zuerst in einem Release-Zweig behoben werden (solche Korrekturen) sollte nach Möglichkeit immer am Kofferraum getestet werden). Aber es gibt Ihnen einen Rahmen, in dem Sie solche Entscheidungen treffen können.


+1 Ich möchte jedoch hinzufügen, dass die Quellcodeverwaltung nur ein Teil Ihrer Umgebung ist. Ich würde einen VM-Snapshot auf jedem Build-Server und auch einen Snapshot einer Entwicklungsumgebung erstellen, sodass Sie bei Bedarf direkt zu einer echten Build-Umgebung wechseln können.
Neal Tibrewala

2
Mit Ausnahme von Punkt 5 würde ich all das mitmachen. Wenn Sie einen Fehler in einem Zweig beheben, sollten Sie sich nur darum kümmern, dass dieser Zweig ordnungsgemäß funktioniert. Sobald die Fehlerkorrektur für diesen Zweig getestet wurde, können Sie die Fehlerkorrektur in den Trunk oder in den Zweig für eine neuere Version einbinden. Testen Sie es dann erneut und ändern Sie alles, was Sie dort ändern müssen. (Fortsetzung)
Laut Dawood wird Monica

1
Wenn beispielsweise Version 4.3 auf dem Trunk entwickelt wird und Sie einen Fehler in Version 4.1.x beheben müssen, beheben Sie den Fehler auf dem 4.1-Zweig, testen Sie ihn auf dem 4.1-Zweig, führen Sie ihn auf dem 4.2-Zweig zusammen und testen Sie ihn (und möglicherweise beheben) Sie es auf dem 4.2-Zweig, führen Sie es zum Stamm zusammen, und testen Sie es dann auf dem Stamm (und beheben Sie es möglicherweise).
Dawood sagt, Monica

1

"Langfristig" ist ein Indikator dafür, dass Sie eine Versionierung benötigen , impliziert jedoch keine bestimmte Versionierungs- und Verzweigungsstrategie. Die interessantere Frage ist, wie viele Produktlinien oder Hauptversionslinien Sie unterstützen möchten (dies hängt vom Vertrag mit Ihren Kunden ab). Sie benötigen mindestens eine Niederlassung für jede Produktlinie / Hauptversionslinie, für die Sie einen Wartungsvertrag haben.

Auf der anderen Seite hängt es von Ihrer Teamgröße ab. Wenn Sie ein großes Entwicklungsteam haben, bei dem verschiedene Personen parallel an verschiedenen Features arbeiten, benötigen Sie offensichtlich mehr Feature-Zweige als bei einem Team von ein oder zwei Personen. Wenn Sie mit einem größeren Team arbeiten, sollten Sie die Verwendung der verteilten Versionskontrolle in Betracht ziehen, wodurch die parallele Arbeit an verschiedenen Zweigen (und deren spätere Wiedereingliederung in den Stamm) wesentlich effizienter wird.


Versionskontrolle ist vorhanden (Git), aber es gibt einige Meinungsverschiedenheiten in Bezug auf den Umgang mit Komponentenversionen (wahrscheinlich eine separate Frage) und Produktversionen. Derzeit erhält jede Produktversion einen Codenamen und es wird ein neuer Zweig im Repository erstellt. Dies bedeutet, dass der neue Code ziemlich weit vom Haupttrunk entfernt ist, der in einigen Produkten nicht einmal verwendet wird.
rjzii

1

Git ist ein Tool zur Versionskontrolle - es verwaltet Versionen von Dateien. Was Sie suchen, ist ein Konfigurationsmanagement-Tool. Es gibt diese zwar in ausreichender Menge, aber meistens zu hohen Preisen von Unternehmen wie IBM.

Tools zur Versionskontrolle bieten Verzweigungs- und Tagging-Funktionen, die ein rudimentäres Konfigurationsmanagement ohne zusätzliche Toolunterstützung ermöglichen. Daher verstehen viele Entwickler den Unterschied nicht. Ihre Bedürfnisse gehen wahrscheinlich über das hinaus, wofür GIT entwickelt wurde.

Mir ist nicht bekannt, aber ich bin mir sicher, dass es eine CM-Tool-Erweiterung für Git geben wird.


0

Diese Frage scheint einer anderen Frage , die ich kürzlich beantwortet habe , sehr ähnlich zu sein .

Kurz gesagt, dies klingt eher nach einem Produktdesign- und Distributionsproblem als nach einem Versionskontroll- / Verzweigungsproblem. Natürlich fällt es mir leicht, das zu sagen, und es fällt Ihnen schwerer, es zu beheben, wenn Sie bereits tief im Problem stecken.

Ohne die Besonderheiten Ihres speziellen Problems genauer zu kennen. Wenn ich jedoch mehrere Versionen von Produkten auf der Basis eines Codes hätte, der eine große Menge von gemeinsam genutztem Code zwischen den Produkten enthält, würde ich nach Möglichkeit versuchen, Produkte so umzugestalten, dass sie modularer werden und Stellen Sie sicher, dass die Module selbst keine zusätzliche Code-Verzweigung erfordern. Ich schaue mir auch mein Bereitstellungsmodell an, um festzustellen, ob es ein besseres Mittel gibt, um meine Kunden zu unterstützen und gleichzeitig einen Großteil der Codebasis einheitlich zu halten. Wenn eine spezifische Kundenanpassung erforderlich ist, müssen die Module möglicherweise genauer eingeteilt werden, um die Menge des duplizierten Codes im System zu verringern.

Es ist keine einfache Aufgabe, aber sie kann schrittweise behoben werden, wenn Sie den Job gut verwalten und wenn Sie die Arbeit so planen können, dass Sie nicht alles auf einmal "upgraden" müssen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.