我在Hudson中设置了一个C项目进行高度构建,我还有一个.rpm规范文件,用于从这些源创建rpms。
有没有人有过如何使用Hudson构建rpms的经验?
现在我看到的唯一解决方案是设置一个运行脚本的作业,该脚本检查svn导出源,创建tarball并完成整个rpm构建。这似乎与Hudson没有很好的整合 - 例如我该如何收集文物?
答案 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)
我现在已经完成了两个项目。这并不难,但在很大程度上取决于您的工作流程。最重要的问题是:在构建包之后你想用它做什么?在我之前的项目中,软件包刚刚进入存储库,因此我不需要收集任何文物。
无论哪种方式,我都有一些提示:
.rpmmacros
将rpmbuild指向它。我看起来就像%_topdir /srv/build
,但你当然可以在那里定义更多的宏。rpmbuild -bb project.spec
。由于此脚本还将RPM上传到存储库,因此我不需要除此单个脚本之外的任何其他内容,这意味着我实际上使用Hudson就像一个高级cron管理器(一天三次自动构建,鼠标单击手动构建)。它仍然是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插件来修复。
答案 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等等)
答案 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之间所需的所有差异。