Übergang von einer komplexen Verzweigungsrealität zu einem Modell mit nur einem Zweig

15

In großen Organisationen führt die Verwendung der Wasserfallmethode in der Regel zu sehr komplexen Verzweigungsstrukturen (so genannten Branch Spagetti ).

Welche Verzweigungsstrategien können verwendet werden, um von einer komplexen Verzweigungsrealität zu einem Modell mit einer Verzweigung wie der stammbasierten Entwicklung überzugehen?

Aktualisieren:

Zur Verdeutlichung geht es um die Migration / den Übergang selbst , nicht um die Vorher- und Nachher-Methoden, die ziemlich klar sind.

Es kann nicht wirklich sein, dass wir heute bei EOB immer noch einen Wasserfall mit einer Unmenge von Filialen haben, aber morgen werden wir als Erstes auf ein stammbasiertes CI mit einem Zweig umstellen.

Dan Cornilescu
quelle
Sie können ein Wasserfall sein und klar definierte und erzwungene Verzweigungspraktiken haben oder Sie können agil sein und eine Unmenge von Verzweigungen haben (kostenlos für alle!). Eins impliziert nicht das andere.
Alexandre
@Alexandre der Fragekörper verdeutlicht den Kontext: Übergang von vielen Zweigen zu einem.
Dan Cornilescu
1
Sie haben die Frage komplett gegenüber dem Original geändert, sodass die Hälfte der Antworten irrelevant ist.
Evgeny
1
Hm, das sehe ich nicht. Das Update zeigt lediglich, dass der Fokus sowohl auf dem Titel ("Migration von ... nach ...") als auch auf dem Text ("im Übergang zu") unverändert bleibt : devops.stackexchange.com/posts/122 / Überarbeitungen . Die Hälfte der Antworten war bereits irrelevant, weil sie das verpassten. Deshalb habe ich die Klarstellung hinzugefügt.
Dan Cornilescu
1
Hallo @DanCornilescu, ich habe meine Bearbeitung nach dem Kommentar von Evgeny vorgenommen. Versuchen Sie also nicht, mich darauf hinzuweisen. Ihre ursprüngliche Frage enthielt Elemente bezüglich des Softwareentwicklungsprozesses, des Verzweigungsmodells und der DevOps-Praktiken. Die Leute gaben Antworten darauf, worum es ihrer Meinung nach ging. Sie haben dann Ihre Frage geändert (bearbeiten Sie # 2: devops.stackexchange.com/revisions/122/2 ) und einige dieser Antworten für irrelevant erklärt.
Alexandre

Antworten:

11

Weil Sie Wasserfall erwähnen, verstehe ich, dass die zahlreichen Zweige, auf die Sie anspielen, eher Feature-Zweige als Wartungszweige sind.

In diesem Setup gehe ich auch davon aus, dass diese Zweige nach einem Wasserfallplan erstellt werden, der versucht, Konflikte zu minimieren. Dies impliziert, dass das Ziel der Entwicklung darin besteht, mehrere unterschiedliche Produkte herzustellen. Bei der Verwendung eines Entwicklungsmodells mit einem Zweig ist es wichtig, auch an einem einzelnen Produkt zu arbeiten. Wenn mehrere Produkte gleichzeitig in einem Entwicklungsmodell mit einem Zweig entwickelt werden, werden Versionen dieser Produkte effektiv „zusammengeklebt“, sodass in Version a des Repositorys möglicherweise ein fehlerfreies Produkt X und ein fehlerhaftes Produkt Y vorhanden sind , während in Version b Das Produkt X hat eine Regression und Y eine Fehlerbehebung, aber wir haben keine Version, in der sowohl X als auchSie sind gesund. Eine solche Situation würde uns zwingen, X und Y als in unterschiedlichen Repositories entwickelt zu betrachten, was ein Hinweis darauf ist, dass dies der Fall sein sollte.

Daher sollten die ersten Schritte eine Repository-Aufteilung durchführen :

  1. Ordnen Sie das Repository so an, dass es leicht in mehrere kleine Repositorys aufgeteilt werden kann. Ordnen Sie beispielsweise das aktuelle Repository neu an, sodass jedes Verzeichnis der obersten Ebene einem Repository entspricht, das Sie in Zukunft erstellen möchten. Auf diese Weise können Sie weiterhin die branchenübliche Spaghettidisziplin anwenden.

  2. Wenn Schritt 1 abgeschlossen ist, verfeinern Sie die Zweigspaghettidisziplin, indem Sie festlegen, dass jeder einzelne Zweig nur Dateien in einem Verzeichnis der obersten Ebene berühren kann.

  3. Wenn jeder Zweig Schritt 2 erfüllt, führen Sie die Aufteilung durch. Entwickler können ihre ausstehenden Änderungen problemlos konvertieren, um ein einzelnes Repository zu patchen, indem sie nur die erste Ebene des Pfads entfernen.

Nachdem die Aufteilung durchgeführt wurde, können Sie mit der Arbeit an der Zweigdisziplin selbst beginnen.

  1. Einführung von Programmiertechniken zur Entwicklung kurzlebiger Branchen. Zweige, die nur von kurzer Dauer sind, sind ein entscheidender Aspekt aller Einzelzweigmethoden. Eines ihrer Ziele ist es, die Zeit für das Zusammenführen und Debuggen langlebiger Zweige zu verkürzen. Eine beliebte Technik ist die Einführung von "Feature-Flags", bei denen eine "Factory" ein Konfigurationsflag verwendet, um entweder die historische Version eines Objekts oder die neue, anfänglich teilweise entwickelte Version dieses Objekts zu erzeugen.

  2. Inzwischen haben Sie zig Millionen Repositorys mit nur wenigen Zweigen und können den Schalter "Wir übernehmen global die stammbasierte Entwicklungsdisziplin" betätigen, ohne dass der ursprüngliche Zweigspaghetti- Berg auf dem Stamm zusammenbricht.

Die tatsächliche Aufteilung der Repositorys kann optional sein. In diesem Fall müssen Sie jedoch Richtlinien festlegen, die den zulässigen Bereich jedes übermittelten Patches genau beschreiben (um das Risiko von Konflikten beim Zusammenführen von Änderungen im Hauptzweig zu begrenzen). Das Reduzieren des mit Konflikten verbundenen Overheads ist eines der Ziele von Einzelzweigmodellmethoden, daher nehme ich an, dass dies in Ihrem Kontext relevant ist.

Michael Le Barbier Grünewald
quelle
Richtig: Diese Zweige sind Feature- und (verschiedene Ebenen von) Integrationszweigen.
Dan Cornilescu
1
Etwa 1: Auch nach der Trennung kann es erwähnenswert sein, dass Sie mit der Verwendung von Repo
ᴳᵁᴵᴰᴼ
Aber Google und FB verwenden Monorepos mit ...
AnoE
6

Wenn Sie von etwas zu etwas anderem migrieren, müssen Sie nur zwei Dinge definieren:

  1. Was ist dein Ziel?
  2. Wie komme ich dorthin? (Der Migrationsplan)

Der erste Teil wird leider oft übersehen oder ist viel zu vage. Sie können nicht einfach sagen, dass das, was Sie haben, ein Durcheinander ist, und Sie möchten es organisieren. Was würde das heißen? Jeder würde eine andere Interpretation haben (auch bekannt als: Jeder Entwickler denkt, dass seine oder ihre Art, Dinge zu tun, die beste ist).

Es besteht die Möglichkeit, dass alle Zweige, die Sie haben, einen Zweck erfüllen oder erfüllt haben. Ohne einen klar definierten Zielprozess werden die Mitarbeiter weiterhin das tun, was für sie am besten geeignet ist (und das zu Recht).

Zum Beispiel sollte Ihr Ziel so klar definiert sein, wie Vincent Driessen sein "erfolgreiches Git-Verzweigungsmodell" definiert hat . Wenn Sie sich dieses Modell ansehen, ist es sehr genau: Es gibt an, wo stabiler Code und wo instabile Features entwickelt werden sollten. Außerdem erfahren Sie, wie und wann Sie verzweigen, aktualisieren und wieder zusammenführen können. Sie wissen, wofür jeder Zweig ist und was Sie damit tun müssen. Wir verwenden eine Variation dessen, was Vincent vorgeschlagen hat und unsere Variation ist in unserem Wiki definiert.

Wichtig ist, dass das gesamte Team ein Ziel versteht und sich darauf einigt. Es könnte sich lohnen, die Leute daran zu erinnern, dass Sie nicht nach ihrem persönlichen bevorzugten Verzweigungsmodell suchen, sondern nach einem Modell, auf das sich alle Teammitglieder einigen und es einfach anwenden können.

Sobald Sie Ihr Ziel erreicht haben, können Sie Ihren Migrationsplan ausarbeiten. Dieser Plan kann so lang oder so kurz sein, wie Sie möchten. Ich habe gesehen, wie ein solches Verzweigungsmodell über Nacht auferlegt wurde. An anderen Stellen wurden zwei oder drei Sprints absolviert. Es macht mir nicht viel aus, solange wir uns verbessern.

Sie können mit den "größten" oder wichtigeren Branchen beginnen. ZB: "Master muss sich von nun an immer in einem Zustand befinden, um in prod implementiert zu werden, und der dev-Zweig muss immer kompiliert werden" (oder was auch immer Ihre Regeln sein). Erzwingen Sie dann Versionszweige (Release-Zweige). Erzwingen Sie anschließend Feature-Verzweigungen. Setzen Sie danach einen Code-Freeze für den Versionszweig ein, falls dies sinnvoll ist.

Bei DevOps dreht sich alles um Kommunikation, Offenheit und Effizienz. Diese Konzepte müssen während des gesamten Prozesses berücksichtigt und kommuniziert werden.

Ich würde vorschlagen, einige Personen außerhalb des Entwicklungsteams als Beobachter zu dem Prozesstreffen einzuladen. Ops oder das mittlere Management könnten ein oder zwei Dinge zu Ihrem Modell zu sagen haben. Die Bedürfnisse der Entwickler sollten priorisiert werden. Wenn sich das Verzweigungsmodell jedoch nicht an die Art und Weise anpassen lässt, wie die Dinge verwaltet werden, sollten Sie es jetzt besser wissen und nicht in ein oder zwei Monaten.

Wenn Sie wirklich große Teams haben, versuchen Sie trotzdem, alle einzubeziehen. Bei sehr großen Teams haben Sie sowieso zwei oder drei Meetings. Laden Sie also Teamleiter in den Raum ein, halten Sie jedoch einen Webcast bereit und informieren Sie alle darüber. Wenn jemand einen Vorschlag oder ein Anliegen hat, kann er dies seinem Teamleiter mitteilen, und wenn es gültig ist, wird es beim zweiten oder dritten Treffen angesprochen.

Alexandre
quelle
3

Tatsächlich ist es sehr einfach, ein mehrfach verzweigtes Hydra-Repository in ein einzelnes verzweigtes Modell umzuwandeln.

Zunächst möchten Sie mit den Zweigen beginnen, die den geringsten Unterschied zwischen sich selbst und dem Master oder dem Stamm aufweisen. Untersuchen Sie ihr Alter und ihre Relevanz. Wenn sie immer noch relevant sind, fassen Sie sie zusammen und lösen Sie Konflikte. Wenn sie nicht mehr relevant sind, löschen Sie sie.

Fahren Sie mit diesem Vorgang fort, bis Sie alle Zweigstellen zusammengeführt und alle Konflikte gelöst haben und nur noch eine einzige Zweigstelle vorhanden ist.

Sie können dieser einfachen Gliederung folgen, um loszulegen:

  1. Erstellen Sie eine Kopie Ihrer Haupt- / Amtsleitung und rufen Sie diese auf temp_master
  2. Finden Sie den Zweig mit der größten Abweichung vom Master / Stamm.
  3. Bestimmen Sie, ob der Zweig beibehalten, archiviert oder gelöscht werden muss.
    1. Wenn es beibehalten werden muss, fahren Sie mit Schritt 4 fort.
    2. Wenn es gelöscht oder archiviert werden muss, löschen und archivieren Sie es und kehren Sie dann zu Schritt 2 zurück.
  4. Wiederholen Sie Schritt 2, um den nächsten Zweig mit der geringsten Abweichung zu finden.
  5. Führen Sie die beiden in Schritt 2 und Schritt 3 gefundenen Zweige zusammen, um alle Konflikte zu lösen.
  6. Verbinden Sie diese beiden Zweige mit Ihrem temp_masterZweig.
  7. Testen Sie den Code in temp_master-Code, um festzustellen, ob er kompiliert und erstellt wird, und führen Sie alle anderen automatisierten Tests aus, die Sie auf ihre Vernunft hin durchführen.
    1. Wenn ein Test fehlschlägt, gehen Sie zurück, finden Sie heraus, warum und beheben Sie ihn. Wiederholen Sie den Vorgang.
    2. Wenn die Tests immer noch fehlschlagen, wählen Sie zwei verschiedene Zweige aus, mit denen Sie arbeiten möchten.
  8. Wiederholen Sie die Schritte 2 - 7, bis Sie nur noch zwei Zweige haben, Ihren Master / Trunk und temp_master.
  9. Zum Schluss verbinden Sie sich temp_mastermit Master / Trunk und leben mit Ihrem neuen Modell mit einem Zweig.
avi
quelle
-4

Für große Organisationen mit typischen 4 Wochen Sprint Zyklus Git-Flow - bevorzugt Ansatz , weil Sie profitieren von Feature Zweig Master - Produktion bereit Zweig zu erhalten ist immer ausfahrbaren Auch ist Master - Zweig von unerwünschten Commits sauber gehalten von zwei folgenden Commit - Zyklus (von Funktion Developund DevelopZweig meistern).

Darüber hinaus wird die Verzweigung auch durch die Häufigkeit der Produktionsfreigaben bestimmt. Für eine häufige Bereitstellung in der Produktion ist es besser, über einen Funktionszweig oder ein zentralisiertes Modell zu verfügen. In diesem Fall wird der Aufwand für die Verwaltung von Niederlassungen auf robuste Tests in niedrigeren Umgebungen verlagert, um die Produktionsstabilität zu gewährleisten.

Shrek
quelle
Können Sie diese Antwort verbessern, um das Verständnis zu erleichtern?
Evgeny
In der Frage wird speziell angegeben, dass es sich um die Migration / den Übergang selbst handelt, nicht um die Vorher-Nachher-Methode . Sie scheinen hier letzteres anzusprechen.
Toby Speight
@TobySpeight Die Frage wurde durch Änderungen gegenüber dem Original geändert, weshalb diese Antwort früher relevant war, aber nicht mehr ist.
Evgeny