Jenkins自动化RPM构建:版本与发布信息工作流及读取方案问询
作为经常折腾Jenkins自动化RPM构建的开发者,我来分享下实战中的方案,刚好能解决你的痛点:
一、从setup.py读取版本号:sed可行,但Python脚本更可靠
首先,从setup.py提取版本号完全可以自动化,sed确实能用,但我更推荐用Python本身来读取——毕竟setup.py是Python文件,用Python解析能避免sed处理字符串时的边缘情况(比如setup.py里version是动态生成的、或者写法略有不同)。
方案1:用Python脚本提取(推荐)
写一个简单的get_version.py脚本放在项目根目录:
from setuptools import setup, find_packages # 加载setup.py的配置 setup_args = {} exec(open('setup.py').read(), setup_args) print(setup_args['version'])
然后在Jenkins构建步骤里执行这个脚本,把结果赋值给环境变量:
VERSION=$(python get_version.py) echo "Extracted version: $VERSION"
这个方法不管setup.py里的version是硬编码还是简单动态生成,都能准确读取。
方案2:用sed快速实现(适合简单场景)
如果你的setup.py里version是标准写法(比如version="1.2.3"),sed完全能搞定,命令示例:
VERSION=$(sed -n "s/^.*version=['\"]\([^'\"]*\)['\"].*/\1/p" setup.py)
但要注意:如果setup.py里version的写法变了(比如用变量、或者多行定义),这个sed命令可能失效,所以只适合版本号写法固定的项目。
二、发布号(Release)的存储方案:release.txt是不错的选择
发布号我在项目里用过几种方式,各有优劣,你可以根据项目规模选:
1. 单独的release.txt文件(推荐小型/中型项目)
这是最直观的方案:在项目根目录放一个release.txt,内容就是纯数字(比如1),每次发布递增。
- Jenkins读取:
RELEASE=$(cat release.txt) - 构建成功后自动更新:
echo $((RELEASE + 1)) > release.txt,然后提交到Git仓库(记得在Jenkins里加Git提交步骤) - 优点:维护成本极低,所有人都能看懂,适合版本迭代不复杂的项目。
2. 用Git标签管理(适合Git优先的项目)
把发布号和版本号绑定到Git标签上,比如标签格式为v{version}-{release}(比如v1.2.3-2)。
- Jenkins可以通过
git describe --tags解析标签获取release号,或者在构建前根据当前版本号生成新标签。 - 优点:发布记录和代码版本完全绑定,回溯方便;缺点:需要维护标签规范,对团队Git使用有要求。
3. 用Jenkins构建号当发布号(适合快速迭代场景)
直接用Jenkins内置的BUILD_NUMBER环境变量作为release号,比如RELEASE=$BUILD_NUMBER。
- 优点:不用额外维护任何文件/标签,零成本;缺点:如果重新构建同一个版本,release号会变,不适合需要严格版本追溯的场景。
4. 版本号+日期组合(适合需要追踪发布时间的场景)
比如RELEASE=$(date +%Y%m%d),生成类似1.2.3-20240520的包名,能一眼看出发布日期。
三、完整的Jenkins自动化工作流示例
结合上面的方案,一套流畅的工作流大概是这样:
- 拉取代码:Jenkins从Git仓库拉取最新代码(如果用release.txt,记得拉取时包含这个文件)
- 提取版本号:执行
get_version.py或sed命令,把版本号存入VERSION环境变量 - 获取发布号:读取
release.txt得到RELEASE,或用BUILD_NUMBER等其他方案 - 构建RPM:调用rpmbuild或你的打包脚本,传入
$VERSION和$RELEASE,生成[name]-$VERSION-$RELEASE.$(arch).rpm - 更新发布号(可选):如果用release.txt,构建成功后递增数字并提交到Git
- 归档与分发:把生成的RPM包上传到YUM仓库,或存入Jenkins的构建归档
- 通知:发送邮件/企业微信通知,告知构建结果和包信息
注意事项
- 如果用release.txt,要处理并发构建的问题:比如在Jenkins里加锁插件,避免两个构建同时读取和更新release.txt导致冲突
- 如果setup.py里的版本号是动态生成的(比如从Git标签读取),那用Python脚本提取会比sed靠谱得多
- 把
VERSION和RELEASE设为Jenkins的全局环境变量,方便后续构建步骤复用
内容的提问来源于stack exchange,提问作者user5580578

