Paket- und Versionsstrategien in einer Umgebung mit mehreren Repositorys

13

Wir sind ein kleines Unternehmen mit mehreren Teams, die ihre eigenen Git-Repositories verwalten. Dies ist eine Webplattform und die Artefakte jedes Teams werden am Ende des Tages für nächtliche Tests bereitgestellt. Wir versuchen, den Prozess der Versionierung und des Packens zu formalisieren.

Jedes Team hat eine Hauptniederlassung, in der es sich täglich weiterentwickelt. Qualitätssicherungsmitglieder jedes Teams möchten, dass die Artefakte aus den Änderungen ihres Teams in einem Prüfstand bereitgestellt werden, in dem alle Komponenten vom Küchenchef kombiniert werden. Artefakte sind Tarballs, aber ich würde sie gerne in RPMs konvertieren, damit wir über Versionen richtig nachdenken und darüber nachdenken können.

Der Release-Prozess umfasst das Abschneiden eines Release-Zweigs vom Entwicklungszweig (in den meisten Fällen Master) der einzelnen Git-Repositorys. Diese werden dann an die Qualitätssicherung weitergeleitet, die Tests durchführt und eine Reihe von Artefakten abzeichnet.

Zum Beispiel ist dies ein typisches Git-Repository mit den dazugehörigen Release-Zweigen:

 0-0-0-0-0-0-0-0-0-0 (master)
   |           |
   0           0
 (rel-1)       |
               0
            (rel-2)

Ich versuche nicht, ein Schema für die Versionierung von Paketen aus Entwicklungszweigen zu finden. Wir möchten den Master-Zweig eines jeden Repos nicht übermäßig markieren und Tags darauf beschränken, nur Zweige freizugeben. Wir sollten jedoch in der Lage sein, die in den Testmaschinen bereitgestellten Pakete mit der Standard-Yum / RPM-Semantik abzufragen. Wie würden Entwicklungsversionen aussehen, wenn der Master-Zweig keine Tags hat? Ich verstehe, dass git describedies eine nützliche Darstellung einer Build-Version sein kann, aber dies funktioniert gut, wenn verschiedene Release-Punkte in der Verzweigung mit Tags versehen sind.

EDIT1: Als Antwort auf die Antwort von @ Urban48

Ich dachte mir, ich sollte unseren Release-Prozess ein bisschen näher erläutern. Für die Zwecke dieser Diskussion nehmen wir an, dass wir masterin allen Repositorys einen Zweig haben . Der masterZweig wird als Entwicklungszweig betrachtet und in einer automatisierten CI-CD-fähigen QA-Umgebung bereitgestellt. Hier werden einige nächtliche Tests durchgeführt, um die Stabilität des Masters sicherzustellen. Wir sehen uns diese Job-Pipeline an, bevor wir einen Release-Zweig kürzen. Unsere Veröffentlichungszweige sind kurzlebig. Angenommen, nach dem Ausschneiden eines Release-Zweigs (von einem stabilen Master) wird eine vollständige Regression ausgeführt, Korrekturen vorgenommen und für die Produktion bereitgestellt. Dies dauert ungefähr eine Woche. Wir geben fast alle zwei Wochen zur Produktion frei.

Unsere Feature-Zweige werden immer vom Master abgeschnitten und einigen Entwicklertests unterzogen, bevor sie mit dem Master zusammengeführt werden, bei denen sie den CI-CD-Stabilitätstests unterzogen werden.

Hotfixes werden in Hotfix-Zweigen (aus Versionszweigen herausgeschnitten) erstellt und mit minimalen Auswirkungstests in der Produktion bereitgestellt.

Unsere Versionsstrategie für Release- und Hotfix-Zweige folgt semver. Freigabezweige während des QS-Zyklus durchlaufen Versionen wiev2.0.0-rc1 , v2.0.0-rc2und werden schließlich nach QS-Abmeldung v2.0.0.

Wir machen manchmal gepunktete Releases für kleine Features, die zusammengeführt werden, um Zweige freizugeben (und dann zu meistern), in denen die Versionen werden v2.1.0 . Und Hotfixes übernehmen das v2.1.1Muster.

Es geht jedoch nicht darum, diese Zweige zu versionieren. Ich würde es vorziehen, dieses Versionsschema nicht komplett zu ändern. Die einzige Änderung ergibt sich für den Entwicklungszweig, d. H. Meister. Wie kann ich in der CI-CD-Umgebung zuverlässig angeben, welche Version für das vorherige Release in der Produktion vorhanden ist? Dies würde idealerweise durch Smart-Git-Tagging geschehen, aber etwas, das den Master-Zweig nicht übermäßig markiert, wird bevorzugt.

