2010-02-09 63 views
12

我在Hudson中建立了一个C项目,它做得很好,我也有一个.rpm spec文件用于从这些源创建rpms。使用Hudson来构建RPM包

有没有人有任何关于如何使用哈德森建立rpms的经验?

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

回答

1

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

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

1

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

您可以创建RPM版本将在哈德逊作业的工作区使用的目录结构 - 这已经可以在哈德森的确结账,也可以分别由生成脚本来创建。从这个目录中你可以创建你的RPM(使用从Hudson启动的外部进程?)。之后,您可以使用普通的Hudson配置设置将生成的rpm复制到工件目录。 (哈德森定义了一个environment variables,你可以使用 - 工作区的位置是其中之一)

2

不知道如果我有你的问题很好的答案。

这对我很有效,但对您的需求感到超重。

我使用的Maven插件RPM http://mojo.codehaus.org/rpm-maven-plugin/ 基本上用于创建规范文件,奠定了源DSL曾与这样的成功的体面的数额等

的好处是一个Maven工件,哈德森可以更容易追踪。

我在maven版本(http://docs.codehaus.org/display/GMAVEN/Executing+Groovy+Code)中添加了一个小groovy脚本,以便最终自动更新承载构建的yum存储库,但在您的情况下,我可能会在rpm插件用于调用make。

老实说,我觉得上面的解决方案有点重要,主要是由于在maven中执行脚本的冗长性,但它确实有效,对于我们来说,与一群熟悉maven的java开发人员一起工作良好。

1

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

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

2

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

无论哪种方式,从我一对夫妇的提示:

  1. 你需要哈德森/詹金斯构建区域,它可以在JENKINS_HOME只是一个目录。您需要通过.rpmmacros将rpmbuild指向它。我看起来就像%_topdir /srv/build,但你当然可以在那里定义更多的宏。
  2. 在我上一个项目中,我需要从集成分支(在集成时间范围内)或从主干(集成时间范围外)构建RPM。为此,我构建了一个Perl脚本,根据当前日期检出正确的分支,并在其上运行rpmbuild -bb project.spec。由于该脚本还将RPM上传到存储库,因此除了这个单独的脚本之外,我不需要其他任何东西,这意味着我实际上像使用高级cron管理器一样使用Hudson(每天自动构建三次,手动构建鼠标单击)。尽管如此,它仍然是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构建RPMs是非常容易的,因为困难的部分是制作一个干净的RPM规范。其他一切都取决于您的需求,可以通过一些脚本或Jenkins插件修复。

+0

+1像tar解决方案。 – reen 2011-05-23 14:44:48

+0

当RPM在svn脚手架之外独立构建时,该build-a-tarball脚本如何工作? 虽然太多的测试不运行,但确认独立构建的能力是非常有价值的。 – user2066657 2016-09-15 13:09:55

2

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

这里的魔力:

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

这为构建过程作为当前目录的顶级目录。

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

0

这里有一个詹金斯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)

0

的一些研究之后来自很多博客帖子和其他资源的信息,我把这一切合并成一个脚本,这可以很容易地使用我n jenkins建筑套餐:https://github.com/jhrcz/jenkins-rpm-builder

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

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