我在 Hudson 建立了一个 C 项目,进行了几乎所有的构建,我还有一个 .rpm 规范文件,用于从这些源创建 rpm。
有没有人有任何关于如何使用 Hudson 构建 rpm 的经验?
现在我看到的唯一解决方案是设置一个作业,运行一个检查 svn 导出源的脚本,创建一个 tarball 并执行整个 rpm 构建。这似乎与 Hudson 无法很好地整合 - 例如,我如何收集文物?
我同意上述观点——一旦你可以从任何目录创建 RPM,你就可以编写构建过程的脚本并将其直接放入 Hudson。
这是魔术:
rpmbuild --define '_topdir '`pwd` -ba SPECS/helloworld.spec
这会将构建过程的顶级目录设置为当前目录。
我遇到了同样的问题,并在http://www.itforeveryone.co.uk/rpm-build-hudson-jenkins.html记录了整个过程
我现在已经为两个项目做过了。这并不难,但很大程度上取决于您的工作流程。最重要的问题是:你想在这个包被构建之后做什么?在我之前的项目中,包只是上传到存储库,所以我不需要收集任何人工制品。
无论哪种方式,我的一些提示:
.rpmmacros
。我的看起来就像%_topdir /srv/build
,但您当然可以在那里自由定义更多宏。rpmbuild -bb project.spec
在其上运行。由于该脚本还将 RPM 上传到存储库,因此除了这个单一脚本之外我不需要其他任何东西,这意味着我实际上像高级 cron 管理器一样使用 Hudson(每天自动构建 3 次,鼠标单击手动构建)。它仍然是 SVN 触发的,所以我们没有不必要地构建。我想拥有干净的软件包,并保留从命令行构建的可能性。出于这个原因,我的 RPM 规范从 SVN 导出自动创建了自己的 tarball。我已经为当前项目取消了导出功能,所以现在看起来像这样:
%define module my_project
%define _curdir .
%define _release %(/usr/bin/svnversion -c %_curdir | %__sed 's/.*://g')
%define _moddir %module-%_version-%_release
%define _source %(/bin/tar czf %_sourcedir/%_moddir.tar.gz --transform="s|^./|%_moddir/|g" --exclude=.svn .; /bin/echo %_moddir.tar.gz)
稍后在规范中:
Source0: %_source
在我当前的项目中,我将该脚本拆分为多个部分,因此我当前的 Jenkins 工作仅包含rpmbuild ...
命令。原因是我不需要从不同的分支构建。
总之:通过 Jenkins 构建 RPM 是可能的,这相当容易,因为困难的部分是制定一个干净的 RPM 规范。其他一切都取决于您的需求,可以通过一些脚本或 Jenkins 插件来修复。
不知道我是否对你的问题有一个很好的答案。
这对我有用,但对您的需求感觉超重。
通过使用 maven rpm 插件http://mojo.codehaus.org/rpm-maven-plugin/ 基本上是一个用于创建规范文件、布局源等的 DSL,我在这方面取得了相当大的成功 。
好处是哈德森可以更轻松地跟踪的 Maven 工件。
我在 maven 构建 ( http://docs.codehaus.org/display/GMAVEN/Executing+Groovy+Code ) 中添加了一个小脚本,以满足我最后自动更新托管构建的 yum 存储库的需要,但在您的情况下,我可能会在使用 rpm 插件调用 make 之前使用该脚本。
老实说,我觉得上面的解决方案有点重,主要是因为在 maven 中编写脚本很冗长,但它确实有效,而且对我们来说,与一群了解 maven 的 java 开发人员一起,效果很好。
您在 hudson 上使用什么作为构建工具?制作?
您可以创建 rpm build 将在 Hudson 作业的工作区中使用的目录结构 - 这可能已经在 Hudson 所做的检查中,也可以由您的构建脚本单独创建。从此目录中,您可以创建 rpm(使用从 Hudson 启动的外部进程?)。之后,您可以使用正常的 Hudson 配置设置将生成的 rpm 复制到工件目录。(Hudson 定义了许多您可以使用的环境变量- 工作区位置就是其中之一)
我自己没有做过,但认为您可以让 Hudson 构建 rpm,但 rpm 构建区域位于 Hudson 工作区中。然后,您将能够链接到 rpm 作为工件。
这是使用 rpm 使用不同构建区域的方法。
Ant 可用于通过内置的 RPM 任务构建 RPM。您可以使用 CC 任务(来自 Ant-contrib)用 Ant 编译 C 源代码。
然后您可以使用 Hudson 构建和打包我们的软件。
有一次,我用自定义的 Scala 插件替换了上面提到的 maven dsl,部分原因是为了学习 scala。它确实满足了比这更多的需求。但现在,我只是提倡使用
fpm,它在 90% 的 rpm 创建需求方面做得很好(deb 等人也是如此)
这是我们使用的 Jenkins shell 脚本:
export PROJECT_NAME=
export PROJECT_VERSION=
#Cleanup
rm -f /tmp/JENKINS-BUILD/SPECS/$PROJECT_NAME.rpm.spec
rm -Rf /tmp/JENKINS-BUILD/SOURCES/$PROJECT_NAME /usr/src/redhat/SOURCES/$PROJECT_NAME
#Copy sources/artifacts
cp /var/lib/jenkins/jobs/$PROJECT_NAME/workspace/project-set/$PROJECT_NAME/showme/include/$PROJECT_NAME.rpm.spec /tmp/JENKINS-BUILD/SPECS/$PROJECT_NAME.rpm.spec
cp -R /var/lib/jenkins/jobs/$PROJECT_NAME/workspace/project-set/$PROJECT_NAME/showme /usr/src/redhat/SOURCES/$PROJECT_NAME
cp -R /var/lib/jenkins/jobs/$PROJECT_NAME/workspace/project-set/$PROJECT_NAME/showme /tmp/JENKINS-BUILD/SOURCES/$PROJECT_NAME
#Build RPM
rpmbuild --define 'BUILD_NUMBER '$BUILD_NUMBER -ba /tmp/JENKINS-BUILD/SPECS/$PROJECT_NAME.rpm.spec --define '_topdir '/tmp/JENKINS-BUILD/
cp /tmp/JENKINS-BUILD/RPMS/noarch/$PROJECT_NAME-$PROJECT_VERSION-$BUILD_NUMBER.noarch.rpm /var/lib/jenkins/jobs/$PROJECT_NAME/workspace
(归功于 JT/JWT)
在对来自许多博文和其他资源的信息进行了一些研究之后,我将所有这些信息合并到一个脚本中,该脚本可以很容易地在 jenkins 中用于构建包:https ://github.com/jhrcz/jenkins-rpm-builder 。
它以 yum 存储库的形式收集工件(rpm 包),因此通过一些配置,httpd 可以被定向到最新的稳定构建存储库。
在代码中,您会发现它支持包签名并尝试解决 el5 和 el6 之间所需的所有差异。