Verzweigungsstrategie für die Testumgebung

8

Wir werden diesen Monat ein neues Projekt starten. Das Projekt dauert 1 Jahr und die Bereitstellung der Produktion erfolgt erst gegen Ende des Projekts.

Wir werden eine iterative Entwicklung durchführen (1 Monat pro Iteration). Dies bedeutet, dass wir Features am Ende jeder Iteration für QS-Tests in der Testumgebung ablegen.

Unsere Verzweigungsstrategie lautet:

  1. Trunk - Alle Entwicklungen werden auf Trunk durchgeführt.
  2. Feature-Verzweigung - Verzweigungen außerhalb des Trunks werden nach Bedarf für die Entwicklung großer Features erstellt, die möglicherweise beschädigt werden können, wenn sie auf dem Trunk ausgeführt werden
  3. QA-Release-Zweige - Am Ende jeder Iteration wird ein Trunk-Zweig erstellt. Dieser Zweig (der eine Versionsnummer enthält) wird für die Testumgebung freigegeben. Alle kritischen und blockierenden Fehler in dieser Version werden in diesem Zweig behoben und die Korrekturen müssen mit dem Trunk zusammengeführt werden. Nicht kritische / triviale Fehler werden im QA-Release-Zweig nicht behoben und nur im Trunk behoben, da der QA-Release-Zweig nach dem Ende der nächsten Iteration, bei der ein neuer Release-Zweig außerhalb des Trunks erstellt wird, weggeworfen wird.
  4. Produktionszweig - Dies ist der neueste Zweig für die Qualitätssicherung am Ende des Projekts. Dies wird markiert und alle Produktionsfehlerbehebungen werden in diesem Zweig gespeichert und mit dem Trunk zusammengeführt.

Ist das eine richtige Verzweigungsstrategie? Gibt es noch etwas, das wir übersehen haben?

Wir verwenden SVN.

rro
quelle
Welches Versionskontrollsystem verwenden Sie?
andy256
1
Warum nicht am Kofferraum testen? Auf diese Weise wird ein Fix sofort an alle geliefert, anstatt mindestens einen Monat warten zu müssen, bevor er von der QA-Niederlassung an den Trunk geliefert wird. Eine Verzweigung ist manchmal notwendig, sollte aber in einem kleineren Projekt nicht stattfinden müssen. Abweichungen sollten von Fall zu Fall erfolgen. Bearbeiten: Wie viele werden entwickelt und getestet?
Tobias Wärre
1
Haben Sie jemals in SVN verzweigt / zusammengeführt? nichts für schwache Nerven ...
Javier
3
@ Javier Stop mit der FUD. Wir haben an meinem derzeitigen Standort eine Verzweigung von Funktionen, die mit SVN 1.8 ganz einfach ist.
Gbjbaanb
1
Möglicherweise ist vance.com/steve/perforce/Branching_Strategies.html eine gute Lektüre (und hilft dabei, die Richtigkeit Ihrer Strategie zu bestätigen).

Antworten:

2

Ihre Verzweigungsstrategie sieht für mich wirklich gut aus. Ich habe in der Vergangenheit die gleiche Strategie verfolgt und sie funktioniert einwandfrei. Zeichnen Sie es auf ein Whiteboard und bringen Sie alle Ihre Entwickler dazu, es zu verstehen, damit die Leute die richtige Arbeit in der richtigen Branche erledigen. Bringen Sie allen den Befehl switch bei und erklären Sie ihn. Lassen Sie alle den Zweig, an dem sie arbeiten, überprüfen. (Oder schauen Sie sich alternativ einfach das gesamte Repo an ... abhängig von Ihrer Codegröße :) Denken Sie daran ... svn revert ist Ihr bester Freund!

Persönlich bevorzuge ich, dass eine Person die Person "Zusammenführen / Verzweigen" ist (mit einigen Backup-Personen als Reserven), um sicherzustellen, dass alles unter Kontrolle und konsistent bleibt. Lass diese Person dein SVN-Guru werden und du wirst weg sein.

