Eine Produktversion wie z. B. v1.0.0.100
stellt nicht nur eine einzigartige Produktionsversion von Software dar, sondern hilft auch bei der Identifizierung von Funktionssätzen und Hotfix-Phasen für dieses Produkt. Im Moment sehe ich zwei Möglichkeiten, die endgültige Paket- / Build- / Binärversion eines Produkts zu pflegen:
Versionskontrolle. Eine Datei speichert irgendwo die Versionsnummer. Der Build-Server für Continuous Integration (CI) verfügt über ein Skript zum Erstellen der Software, das diese eingecheckte Versionsnummer verwendet, um sie auf alle Bereiche der benötigten Software anzuwenden (Binärdateien, Installationspakete, Hilfeseiten, Dokumentation usw.).
Umgebungsparameter und / oder Build-Parameter. Diese werden außerhalb der Versionskontrolle verwaltet (dh sie sind nicht an den Snapshot / Tag / Zweig gebunden). Die Erstellungsskripte verteilen und verwenden die Zahl auf die gleiche Weise, erhalten den Wert jedoch nur unterschiedlich (sie werden dem Erstellungsskript zur Verfügung gestellt, anstatt dem Skript mitzuteilen, wo sie relativ zum Quellbaum abgerufen werden sollen).
Das Problem beim ersten Ansatz besteht darin, dass Zusammenführungen über Hauptleitungszweige hinweg kompliziert werden können. Wenn Sie immer noch zwei parallele Versionen derselben Software verwalten, werden Konflikte beim Zusammenführen der beiden Hauptversionen behoben, wenn sich die Version auf beiden seit der letzten Zusammenführung geändert hat.
Das Problem beim zweiten Ansatz ist die Versöhnung. Wenn Sie vor einem Jahr zu einem Release zurückkehren, verlassen Sie sich ausschließlich auf die Tag-Informationen, um dessen Release-Nummer zu identifizieren.
In beiden Fällen gibt es möglicherweise bestimmte Aspekte der Versionsnummer, die vor der CI-Erstellung nicht bekannt waren. Zum Beispiel kann ein CI-Build programmgesteuert eine vierte Komponente einfügen, bei der es sich tatsächlich um die automatisierte Build-Nummer handelt (z. B. 140. Build für den Zweig). Es kann sich auch um eine Versionsnummer in VCS handeln.
Was ist der beste Weg, um mit der Versionsnummer einer Software Schritt zu halten? Sollen die "bekannten" Teile immer in VCS gepflegt werden? Und wenn ja, sind die Konflikte zwischen den Hauptniederlassungen ein Problem?
Im Moment pflegen wir unsere Versionsnummer über Parameter, die im CI-Build-Plan (Atlassian Bamboo) angegeben und gepflegt sind. Wir müssen vor dem Zusammenführen in unserer master
Filiale darauf achten, dass die Versionsnummern vor dem Start des CI-Builds ordnungsgemäß eingerichtet werden . In Bezug auf den Gitflow-Workflow bin ich der Meinung, dass wir, wenn die Versionsnummer in der Quellcodeverwaltung nachverfolgt würde, garantieren könnten, dass sie ordnungsgemäß eingerichtet ist, wenn wir unseren release
Zweig in Vorbereitung auf die Veröffentlichung erstellen . Die Qualitätssicherung würde einen abschließenden Integrationstest / Rauch- / Regressionstest für diesen Zweig durchführen und nach dem Signoff findet eine Zusammenführung master
statt, die die Verpflichtung zur Freigabe signalisiert.
quelle
version.txt
in der eine Version die einzelne Zeile1.0.7
und die andere enthält,1.2.0
wirklich so schwer zu lösen? Wenn dies der einzige Konflikt ist, bei dem zwei Zweige zusammengeführt werden, würde ich mich als sehr glücklich schätzen. Wie oft kommt es vor? Ist es nicht gut, dass Sie gezwungen sind, sich zu überlegen, welche Versionsnummer die zusammengeführte Version haben sollte, wenn dies der Fall ist ? (Entschuldigen Sie die mehrdeutige Verwendung des Wortes "Version".)Antworten:
Persönlich wähle ich Option 3: Versionsinformationen in VCS- Metadaten , insbesondere Tags, beibehalten.
Git macht dies sehr einfach, da es einen Befehl gibt
git describe
, der ein Commit basierend auf einem Tag eindeutig beschreiben kann. So funktioniert das:<tag>-<number of commits since the tag>-g<abbreviated commit hash>
.-dirty
.Wenn Sie also eine Release-Erstellung durchführen und das Commit markiert haben
1.2.3
, wird es ausgegeben1.2.3
. Wenn Sie derzeit an 1.2.4 arbeiten und seit 1.2.3 4 Commits durchgeführt haben und nicht festgeschriebene Änderungen in der Struktur haben, wird diese ausgegeben1.2.3-4-gdeadbee-dirty
.Dies ist garantiert einzigartig und monoton sowie für den Menschen lesbar und kann daher direkt als Versionszeichenfolge verwendet werden. Das einzige, was Sie sicherstellen müssen, ist eine korrekte Benennungskonvention für Tags.
quelle
git describe
funktioniert auch mit Zweigen: " --all - Verwenden Sie anstelle der mit Anmerkungen versehenen Tags einen beliebigen Verweis imrefs/
Namespace. Mit dieser Option können bekannte Zweige, Zweigstellen mit Fernverfolgung oder Lightweight-Tags abgeglichen werden." Ich bin mir jedoch nicht sicher, wie das mit Bamboo funktioniert. (Dies erfordert natürlich eine sorgfältige Benennung der Zweige, genau wie dies im normalen Modus bei Tags der Fall ist.)git describe
, das Änderungsprotokoll wird vongit shortlog
(also tatsächlich von einem Skript, das die Ausgabe analysiertgit log --pretty=tformat:<some custom format string>
) generiert, und die Versionshinweise werden aus der Tag-Beschreibung generiert undgit notes
an wichtige Meilenstein-Commits angehängt.master
(vondevelop
, denke daran, dass ich gitflow verwende). Was passiert, wenn jemand eine Zusammenführungmaster
ohne Tag vornimmt? Es wird nicht die richtige Version verwenden (in der Tat würde es die Version der letzten Veröffentlichung verwenden)Ja. Es wird empfohlen, den größten Teil der Versionsnummer in vcs zu speichern. Wenn wir die semantische Versionierung von semver.org in Betracht ziehen, bei der major.minor.patch.build vorhanden ist, müssen die ersten drei in vcs leben. Die letzte kann eine inkrementelle Zahl von Ihrem Build-Server sein, die verwendet wird, um das spezifische Commit, aus dem eine Binärdatei besteht, zurückzuverfolgen.
Um dies in .NET zu vereinfachen, haben wir eine kleine cmd-Zeilen-Exe erstellt, die an git übergeben wird. Bei einem Pre-Build-Ereignis wird die Build-Nummer abgerufen, die teamcity während des Builds markiert hat. Dieses Cmd-Linien-Tool generiert automatisch eine Klasse mit einer Konstanten, die die Build-Nummer enthält. Der Rest der Versionsnummer: major.minor.patch ist nur eine normale Konstante in einer anderen Datei. Diese beiden gemeinsam genutzten Dateien sind in jeder Baugruppe in einer Lösung als Verknüpfung enthalten (Alt + Umschalt + Ziehen).
Dieser Ansatz ist leistungsstark genug, um Teamfähigkeit zu erlangen und unseren Code zu testen. Push to Azure und lassen Kudu es erneut erstellen, aber mit der teamcity Build-Nummer als die Version der DLLs.
quelle