tsps
quelle
warum nicht -rc. <build_number> zu den Builds aus Entwicklungszweigen hinzufügen und nach der Freigabe aus dem Master / Release-Zweig einfach ein xyz verwenden?
Urban48
Was würde dem rcSuffix vorangehen ? Das würde die major.minorEntwicklungsversion bestimmen. rcund Build-Nummer kann nur auf dieser Basis erhalten werden. Auch rcauf Master macht das keinen Sinn, da wir uns nie vom Master lösen. Wir markieren unsere Veröffentlichungskandidaten heute in Veröffentlichungszweigen als Teil des Veröffentlichungszyklus
tsps
Ich verstehe, was ist dann damit, nicht aus mehreren Zweigen herauszugeben, sondern komplette Funktionen in einem einzelnen Zweig herauszusuchen, in dem Sie dann Tags verwenden können. Die Versionierung von Paketen (rpm oder deb) wird einfacher, alles, was sich nicht im Release-Zweig befindet, wird mit einem rcSuffix versehen.
Urban48

Antworten:

3

Hmm, nun, ich habe ein .net-Beispiel, das möglicherweise technologieunabhängig ist.

Ich werde nur eine kurze Zusammenfassung machen.

  • Git Repo pro Komponente mit Gitflow-Verzweigungsstrategie

  • Alle Entwicklungsversprechen lösen einen Team City Build aus

  • teamcity build ändert die Version mit manuellem major minor + der Build-Nummer in AssemblyInfo.cs, dh 1.1.hotfix.build

  • teamcity löst das Packen von Nugets mit derselben Versionsnummer für von Nugets veröffentlichte Bibliotheken aus

  • octopus stellt das fertige Build für manuelle Tests auf qa bereit (vorausgesetzt, alle Tests sind bestanden)

  • Wenn alles in Ordnung ist, stellen Sie die Version manuell über Octopus für die Produktion bereit.

Dies bedeutet, dass Sie VIELE versionierte Pakete erhalten, die sich im Umlauf befinden. Wir haben mit der Verwendung des -prerelease-Flags experimentiert, aber dies erforderte ein weiteres manuelles Verschieben des Pakets von der Vorabversion zum "normalen" Schritt und die Anforderung, Komponenten neu zu erstellen, die von ihnen abhingen.

Der Schlüssel ist, jeden Build über einen zentralen Prozess eindeutig zu versionieren.

Dann befinden Sie sich in der Situation "hmm, welche Versionen möchte ich" und nicht "omg, welche Version habe ich?"

Bearbeiten: Kommentare.

Nur um diese Schlüsselsache wirklich zu unterstreichen. Entscheiden Sie, welcher Zweig die fertige Software darstellt, und die Version, für die sich ALL verpflichtet. Stellen Sie nur versionierte Software aus diesem Zweig bereit.

Meiner Ansicht nach müssen Sie sich jedoch mit Ihrer Verzweigungsstrategie befassen.

  • Versions-Feature (oder andere Entwickler) -Zweige nicht.
  • Versions-Master
  • Verwenden Sie nur Pakete vom Master
Ewan
quelle
1
Ich habe git-flow in der Vergangenheit mehrfach erkundet und kann es leider nicht durchsetzen. Das Ändern der Verzweigungsstrategie und der Git-Workflows von Entwicklern ist ein schwieriges Problem. Wir möchten die Versionsstrategie ändern, damit die Zahlen bei der Bereitstellung für Entwicklung, Test und Produktion sinnvoll sind.
TLS
Außerdem haben wir heute Versionen für die Entwicklungszweige. Es ist nur so, dass wir jedes Commit markieren müssen, manchmal zweimal, um auf diese Weise zu versionieren. Ich möchte eine sauberere Ansicht der Entwicklung schaffen , indem darauf hinweist , dass die aktuelle Version Ausgehen ist v next+ buildsähnlich, wiegit describe
tsps
naja man kann noch bauen und versionieren um zu meistern. Verwenden sie nicht einmal Feature-Zweige?
Ewan
wenn Sie nicht zum Versionsmeister möchten. Dann müssen Sie die Nebenversion im Release-Zweig manuell aktualisieren. was bedeutet , manuell zu konfigurieren Ihre baut jedes Mal wenn Sie eine neue Version Kleie h machen
Ewan
Feature-Zweige existieren und ich muss Versionen auch auf sie anwenden. Es ist nicht abgeneigt, Tags / Versionen auf dem Master hinzuzufügen, nur dass dies heute übermäßig getan wird. Jede Strategie , dass die Punkte an den Punkt , an dem ich den Master - Zweig markieren können und zeigen , dass es sich um eine Entwicklungsversion ist als zu Versionen auf Release Filialen gegen ist hilfreich
tsps
1