Einige andere hilfreiche Tipps:

  • Ermutigen Sie zu häufigen SVN-Updates und SVN-Commits. Jeder Tag ist vorzuziehen.
  • Cross Branch-Zusammenführungen sollten auch jeden Tag oder alternativ immer dann durchgeführt werden, wenn ein Fehler behoben ist. Mach sie früh und mach sie oft! (Sie werden es sehr schnell gut machen).
  • Holen Sie sich ein gutes Diff-Tool - Beyondcompare ist ein Ass. Die Standardschildkröte SVN ... nicht allzu gut.
  • Checken Sie keine Dinge ein, die sich beim Kompilieren ändern (wie Ihr Ausgabeverzeichnis).
  • Versuchen Sie, Ihr Repo zu bereinigen, bevor Sie mit der Verzweigung beginnen (entfernen Sie Dateien, die nicht der Versionskontrolle unterliegen müssen - z. B. externe Bibliotheken usw.). Je kleiner Ihr Repo, desto besser
  • Änderungen an Ihrem Produktions- und QS-Zweig sollten so klein und kurz wie möglich sein. Beginnen Sie dort nicht mit dem Refactoring von Code, sondern beheben Sie einfach den Fehler.
  • Stellen Sie sicher, dass Sie von der obersten Ebene Ihrer Lösung verzweigen - und wenn Sie eine Datenbank haben, hoffe ich, dass Sie alle Ihre Datenbank-Skripte (wie gespeicherte Prozesse oder Trigger) per Skript erstellt haben.

Weisen Sie die Benutzer außerdem an, Ordner nicht zu verschieben, es sei denn, dies ist unbedingt erforderlich. Dies erleichtert Ihnen das Zusammenführen erheblich :) (Tun Sie nicht das, was ich getan habe, sondern starten Sie eine massive Verzeichnisumstrukturierung in der Mitte einer großen Änderung an Trunk, die alle unsere Zusammenführungen vermasselt hat ... danach war ich ziemlich beliebt).

Rocklan
quelle
2

Es klingt nach einer Idee, die möglicherweise nicht funktioniert.

Vielleicht sehen Sie sich diesen Link an, um sich inspirieren zu lassen: GitHub Flow So verwendet Github das Versionssystem. Obwohl sie git anstelle von svn verwenden, würde ich argumentieren, dass die Ideen hinter ihren Entscheidungen dennoch gelten werden.

Die (imho) wichtigsten Teile dieses Blogposts zur Versionierung:

  • Master / Trunk kann bereitgestellt oder - noch besser - bereitgestellt werden
  • Entwicklung geschieht nur auf Zweigen
  • Das Zusammenführen erfolgt erst nach Überprüfung (möglicherweise können Sie hier eine Qualitätssicherung durchführen).

Auf diese Weise erhalten Sie Stabilität. Lassen Sie mich erklären, warum. Sie brauchen eine Basis, um abzweigen. Wenn diese Basis nicht die beste ist, die Sie tun können, und die ultimative Instanz von allem, dann macht es keinen Sinn, dies zu tun. Wenn Sie vom Trunk verzweigen, während andere daran arbeiten, werden Sie Fehler sehen, die sie einführen und die noch nicht gefunden oder behoben wurden. Daher können Integrationstests (und alles oben Genannte) bei Ihnen fehlschlagen, obwohl Sie nicht die Ursache sind, was das Debugging und die Frustration drastisch erhöht.

Darüber hinaus haben Sie viel Arbeit, um Ihre 3 Niederlassungen (Stamm, Qualitätssicherung, Produktion) synchron zu halten. Dies wird wahrscheinlich zu Verwirrung führen. Ich kann Ihnen fast garantieren, dass Sie irgendwann den Überblick verlieren, wenn Sie dies nicht durch Automatisierung erzwingen.

Ich würde vorschlagen, den Weg zu gehen, den GitHub geht. Sie können dann markieren, welche Version Sie an die Qualitätssicherung senden, um bei der Kommunikation eine Referenz zu erhalten. Noch besser könnte es sein, die Qualitätssicherung wie oben angegeben enger in die Rückkopplungsschleife zu integrieren. Ich empfehle dringend, ein CI-System wie Jenkins zu verwenden, wenn Sie es noch nicht in Betracht gezogen haben. Auf diese Weise minimieren Sie die Umlaufzeit zwischen Einchecken und Feedback und können Codierungsregeln durchsetzen, statische Analysegeräte zur Fehlerprüfung ausführen usw.

Haftungsausschluss: Der Git-Flow funktioniert nur, wenn Sie keine Fehler beheben möchten, ohne neue Funktionen einzuführen. Wenn Sie dies tun möchten, ist Ihr Ansatz möglicherweise besser geeignet.

TheMorph
quelle
stimme dir absolut zu, weil ich vor dieser Katastrophe stehe.
Huahsin68
2

Ihre Verzweigungsstrategie erscheint mir durchaus vernünftig. Wir haben in meinem Unternehmen eine ähnliche Strategie verfolgt und sie hat bei uns gut funktioniert.

