在我的 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 文件名背后的逻辑有点复杂。