2010-02-09 64 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之間所需的所有差異。