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 describe
dies 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 master
in allen Repositorys einen Zweig haben . Der master
Zweig 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-rc2
und 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.1
Muster.
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.
rc
Suffix vorangehen ? Das würde diemajor.minor
Entwicklungsversion bestimmen.rc
und Build-Nummer kann nur auf dieser Basis erhalten werden. Auchrc
auf 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öffentlichungszyklusrc
Suffix versehen.Antworten:
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.
quelle
next
+builds
ähnlich, wiegit describe
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.)
Tests werden rückwirkend ausgeführt :
Verzweigen Sie aus
maser
dem 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,
master
können beim erneuten Zusammenführen Zusammenführungskonflikte auftreten. (und wir mögen keine Konflikte)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
master
Verzweigung lautet und welcher Code darin schwebtEtwas 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:
Verzweigen Sie sich
master
fü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 derrelease
Filiale 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
master
und wählen Sie dieses Feature / Bugfix / Hotfix im Release-Zweig aus.versionierung
Die Version der Feature-Zweige kann eine Namenskonvention verwenden, wie z
1.2.3-rc.12345
die die versionen in der
release
niederlassung nur benutzen1.2.3
(1.2.3
>1.2.3-rc.12345
auch 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.
quelle
Ihr Prozess scheint sehr kompliziert zu sein und es scheint unvermeidlich, ein bisschen mehr Tags zu bekommen.
Zwei Ideen kommen in den Sinn:
Sie behandeln den "Master" -Zweig als das, was wir normalerweise im "Develop" -Zweig haben. Dies verschmutzt den Nachrichtenzweig stark.
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.
quelle