2012-08-22 16 views
11

我們將使用Ivy與Ant,我們會讓Jenkins做我們的構建。我原本以爲Jenkins在運行構建之前做了<ivy:cleancache/>是個好主意。 (這將是強制性「乾淨」目標的一部分)。常春藤,螞蟻,詹金斯 - Jenkins構建的<ivy:cleancache>是個好主意嗎?

但是,我現在看到<ivy:cleancache>不是簡單地從<ivy:cachepath>清理東西,而是真的刪除了整個$HOME/.ivy/cache目錄。

我擔心的是,如果Jenkins在開始之前對所有構建做了<ivy:cleancache>,它將會干擾Jenkins可能執行的其他構建。

正在做<ivy:cleancache>一個好主意,特別是如果一個用戶可能同時進行多個構建?

事實上,當您在多個項目中執行<ivy:cachepath pathid="compile.path"/>時會發生什麼?這是否也會影響Jenkins這樣的事情?如果多個構建在同一時間構建compile.cachepath,詹金斯會感到困惑嗎?

回答

7

在我看來,每一次構建運行常青藤cleancache任務是矯枉過正,並消除了使用常春藤,智能下載第三方依賴關係的主要好處之一。

如此說來,如下相關Maven的問題說明,所有的緩存可以變髒,應該定期清洗:

When is it safe to delete the local Maven repository?

夫婦的建議:

使用專用詹金斯工作(S )清除常春藤緩存

我的第一個建議是創建一個定期的詹金斯作業,在您的構建中調用以下全部清理目標:

<target name="clean-all" depends="clean"> 
    <ivy:cleancache/> 
</target> 

這保證了當高速緩存被清除,您可以通過使用多個高速緩存安排其正常的生成時間之外發生(例如凌晨2點在每月的1日)

隔離每個項目詹金斯決定

我的第二個建議增加了您的項目構建之間的隔離。使用caches指令將每個項目配置爲擁有自己的專用緩存。在你常春藤設置文件。

+0

謝謝。清理緩存只會增加大約90秒的時間(我們有一個本地公司的Maven倉庫)。它不會影響_CI_概念,所以它不會真正傷害Jenkins開始每個構建w /一個乾淨的緩存。開發人員可以通過將ivy.cleancache設置爲false來關閉。具有諷刺意味的是,緩存清理會刺激開發人員,因爲它會延長構建時間,但不會影響構建。詹金斯不在乎,但如果詹金斯正在執行多項工作,這可能是一個問題。 –

3

這裏就是我決定做的事:

我修改我ivysettings.xml文件有以下幾點:

<ivysettings> 
    <properties environment="env." override="false"/> 
    <caches 
     defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}" 
     resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/> 
    <settings defaultResolver="default"/> 
    <include file="${ivy.dir}/ivysettings-public.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-local.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/> 
</ivysettings> 

這不兩兩件事:

  • 它定義了常春藤本地緩存爲$HOME/.ivy/cache-$EXECUTOR_NUMBER其中$EXECUTOR_NUMBER是Jenkins執行者。這意味着每個執行者都有自己的Ivy緩存。因此,如果Jenkins一次執行多個作業,每個作業都將被另一個執行者選中,因此它將擁有自己的緩存。如果某個工作想要清理緩存,它可以繼續前進。
  • 我已將解析緩存定義爲${basedir}/target/ivy.cache。這爲每個作業提供了自己的解析器緩存,它非常小。但是,如果Jenkins正在構建同一Ivy項目的多個修訂版,常春藤解決方案不會干擾其他工作。

唯一的缺點是用戶的默認緩存目錄被稱爲$HOME/.ivy/cache-$env.EXECUTOR_NUMBER這不是一個漂亮的網站。我很樂意讓它更合理$HOME/.ivy/cache-0,但我還沒有想出來。但是,在這一點上它並不影響任何事情。

現在,開發人員擁有一個包含所有已下載的jar的單個Ivy緩存。這樣,可以在各個項目之間共享jar,從而加速開發人員的工作。

與此同時,Jenkins可以像配置一樣經常清理常青藤緩存。這可以針對每項工作完成,或者每天或每月進行一次。但是,由於緩存是按執行程序完成的,因此我將不會遇到正在清理緩存的問題,而另一個作業(將在另一個執行程序上運行)取決於該緩存。

這應該解決所有的特定問題。我想要做的唯一事情是弄清楚如何設置一個默認的EXECUTOR_NUMBER變量(如果還沒有設置的話)。我試過這樣的各種東西:

<ivysettings> 
    <property name="env.EXECUTOR_NUMBER" value="0" override="false"/> 
    <properties environment="env." override="false"/> 
    <caches 
     defaultCacheDir="${ivy.default.ivy.user.dir}/cache-${env.EXECUTOR_NUMBER}" 
     resolutionCacheDir="${ivy.dir}/../target/ivy.cache"/> 
    <settings defaultResolver="default"/> 
    <include file="${ivy.dir}/ivysettings-public.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-shared.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-local.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-main-chain.xml"/> 
    <include url="${ivy.default.settings.dir}/ivysettings-default-chain.xml"/> 
</ivysettings> 

但是,無濟於事。我已經修改了<property><properties>文件中的override參數所有不同的方法,但它並不完全符合我的要求。

2

只是我一直在做很多事情來解決你的最後一個問題。

您可以添加這詹金斯螞蟻的屬性生成步驟

another.less.obtrusive.name=${EXECUTOR_NUMBER} 

,並加入到ivysettings.xml。

所以對每個人來說都是「0」,除了詹金斯,因爲它會將這個屬性注入ANT。

關於主要問題: 關於詹金斯,我總是開始新的。 CI構建應該健壯,徹底。快速是一種受歡迎的副產品,但不是動機。

+1

好主意。我所做的是將其設置在我的'ivy.tasks.xml'中,每個人都必須導入。我在'之後做了一個'。然後,我執行我的''任務。無論如何,我們必須導入環境,因爲我們需要我們的開發人員將Jenkins構建信息嵌入到罐子,戰爭和耳朵中。 –

+0

花費了我的時間超過了我無法承認的範圍 - 此答案中列出的「EXECUTOR」變量名拼寫錯誤。應該是$ {EXECUTOR_NUMBER} –