Inkrementelle RPM-Paketversionsnummern für xyz> xyz-beta (oder alpha, rc usw.)

10

Um RPM-Pakete mehrerer verschiedener Versionen einiger Software zu veröffentlichen, suche ich nach einer Möglichkeit, Versionsnummern anzugeben, die als "Upgrades" gelten, und die Unterscheidung mehrerer Vorabversionen, wie z. B. (in Reihenfolge) ): "2.4.0 Alpha 1", "2.4.0 Alpha 2", "2.4.0 Alpha 3", "2.4.0 Beta 1", "2.4.0 Beta 2", "2.4.0 Release Candidate", "2.4.0 final", "2.4.1", "2.4.2" usw.

Das Hauptproblem dabei ist, dass RPM der Ansicht ist, dass "2.4.0" früher als "2.4.0.alpha1" kommt, sodass ich das Suffix nicht einfach am Ende der endgültigen Versionsnummer hinzufügen kann.

Ich könnte "2.4.0.alpha1", "2.4.0.beta1", "2.4.0.final" ausprobieren, was funktionieren würde, mit Ausnahme des "Release Candidate", der später als "2.4.0.final" betrachtet wird ".

Eine Alternative, die ich in Betracht gezogen habe, ist die Verwendung des Abschnitts "epoch:" der RPM-Versionsnummer (das Präfix epoch: wird vor der Hauptversionsnummer berücksichtigt, sodass "1: 2.4.0" tatsächlich früher als "2: 1.0.0" ist). . Durch Einfügen eines Zeitstempels in das Feld epoch: werden alle Versionen wie von RPM erwartet sortiert, da ihre Versionen mit der Zeit zuzunehmen scheinen. Dies schlägt jedoch fehl, wenn neue Versionen für mehrere Hauptversionen gleichzeitig erstellt werden (z. B. wird 2.3.2 nach 2.4.0 veröffentlicht, die RPM-Version lautet jedoch "20121003: 2.3.2" und "20120928: 2.4". 0 "und Systeme unter 2.3.2 können nicht auf 2.4.0" aktualisiert "werden, da rpm dies als ältere Version ansieht. In diesem Fall weigern sich yum / zypper / etc, auf 2.4.0 zu aktualisieren, daher mein Problem.

Welche Versionsnummern kann ich verwenden, um dies zu erreichen, und stellen Sie sicher, dass RPM die Versionsnummern immer als in Ordnung betrachtet. Oder wenn nicht Versionsnummern, anderer Mechanismus in der RPM-Verpackung?

Hinweis 1: Ich möchte das Feld "Release:" der Spezifikationsdatei für den ursprünglichen Zweck beibehalten (mehrere Versionen von Paketen, einschließlich Verpackungsänderungen, für dieselbe Version der gepackten Software).

Hinweis 2: Dies sollte auf aktuellen Produktionsversionen wichtiger Distributionen wie RHEL / CentOS 6 und SLES 11 funktionieren. Aber ich bin an Lösungen interessiert, die dies auch nicht tun, solange sie keine Neukompilierung der Drehzahl beinhalten!

Hinweis 3: Auf Debian-ähnlichen Systemen verwendet dpkg eine spezielle Komponente in der Versionsnummer, nämlich das Zeichen "~" (Tilde). Dies führt dazu, dass dpkg das Suffix als "negative" Reihenfolge zählt, so dass "2.4.0 ~ alles" vor "2.4.0" steht. Dann gilt die normale Reihenfolge nach "~", sodass "2.4.0 ~ alpha1" vor "2.4.0 ~ beta1" steht, da "alpha" alphabetisch vor "beta" steht. Ich möchte nicht unbedingt dasselbe Schema für RPM-Pakete verwenden (ich bin mir ziemlich sicher, dass es kein solches Äquivalent gibt), daher ist dies nur zu Ihrer Information.

Jonathan Clarke
quelle

Antworten:

4

Die offiziellen RPM-Richtlinien erläutern dies und enthalten Links zu einer Beispielseite . Hier ist ein Beispiel dafür, wie Sie mit dem sehr gängigen Versionsschema arbeiten würden, das drei Vorabversionsstufen (a, b, rc) verwendet (deren Unterstützung bei Drehzahl leider etwas kompliziert ist):

  • 1.0.0a1 -> 1.0.0-0.1.a1
  • 1.0.0b1 -> 1.0.0-0.1.b1
  • 1.0.0b2 -> 1.0.0-0.1.b2
  • 1.0.0b2, zweite Version (Paketoptimierung von 1.0.0b2) -> 1.0.0-0.2.b2
  • 1.0.0rc1 -> 1.0.0-0.1.rc1
  • 1.0.0 -> 1.0.0-1
  • 1.0.1a1 -> 1.0.1-0.1.a1
  • 1.0.1 -> 1.0.1-1
stochastisch
quelle
Nett! Vielen Dank dafür. Nur eine Sache in Ihrem Beispiel, es scheint mir, dass 1.0.0-0.1.rc1 als älter als 1.0.0-0.2.b2 sortiert wird , sicher? Sobald die Komponente "-0.1" auf "-0.2" erhöht wird, sollte dies in allen zukünftigen Versionsnummern "-0.2" bleiben. Verstehe ich richtig
Jonathan Clarke
Ich denke du bist richtig. Ich werde den richtigen Weg überprüfen und meine Antwort aktualisieren.
stochastischer
Welches ist der richtige Weg?
Sam
6

Fedora verfügt über eine Reihe von Richtlinien zum Festlegen der Versions- / Versionsnummer von Pre-Release-Paketen . Grundsätzlich Sie die Versionsnummer verwenden , was in der endgültigen Version wird Version, und starten Sie die ReleaseNummer mit 0., eine fortlaufende Nummer, und dann alpha, betaoder was auch immer. Sie würden finalfür die endgültige Version überhaupt kein alphanumerisches Tag verwenden .

Beachten Sie, dass Sie sich nicht darauf verlassen können, dass RPM die Tilde-Versionierung im Debian-Stil unterstützt. Mehrere Distributionen deaktivieren diese Funktion.

Michael Hampton
quelle
Danke, ich werde mich darum kümmern. Auf den ersten Blick sieht es so aus, als würden sie die Release-Komponente "hochheben", um vorgelagerte Alpha / Beta / etc-Versionen zu ermöglichen, was ich etwas umständlich finde ... IMO, Release sollte zum Packen von Änderungen inkrementiert werden, nicht für Änderungen in der verpackten Software.
Jonathan Clarke
2

Ich bin kein Fan von Alpha / Beta-Unterscheidungen. Es gibt freigegebenen Code und unveröffentlichten Code.

Wie ich es mache: Ich mag das major.minor.build mit einem kontinuierlichen Integrationssystem (siehe JenkinsCI). Build Integer wird niemals zurückgesetzt. Kleinere Änderungen der Versionsnummer gelten für abwärtskompatible Änderungen. Große Zahlenänderungen sind große Geschäfte.

Wenn das Marketing nicht möchte, dass der "Build" große Ganzzahlen sind, können Sie die kleine Zahl für das Marketing nur für freigegebene Builds einmal und dann erneut erhöhen, wenn es um das Engineering geht.

Wille
quelle
1
Nun, Alpha / Beta-Versionen werden ebenfalls veröffentlicht ... nur nicht als "endgültige" Version. Und ich habe wirklich keine Wahl, ich möchte nur, dass die Verpackung folgt: /
Jonathan Clarke
0

Ich stieß auf ein ähnliches Problem und musste Revisionen zwischen RedHat-, Debian-, Python-Paketen und Ruby-Edelsteinen vergleichen, um die Suite-Nummer zu vereinheitlichen. Dies half mir dabei, jeweils "größer als" und "kleiner als" zu bewerten:

Dies vergleicht 1.3.0.post0.dev20180213210433 mit 1.3.0, YMMV

für Red Hat (danke an https://utcc.utoronto.ca/~cks/space/blog/linux/RPMShellVersionComparison )

docker run -ti centos:7
yum install rpmdevtools.noarch
rpmdev-vercmp "1.3.0" "1.3.0.post0.dev20180213210433" 
1.3.0 < 1.3.0.post0.dev20180213210433

Für Debian:

$ dpkg --compare-versions 1.3.0 gt 1.3.0.post0.dev20180213210433 ; echo $?
1  # false
$ dpkg --compare-versions 1.3.0 lt 1.3.0.post0.dev20180213210433 ; echo $?
0  # true

Für Python

>>> from pkg_resources import parse_version
>>> parse_version("1.3.0") > parse_version("1.3.0.post0.dev20180213210433")
False
>>> parse_version("1.3.0") < parse_version("1.3.0.post0.dev20180213210433")
True

Für Ruby

irb(main):001:0> Gem::Version.new("1.3.0") > Gem::Version.new("1.3.0.post0.dev20180213210433")
=> true
irb(main):002:0> Gem::Version.new("1.3.0") < Gem::Version.new("1.3.0.post0.dev20180213210433")
=> false
Nicocesar
quelle