Ein kleiner Unterschied besteht darin, dass wir QA-Korrekturen am Trunk vor der Veröffentlichung durchführen, da dies verhindert, dass wir wieder zusammenführen müssen, und wir hatten kein wirkliches Problem mit der Entwicklung neuer Funktionen beim Beheben von Fehlern. Dies gibt der Qualitätssicherung ein etwas beweglicheres Ziel in Bezug auf das, was sie testen. Wie praktikabel dies ist, hängt also davon ab, wie eng die Qualitätssicherung in das Entwicklerteam integriert ist. Es funktioniert gut für uns, weil wir ein ziemlich integriertes Team haben und weil wir einen schnellen Iterationsplan haben. Wir haben für jede Version einen eigenen Zweig, damit wir die Produktionsumgebung patchen können, während wir noch neue Funktionen auf dem Trunk erstellen. Dies scheint jedoch erst später erforderlich zu sein, wenn Sie mit der Veröffentlichung über die Qualitätssicherung hinaus beginnen.

Es gibt ein paar zusätzliche Empfehlungen, die ich machen würde:

  1. Ermutigen Sie zu häufigen Check-ins. Dies ist besonders nützlich, wenn sich viele Menschen am Kofferraum entwickeln. Dies verhindert, dass Entwickler nicht mehr mit den Aktivitäten anderer synchronisiert werden, und verringert das Konfliktpotential. Stellen Sie sicher, dass explizite Anweisungen dazu vorliegen, wann das Festschreiben in Ordnung ist und wie oft Entwickler aus dem Trunk kommen sollten. Häufige Commits sollten kein Problem sein, da Sie versuchen, wichtige Änderungen an Feature-Zweigen zu isolieren.
  2. Richten Sie einen kontinuierlichen Integrationsprozess ein. Dies stellt außerdem sicher, dass Sie am Ende einer Iteration keine großen Integrationsprobleme haben, benachrichtigt werden, wenn ein Fehler aufgetreten ist, und dass Sie mehr von Ihrer Qualitätssicherung automatisieren können, sowohl durch automatisierte Einheiten- / Abnahmetests als auch möglicherweise durch statische Analyse / Code Inspektionswerkzeuge. Ich habe festgestellt, dass CI als Investition in den Konfigurationsmanagementprozess ein hervorragendes Preis-Leistungs-Verhältnis bietet. HinweisZwischen CI und der starken Verwendung von Feature-Zweigen besteht eine Spannung, da Sie mit den Zweigen im Wesentlichen den Trunk sauber halten, Ihre Tests in CI bestehen und dennoch Konflikte / Probleme in den Zweigen verursachen können. Häufige Zusammenführungen in den Trunk können dabei hilfreich sein, ebenso wie das häufige Ausführen von CI in der Verzweigung und das Ziehen aus dem Trunk. Eine Zunahme von Zweigen führt jedoch dazu, dass der CI-Prozess entweder durch Komplikation seiner Verwaltung oder durch einfaches Ignorieren in den Zweigen zunichte gemacht wird.
DemetriKots
quelle
Diese beiden zusätzlichen Empfehlungen sind fast obligatorisch. Wenn Sie nicht für jeden Zweig automatisierte Builds erstellen, sparen Sie sich nicht viel Zeit und Mühe. Es ist noch eine übrig geblieben - häufige Updates und häufige Zusammenführungen!
Rocklan
@LachlanB Toller Vorschlag. Nur zur Verdeutlichung gehe ich über die Automatisierung von Builds hinaus und empfehle echte CI. Das heißt, jedes Commit löst einen Build aus, einschließlich automatisierter Tests, und ja, dies sollte für jeden Zweig geschehen.
DemetriKots
@LachlanB Einige zusätzliche Gedanken dazu. Wir verwenden Feature-Zweige nur in sehr begrenztem Umfang, sodass es sinnvoll ist, den CI-Prozess für jeden Zweig einzurichten. Ich könnte sehen, dass dies wirklich problematisch wird, wenn es viele Verzweigungen gibt, und es beginnt, den Zweck von CI zu vereiteln.
DemetriKots
0

Von dem, was Sie Zustand:
Ihr Code befindet sich im Kofferraum
Für jede Hauptmerkmal / Erweiterung - Sie abzweigen Stamm geschnitten - entwickeln und dann zu QA bieten testen
Alle großen und wichtigen Bugs in diesem ‚QA Zweig‘ erhalten feste
Beitrag QA Sie Rüssel 'Der Code von diesem Zweig zurück zum Trunk

Das klingt für mich ziemlich in Ordnung.
Wir haben regelmäßig mit dem Eclipse-SVN-Plugin oder der Schildkröte verzweigt, zusammengeführt und in SVN eingebunden.
Sieht für mich gut aus

Akila
quelle
0

