Version incrémentielle du package RPM «nombres» pour xyz> xyz-beta (ou alpha, rc, etc.)

10

Afin de publier des packages RPM de plusieurs versions différentes de certains logiciels, je cherche un moyen de spécifier des "numéros" de version qui sont considérés comme des "mises à niveau", et d'inclure la différenciation de plusieurs versions préliminaires, telles que (dans l'ordre ): "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", etc.

Le principal problème que j'ai avec cela est que RPM considère que "2.4.0" vient plus tôt que "2.4.0.alpha1", donc je ne peux pas simplement ajouter le suffixe à la fin du numéro de version finale.

Je pourrais essayer "2.4.0.alpha1", "2.4.0.beta1", "2.4.0.final", qui fonctionnerait, à l'exception de la "version candidate" qui serait considérée plus tard que "2.4.0.final" ".

Une alternative que j'ai envisagée consiste à utiliser la section "epoch:" du numéro de version de RPM (le préfixe epoch: est considéré avant le numéro de version principal afin que "1: 2.4.0" soit en fait antérieur à "2: 1.0.0") . En plaçant un horodatage dans le champ epoch:, toutes les versions sont ordonnées comme prévu par RPM, car leurs versions semblent incrémenter dans le temps. Cependant, cela échoue lorsque de nouvelles versions sont effectuées sur plusieurs versions principales en même temps (par exemple, 2.3.2 est publié après 2.4.0, mais leur version pour RPM est "20121003: 2.3.2" et "20120928: 2.4. 0 "et les systèmes sur 2.3.2 ne peuvent pas être" mis à niveau "vers 2.4.0, car rpm le voit comme une version plus ancienne). Dans ce cas, yum / zypper / etc refuse de passer à la version 2.4.0, donc mon problème.

Quels numéros de version puis-je utiliser pour y parvenir et assurez-vous que RPM considère toujours les numéros de version comme étant en ordre. Ou si ce n'est pas des numéros de version, un autre mécanisme dans l'emballage RPM?

Remarque 1: je voudrais conserver le champ "Release:" du fichier de spécifications pour son usage d'origine (plusieurs versions de packages, y compris les modifications de package, pour la même version du logiciel packagé).

Remarque 2: cela devrait fonctionner sur les versions de production actuelles des principales distributions, telles que RHEL / CentOS 6 et SLES 11. Mais je suis intéressé par des solutions qui ne le font pas, aussi, tant qu'elles n'impliquent pas de recompiler rpm!

Remarque 3: Sur les systèmes de type Debian, dpkg utilise un composant spécial dans le numéro de version qui est le caractère "~" (tilde). Cela oblige dpkg à compter le suffixe comme un ordre "négatif", de sorte que "2.4.0 ~ rien" viendra avant "2.4.0". Ensuite, l'ordre normal s'applique après le "~", donc "2.4.0 ~ alpha1" précède "2.4.0 ~ beta1" car "alpha" précède alphabétiquement "beta". Je ne cherche pas nécessairement à utiliser le même schéma pour les packages RPM (je suis sûr que cet équivalent n'existe pas), donc c'est juste FYI.

Jonathan Clarke
la source

Réponses:

4

Les directives officielles de rpm expliquent comment procéder et des liens vers une page d'exemples . Voici un exemple de la façon dont vous travailleriez avec le schéma de version très courant qui utilise trois niveaux de pré-version (a, b, rc) (que le rpm rend malheureusement légèrement compliqué à prendre en charge):

  • 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, deuxième version (modification de l'emballage de 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
stochastique
la source
Agréable! Merci beaucoup pour cela. Juste une chose dans votre exemple, il me semble que 1.0.0-0.1.rc1 sera trié comme plus ancien que 1.0.0-0.2.b2, sûrement? Ainsi, dès que le composant "-0.1" est remplacé par "-0.2", cela devrait rester "-0.2" dans tous les numéros de version futurs. Est-ce que je comprends bien?
Jonathan Clarke
Je pense que vous avez raison. Je vais vérifier la bonne façon de le faire correctement et mettre à jour ma réponse.
stochastique
Alors, quelle est la bonne façon?
Sam
6

Fedora a un ensemble de directives pour définir le numéro de version / version des packages de pré-version . Fondamentalement, vous utilisez le numéro de version de ce qui sera la version finale dans Version, et commencez le Releasenuméro par 0., un numéro incrémenté, puis alpha, betaou autre chose. Vous n'utiliseriez pas du tout de balise alphanumérique finalpour la version finale.

Notez que vous ne pouvez pas compter sur RPM pour prendre en charge le versionnement de tilde de style Debian. Plusieurs distributions désactivent cette fonctionnalité.

Michael Hampton
la source
Merci, je vais les examiner. À première vue, il semble qu'ils "détournent" le composant Release pour permettre des versions alpha / bêta / etc. en amont, ce que je trouve un peu lourd ... dans le logiciel fourni.
Jonathan Clarke
2

Je ne suis pas fan des distinctions alpha / bêta. Il y a du code publié et du code non publié.

Comment je le fais: j'aime le major.minor.build avec un système d'intégration continue (voir JenkinsCI). Le nombre entier de construction n'est jamais réinitialisé. Les modifications mineures du numéro de version sont destinées aux modifications rétrocompatibles. Les changements de nombres majeurs sont de grosses affaires.

Si le marketing n'aime pas que le «build» soit de grands nombres entiers, vous pouvez incrémenter le nombre mineur une fois pour le marketing uniquement sur les builds qui sont publiées, puis à nouveau lorsqu'il passe à l'ingénierie.

Volonté
la source
1
Eh bien, des versions alpha / bêta sont également publiées ... mais pas en tant que version "finale". Et je n'ai pas vraiment le choix à ce sujet, je veux juste que l'emballage suive: /
Jonathan Clarke
0

Je suis tombé sur un problème similaire et j'ai dû comparer les révisions entre RedHat, Debian, les packages Python et les gemmes Ruby pour unifier le numéro de la suite, ce qui m'a aidé à évaluer le "plus grand" que le "moins de" dans chaque cas:

Cela compare 1.3.0.post0.dev20180213210433 à 1.3.0, YMMV

pour Red Hat (merci à 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

Pour 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

Pour 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

Pour 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
la source