代码之家  ›  专栏  ›  技术社区  ›  leeeroy

使用Hudson构建RPM包

  •  12
  • leeeroy  · 技术社区  · 16 年前

    有没有人对如何使用Hudson来构建rpms有任何经验?

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

    9 回复  |  直到 16 年前
        1
  •  2
  •   JoshMahowald    16 年前

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

    这对我很有效,但我觉得你太胖了。

    通过使用mavenrpm插件,我已经取得了相当大的成功 http://mojo.codehaus.org/rpm-maven-plugin/ 基本上是一个用于创建spec文件、布局源代码等的DSL。

    好的一面是一个maven人工制品,哈德逊可以更容易地跟踪它。

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

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

        2
  •  2
  •   Nikolai Prokoschenko    15 年前

    不管怎样,我有几个提示:

    1. 您需要一个Hudson/Jenkins的构建区域,它可以只是Jenkins_HOME中的一个目录。你需要让rpmbuild通过 .rpmmacros . 我的看起来就像 %_topdir /srv/build ,但您当然可以在那里定义更多宏。
    2. 在我的上一个项目中,我需要从集成分支(在集成时间框架内)或从主干(集成时间框架外)构建RPM。为此,我构建了一个Perl脚本,它根据当前日期签出正确的分支并运行 rpmbuild -bb project.spec 在上面。由于这个脚本还将RPM上载到存储库,所以除了这个脚本之外,我不需要其他任何东西,这意味着我实际上像高级cron管理器一样使用Hudson(一天自动构建三次,鼠标点击手动构建)。但是它仍然是SVN触发的,所以我们没有不必要的构建。
    3. %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插件来解决。

        3
  •  2
  •   Christian Specht    14 年前

    我同意上面的观点-一旦你可以从任何目录创建一个RPM,你就可以编写构建过程的脚本,并直接把它放到Hudson中。

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

    这会将生成过程的顶层目录设置为当前目录。

    我也遇到了同样的问题,并在
    http://www.itforeveryone.co.uk/rpm-build-hudson-jenkins.html

        4
  •  1
  •   Mark    16 年前

    我自己没有这么做,但我认为你可以让哈德逊建立的rpm,但与rpm建设区内的哈德逊工作区。然后您就可以作为工件链接到RPM。

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

        5
  •  1
  •   Simon Groenewolt    16 年前

    你在hudson上用什么作为构建工具?制造?

    您可以创建一个目录结构,rpm build将在Hudson作业的工作区中使用—这可以已经在Hudson所做的签出中,也可以由您的构建脚本单独创建。从这个目录,你可以创建你的RPM(使用一个从Hudson?)启动的外部进程。然后,您可以使用正常的Hudson配置设置将生成的rpm复制到artifacts目录。(哈德逊定义了许多 environment variables 您可以使用的-工作区位置是其中之一)

        6
  •  1
  •   Daniel Voina    15 年前

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

    然后你可以使用哈德逊来构建和打包我们的软件。

        7
  •  1
  •   JoshMahowald    14 年前

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

    fpm在90%的rpm创建需求方面做得很好(deb等人也做过)

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

    此处项目: https://github.com/jordansissel/fpm

        8
  •  0
  •   xgMz    13 年前

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

        9
  •  0
  •   Jan Horacek    13 年前

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