Es hört sich gut an, ich würde mir Sorgen machen, dass der QS-Zweig relativ kurzlebig ist, und ich würde alle Korrekturen im Zusammenhang mit dieser Version in diesem Zweig vornehmen, damit sie auf einmal mit Trunk zusammengeführt werden, anstatt sie auf Trunk zu reparieren, sobald sie gefunden werden .

Wenn Sie die trivialen Fehler im QS-Zweig beheben, können die Tester sie schnell erkennen und markieren. Ich gehe davon aus, dass sie tägliche / wöchentliche Builds von der QA-Niederlassung erhalten, daher sollten triviale Fehler überhaupt nicht zeitaufwändig sein, wenn sie mit QA durchgeführt werden. (Ich spreche aus Erfahrung, wo kleinste kleine Käfer einen Anstoßeffekt haben können, der anderswo großen Kummer verursacht.)

Eine mögliche Verbesserung, die ich erwähnen könnte, ist die Funktionsentwicklung in einem Zweig - dh die Arbeit, die Sie normalerweise am Trunk erledigen, wird stattdessen in einen dedizierten Zweig verschoben. Dann werden für Trunk nur Zusammenführungen festgeschrieben, die bei der Verfolgung vollständiger Änderungen hilfreich sein können.

gbjbaanb
quelle
0

Sie erwähnen mehrere Dinge, die die Unbeholfenheit erhöhen und die Erfolgschancen Ihres Projekts verringern können:

Das Projekt dauert 1 Jahr und die Bereitstellung der Produktion erfolgt erst gegen Ende des Projekts.

Ich empfehle wirklich, dass Sie so oft wie möglich, idealerweise jeden Tag, in einer produktionsähnlichen Umgebung bereitstellen. Das Verlassen der sogenannten "Produktion" bis zum Ende des Projekts führt normalerweise zu unvorhergesehenen Problemen. Die Anti-Patterns hier sind "späte Integration" und "späte Produktionsbereitstellung".

1 Monat pro Iteration

Ein Monat ist ein sehr langer Herzschlag für die Iteration, und nur wenige Entwickler können sich genau daran erinnern, woran sie zu Beginn der Iteration gearbeitet haben. Ich würde empfehlen, zweiwöchige Iterationen durchzuführen und in kleineren Chargen zu liefern. Anti-Patterns: "große Chargengrößen", "lange Zykluszeit".

Feature Branch

Sie sollten Feature-Zweige wahrscheinlich vermeiden, es sei denn, Sie verwenden auch Integrationszweige . Verwenden Sie im Idealfall stattdessen Feature-Toggles und Branch-by-Abstraction. Die Verzweigung von Features führt tendenziell zu unerwarteten Problemen bei der späten Integration. Anti-Pattern: 'späte Integration'.

Wir verwenden SVN.

Das Zusammenführen ist in Subversion ziemlich schmerzhaft, selbst wenn Sie die Merge-Tracking-Funktionen von Version 1.5 und höher verwenden. Ich empfehle Ihnen, zu Git zu wechseln - Sie werden nie zurückblicken. Das Zusammenführen mit Git ist im Vergleich zu Svn schmerzlos. Ich habe Subversion viele Jahre lang benutzt und war anfangs skeptisch gegenüber Git, aber jetzt bin ich "verkauft". Die einzigen Dinge, für die ich Svn über Git verwenden würde, sind das Speichern von Binärdateien (falls wirklich notwendig!) Und Dinge wie RANCID, die die vollständige Kontrolle über das Repo haben. Für die Quellcodeverwaltung schlägt Git jedes Mal Subversion.

Ich habe kürzlich über die Arbeit geschrieben, die ich an der Freigabe von Trunk / Mainline / Master und an der Vermeidung von Feature-Zweigen geleistet habe, was Ihnen weitere Denkanstöße geben könnte: Verlassen der Plattform - Verzweigen und Freigeben für unabhängige Subsysteme

Lesen Sie auch einige Beiträge auf Martin Fowlers Website, z. B. ContinuousIntegration , FeatureBranch und BranchByAbstraction .

Kaufen Sie schließlich eine Kopie von Continuous Delivery von Jez Humble und David Farley und arbeiten Sie die Empfehlungen durch - es ist ein äußerst wertvolles Buch, und jeder Entwickler sollte eine Kopie besitzen. Ich fand es nützlich, die Inhaltsseiten auszudrucken und an die Wand zu hängen, um den Fortschritt zu verfolgen :) Auch wenn Sie nicht beabsichtigen, kontinuierlich zu liefern, sind so viele der in diesem Buch beschriebenen Praktiken wirklich gesund und für eine erfolgreiche Softwarebereitstellung von entscheidender Bedeutung heute.

Checkliste für die kontinuierliche Lieferung

Hoffe das hilft.

M.

Matthew Skelton
quelle