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.
continuous-integration
branch
waterfall
Dan Cornilescu
quelle
quelle
Antworten:
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 :
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.
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.
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.
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.
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.
quelle
Wenn Sie von etwas zu etwas anderem migrieren, müssen Sie nur zwei Dinge definieren:
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.
quelle
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:
temp_master
temp_master
Zweig.temp_master
.temp_master
mit Master / Trunk und leben mit Ihrem neuen Modell mit einem Zweig.quelle
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
Develop
undDevelop
Zweig 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.
quelle