12

我在 Hudson 建立了一个 C 项目,进行了几乎所有的构建,我还有一个 .rpm 规范文件,用于从这些源创建 rpm。

有没有人有任何关于如何使用 Hudson 构建 rpm 的经验?

现在我看到的唯一解决方案是设置一个作业,运行一个检查 svn 导出源的脚本,创建一个 tarball 并执行整个 rpm 构建。这似乎与 Hudson 无法很好地整合 - 例如,我如何收集文物?

4

9 回答 9

2

我同意上述观点——一旦你可以从任何目录创建 RPM,你就可以编写构建过程的脚本并将其直接放入 Hudson。

这是魔术:

rpmbuild --define '_topdir '`pwd` -ba SPECS/helloworld.spec 

这会将构建过程的顶级目录设置为当前目录。

我遇到了同样的问题,并在http://www.itforeveryone.co.uk/rpm-build-hudson-jenkins.html记录了整个过程

于 2011-10-16T17:16:59.927 回答
2

我现在已经为两个项目做过了。这并不难,但很大程度上取决于您的工作流程。最重要的问题是:你想在这个包被构建之后做什么?在我之前的项目中,包只是上传到存储库,所以我不需要收集任何人工制品。

无论哪种方式,我的一些提示:

  1. 你需要一个用于 Hudson/Jenkins 的构建区域,它可以只是 JENKINS_HOME 中的一个目录。您需要通过 将 rpmbuild 指向它.rpmmacros。我的看起来就像%_topdir /srv/build,但您当然可以在那里自由定义更多宏。
  2. 在我的上一个项目中,我需要从集成分支(在集成时间范围内)或从主干(在集成时间范围之外)构建 RPM。为此,我构建了一个 Perl 脚本,它根据当前日期检查出正确的分支并rpmbuild -bb project.spec在其上运行。由于该脚本还将 RPM 上传到存储库,因此除了这个单一脚本之外我不需要其他任何东西,这意味着我实际上像高级 cron 管理器一样使用 Hudson(每天自动构建 3 次,鼠标单击手动构建)。它仍然是 SVN 触发的,所以我们没有不必要地构建。
  3. 我想拥有干净的软件包,并保留从命令行构建的可能性。出于这个原因,我的 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
    
  4. 在我当前的项目中,我将该脚本拆分为多个部分,因此我当前的 Jenkins 工作仅包含rpmbuild ...命令。原因是我不需要从不同的分支构建。

总之:通过 Jenkins 构建 RPM 是可能的,这相当容易,因为困难的部分是制定一个干净的 RPM 规范。其他一切都取决于您的需求,可以通过一些脚本或 Jenkins 插件来修复。

于 2011-03-08T16:25:12.137 回答
2

不知道我是否对你的问题有一个很好的答案。

这对我有用,但对您的需求感觉超重。

通过使用 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 开发人员一起,效果很好。

于 2010-04-29T19:53:02.683 回答
1

您在 hudson 上使用什么作为构建工具?制作?

您可以创建 rpm build 将在 Hudson 作业的工作区中使用的目录结构 - 这可能已经在 Hudson 所做的检查中,也可以由您的构建脚本单独创建。从此目录中,您可以创建 rpm(使用从 Hudson 启动的外部进程?)。之后,您可以使用正常的 Hudson 配置设置将生成的 rpm 复制到工件目录。(Hudson 定义了许多您可以使用的环境变量- 工作区位置就是其中之一)

于 2010-02-10T13:09:10.620 回答
1

我自己没有做过,但认为您可以让 Hudson 构建 rpm,但 rpm 构建区域位于 Hudson 工作区中。然后,您将能够链接到 rpm 作为工件。

是使用 rpm 使用不同构建区域的方法。

于 2010-02-09T22:49:49.677 回答
1

Ant 可用于通过内置的 RPM 任务构建 RPM。您可以使用 CC 任务(来自 Ant-contrib)用 Ant 编译 C 源代码。

然后您可以使用 Hudson 构建和打包我们的软件。

于 2010-09-06T18:13:27.597 回答
1

有一次,我用自定义的 Scala 插件替换了上面提到的 maven dsl,部分原因是为了学习 scala。它确实满足了比这更多的需求。但现在,我只是提倡使用

fpm,它在 90% 的 rpm 创建需求方面做得很好(deb 等人也是如此)

http://www.semicomplete.com/blog/geekery/fpm.html

项目在这里: https ://github.com/jordansissel/fpm

于 2012-02-14T17:46:04.200 回答
0

这是我们使用的 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)

于 2012-10-19T17:48:56.260 回答
0

在对来自许多博文和其他资源的信息进行了一些研究之后,我将所有这些信息合并到一个脚本中,该脚本可以很容易地在 jenkins 中用于构建包:https ://github.com/jhrcz/jenkins-rpm-builder 。

它以 yum 存储库的形式收集工件(rpm 包),因此通过一些配置,httpd 可以被定向到最新的稳定构建存储库。

在代码中,您会发现它支持包签名并尝试解决 el5 和 el6 之间所需的所有差异。

于 2013-01-19T02:38:33.423 回答