GNU/Linux >> Tutoriels Linux >  >> Linux

Utilisation de Jenkins BUILD NUMBER dans le fichier de spécification RPM

Cela fait longtemps... et heureusement, je n'ai pas de système basé sur les rpm, donc je ne peux pas tester cela.

Vous pouvez passer des paramètres à rpmbuild en ligne de commande

rpmbuild --define="version ${env.BUILD_NUMBER}"

Il serait utile de publier des extraits de la spécification et du script que vous utilisez pour créer le rpm. Vous ne voulez pas que votre script de construction modifie le fichier de spécification, que je suppose qu'il extrait d'un contrôle de source.


J'ai utilisé le numéro de build Jenkins comme "version" et empaqueté via fpm.

Coupler fpm avec quelques globals fournis par Jenkins

# $BUILD_ID - The current build id, such as "2005-08-22_23-59-59" (YYYY-MM-DD_hh-mm-ss)
# $BUILD_NUMBER - The current build number, such as "153"
# $BUILD_TAG - String of jenkins-${JOB_NAME}-${BUILD_NUMBER}. Convenient to put into a resource file, a jar file, etc for easier identification.

Il y a quelques variables nébuleuses dans l'exemple de commande ci-dessous, mais $BUILD_NUMBER est ce que j'utilise pour la version ici (fpm l'appelle itération à la place).

fpm_out=$(fpm -a all -n $real_pkg_name -v $version -t rpm -s dir --iteration $BUILD_NUMBER ./*)

Dans ma configuration Jenkins, j'ai décidé de contourner complètement le numéro de build en ce qui concerne la numérotation des versions RPM. Au lieu de cela, j'utilise un script maison qui génère et garde une trace des différentes versions générées.

Dans mon fichier de spécifications :

Version:    %{_iv_pkg_version}
Release:    %{_iv_pkg_release}%{?dist}

Et dans le script de build Jenkins :

# Just initialising some variables, and retrieving the release number.
package="$JOB_NAME"
# We use setuptools, so we can query the package version like so.
# Use other means to suit your needs.
pkg_version="$(python setup.py --version)"
pkg_release="$(rpm-release-number.py "$package" "$pkg_version")"

# Creating the src.rpm (ignore the spec file variables)
rpmbuild --define "_iv_pkg_version $pkg_version" \
    --define "_iv_pkg_release $pkg_release" \
    -bs "path/to/my/file.spec"

# Use mock to build the package in a clean chroot
mock -r epel-6-x86_64 --define "_iv_pkg_version $pkg_version" \
    --define "_iv_pkg_release $pkg_release" \
    "path/to/my/file.src.rpm"

rpm-release-number.py est un script simple qui gère une base de données basée sur des fichiers (au format JSON, pour une maintenance facile). Il peut gérer l'exécution en même temps, donc pas de soucis là-bas, mais cela ne fonctionnera pas si vous avez des esclaves de construction (pour autant que je sache, je ne les utilise pas, donc je ne peux pas tester). Vous pouvez trouver le code source et la documentation ici.

Le résultat est que j'obtiens le schéma de gestion des versions de package suivant :

# Build the same version 3 times
foo-1.1-1
foo-1.1-2
foo-1.1-3
# Increment the version number, and build twice
foo-1.2-1
foo-1.2-2

PS :Notez que le script de construction Jenkins n'est qu'un exemple, la logique derrière la création de la structure de répertoires rpmbuild et la récupération des noms de fichiers .src.rpm et .spec est un peu plus compliquée.


Linux
  1. Qu'est-ce qu'un numéro d'inode sous Linux ?

  2. Utiliser Inotify pour surveiller l'accès à un fichier ?

  3. Incrémenter le numéro de build dans Bash ?

  4. Utilisation de nc pour transférer un fichier volumineux

  5. Utiliser le trait de soulignement dans les noms de fichiers ?

Utilisation du fichier de configuration SSH

5 façons de compter le nombre de lignes dans un fichier

Utiliser Uniq sur le texte Unicode ?

Compter le nombre total d'occurrences à l'aide de Grep ?

Comment :une introduction à l'utilisation de Git

Transférer des fichiers à l'aide de WinSCP