Lassen Sie mich einen alternativen Workflow anbieten, der möglicherweise Ihr Versionsproblem löst oder Ihnen nur dabei hilft, weitere Lösungswege zu finden.

Ein bisschen Philosophie zuerst.
(Ich mache einige Annahmen über Ihren Arbeitsablauf. Bitte korrigieren Sie mich, wenn ich falsch liege.)

  1. Tests werden rückwirkend ausgeführt :

    Verzweigen Sie aus maserdem Feature-Zweig und verwandeln Sie ihn in ein Artefakt zum Testen durch die Qualitätssicherung.
    Das Problem ist : Was passiert, wenn die Tests fehlschlagen master?

    Nebenwirkungen:

    • Es macht den Entwicklern nicht zu trauen master

    • Was passiert, wenn die vorherige Version beschädigt ist, da Sie vom Master zu den Release-Zweigen verzweigen? Es stoppt die Integration Ihrer neuen Funktionen, bis der Master wieder repariert ist.

    • Wenn der Fehler in der Release-Verzweigung behoben ist, masterkönnen beim erneuten Zusammenführen Zusammenführungskonflikte auftreten. (und wir mögen keine Konflikte)

  2. kleiner Code wird zusammengeführt und korrigiert :

    Es ist schwierig, den Überblick über den gesamten Code zu behalten, der zusammengeführt wird master, z. B. über kleine Korrekturen oder Änderungen, die nicht Teil einer bestimmten Funktion sind.

    Nebenwirkungen:

    • Der Entwickler ist sich nicht sicher, ob er dieses kleine Update jetzt oder später installieren soll.

    • soll ich dieses neue kleine Update auch versionieren?

    • Zu jedem Zeitpunkt ist nicht klar, wie der Status der masterVerzweigung lautet und welcher Code darin schwebt

    • Etwas hat den Build kaputt gemacht, das nicht Teil der neuen Funktion ist. und es ist wirklich schwer zu verfolgen, woher es kam

Meine Idee für Git Workflow ist wie folgt:

Bildbeschreibung hier eingeben

Verzweigen Sie sich masterfür die Entwicklung neuer Funktionen, so wie Sie es bereits tun. Aber anstatt diese neu erstellte Filiale zu verlassen, müssen Sie diese Funktion auswählen und in der releaseFiliale zusammenführen.

Jetzt haben Sie eine bessere Kontrolle darüber, was in einer bestimmten Version vor sich geht.
Jetzt ist es wirklich einfach, Entwicklungsversionen und stabile Versionen zu isolieren.

Sie können weiterhin Artefakte aus diesen Feature-Zweigen für die Qualitätssicherung erstellen.
Wenn alles in Ordnung ist, führen Sie dieses Feature wieder zu zusammen masterund wählen Sie dieses Feature / Bugfix / Hotfix im Release-Zweig aus.

versionierung
Die Version der Feature-Zweige kann eine Namenskonvention verwenden, wie z1.2.3-rc.12345

die die versionen in der releaseniederlassung nur benutzen 1.2.3 ( 1.2.3> 1.2.3-rc.12345auch eine sache weniger, um die man sich sorgen muss)

Dieser Workflow behebt die oben genannten und weitere Probleme.
Es wird auch eine vernünftige Versionierungsstrategie vorgeschlagen, und der größte Teil dieses Release-Zyklus kann automatisiert werden.

Ich hoffe, es wird Ihnen in irgendeiner Weise helfen, ich werde gerne alle Randfälle besprechen, die Sie sich einfallen lassen können.

ps:
Ich entschuldige mich für mein Englisch, es ist nicht meine Hauptsprache.

Urban48
quelle
Danke für deine ausführliche Antwort. Ich werde im Originalbeitrag als BEARBEITEN antworten, da die Kommentarleiste nicht genügend Text zulässt.
TLS
0

Ihr Prozess scheint sehr kompliziert zu sein und es scheint unvermeidlich, ein bisschen mehr Tags zu bekommen.

Zwei Ideen kommen in den Sinn:

  1. Sie behandeln den "Master" -Zweig als das, was wir normalerweise im "Develop" -Zweig haben. Dies verschmutzt den Nachrichtenzweig stark.

  2. Wenn die QA mit ihrem Job fertig ist, können Sie den Build / CI-Server veranlassen, einen Bericht (z. B. eine Textdatei) mit den Tags aller verwendeten Repos zu erstellen. Jetzt haben Sie eine Datei mit den Versionen, die in das Repo gepostet werden können. Anschließend kennzeichnen Sie den Zweig nur mit der Release-Version. Wenn Sie die Versionen der einzelnen Komponenten überprüfen möchten, können Sie den Bericht überprüfen.

John Kouraklis
quelle