使用Hudson构建RPM包

时间:2010-02-09 22:14:23

标签: hudson rpm

我在Hudson中设置了一个C项目进行高度构建,我还有一个.rpm规范文件,用于从这些源创建rpms。

有没有人有过如何使用Hudson构建rpms的经验?

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

9 个答案:

答案 0 :(得分:2)

不确定我的问题是否得到了很好的回答。

这对我有用,但对你的需求感到超重。

通过使用maven rpm插件,我获得了相当大的成功 http://mojo.codehaus.org/rpm-maven-plugin/ 基本上是用于创建规范文件,布置源等的DSL。

优势是哈德森可以更容易追踪的maven神器。

我在maven build(http://docs.codehaus.org/display/GMAVEN/Executing+Groovy+Code)中添加了一个groovy脚本,以满足我最终的需求,自动更新托管构建的yum存储库,但在你的情况下,我可能会使用rpm插件用于调用make之前的脚本。

老实说,我觉得上面的解决方案有点重要,主要是因为在maven中编写脚本的冗长,但它确实有效,对我们来说,对于一群知道maven的java开发人员来说,效果很好。

答案 1 :(得分:2)

我现在已经完成了两个项目。这并不难,但在很大程度上取决于您的工作流程。最重要的问题是:在构建包之后你想用它做什么?在我之前的项目中,软件包刚刚进入存储库,因此我不需要收集任何文物。

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

  1. 你需要一个Hudson / Jenkins的构建区域,它可以只是JENKINS_HOME中的一个目录。您需要通过.rpmmacros将rpmbuild指向它。我看起来就像%_topdir /srv/build,但你当然可以在那里定义更多的宏。
  2. 在我的上一个项目中,我需要从集成分支(在集成时间框架中)或从集群(集成时间框架之外)构建RPM。为此,我构建了一个Perl脚本,根据当前日期检出正确的分支并在其上运行rpmbuild -bb project.spec。由于此脚本还将RPM上传到存储库,因此我不需要除此单个脚本之外的任何其他内容,这意味着我实际上使用Hudson就像一个高级cron管理器(一天三次自动构建,鼠标单击手动构建)。它仍然是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 ...命令。原因是我不需要从不同的分支机构建立。

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

答案 2 :(得分:2)

我同意上述内容 - 一旦您可以从任何目录创建RPM,您可以编写构建过程的脚本并直接将其放入Hudson。

这是魔术:

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

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

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

答案 3 :(得分:1)

我自己没有这样做但是会认为你可以让Hudson构建rpms但是rpm构建区域在Hudson工作区内。然后,您就可以将rpms链接为工件。

Here是如何使用rpm的不同构建区域。

答案 4 :(得分:1)

你在哈德森身上使用什么作为构建工具?使?

您可以创建rpm构建将在Hudson作业的工作区中使用的目录结构 - 这可能已经在Hudson执行的结帐中,或者可以由构建脚本单独创建。从这个目录中你可以创建你的rpms(使用你从Hudson启动的外部进程?)。之后,您可以使用常规Hudson配置设置将生成的rpm复制到artifacts目录。 (Hudson定义了一些你可以使用的environment variables - 工作空间位置就是其中之一)

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

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

fpm,它在90%的转速创建需求方面做得很好(也有deb等等)

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

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

答案 7 :(得分: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)

答案 8 :(得分:0)

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

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

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