8
Name:                   My Software
Version:                1.0.5
Release:                1
Summary:                This is my software

不确定是否有人以前尝试过或者是否容易,但是:

规范文件有两个唯一的版本指示符:

  • 版本(指定软件版本)
  • 发布(它指定了包的编号——如果你构建了一个 RPM,它就坏了,然后再构建一个,你就增加了“发布”号。

我想知道是否有人尝试过或知道如何使用 Jenkins $BUILD_NUMBER 变量来动态更改Release数字,从而在Release每次新的成功构建完成时增加数字......?

4

4 回答 4

7

已经很长时间了……谢天谢地,我没有基于 rpm 的系统,所以我无法对此进行测试。

您可以rpmbuild在命令行上传递参数

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

发布规范的片段和您用于构建 rpm 的脚本会很有帮助。您不希望您的构建脚本编辑规范文件,我假设它是从某些源代码控制中提取出来的。

于 2013-04-22T21:36:34.137 回答
3

我一直使用 Jenkins 内部版本号作为“发布”并通过fpm打包。

将 fpm 与 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.

下面的示例命令中有一些模糊的变量,但这$BUILD_NUMBER是我在此处用于发布的变量(fpm 将其称为迭代)。

fpm_out=$(fpm -a all -n $real_pkg_name -v $version -t rpm -s dir --iteration $BUILD_NUMBER ./*)
于 2013-12-09T14:27:06.620 回答
3

在我的 Jenkins 设置中,我决定完全绕过关于 RPM 版本编号的内部版本号。相反,我使用自制脚本来生成并跟踪正在生成的各种版本。

在我的规范文件中:

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

在 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是一个简单的脚本,用于维护基于文件的数据库(JSON 格式,便于维护)。它可以处理同时运行,所以不用担心,但如果你有构建从属服务器,它就行不通(据我所知,我不使用它们,所以无法测试)。您可以在此处找到源代码和文档。

结果是我得到了以下包版本控制方案:

# 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:请注意,Jenkins 构建脚本只是一个示例,创建 rpmbuild 目录结构和检索 .src.rpm 和 .spec 文件名背后的逻辑有点复杂。

于 2014-02-04T13:28:25.450 回答
-1

考虑到规范文件可能是第 3 方,我更喜欢对 Release 字段进行预构建 sed-patching:

sed -i 's/^Release:\(\s*\)\(.*\)$/Release:\1%{?_build_num:%{_build_num}.}%{expand:\2}/g' ./path/to/spec
rpmbuild --define '_build_num $BUILD_NUM' -ba ./path/to/spec

这里%{expand:...}的宏用于处理宏定义的版本号,如 Mageia 规范中的版本号:

Release: %mkrel 1

结果字段将是:

Release: %{?_build_num:%{_build_num}.}%{expand:%mkrel 1}

宏的条件扩展_build_num使规范仍然可用于本地构建。即如果 SRPM 也由构建系统准备。但它可以简化为:

sed -i 's/^Release:\(\s*\)\(.*\)$/Release:\1'$BUILD_NUM'.%{expand:\2}/g' ./path/to/spec
rpmbuild -ba ./path/to/spec
于 2019-11-13T19:55:54.050 回答