2015-02-24 45 views
7

我正在測試Jenkins以查看它是否適合我們的構建和測試框架。我發現詹金斯及其可用插件適合我們的大部分需求。除了我似乎無法找到如何執行某種特定任務的幫助。如何與詹金斯並行多次運行相同的工作?

我們正在爲嵌入式設備創建應用程序。我們有100個需要在這些設備上運行的測試。如果我們在構建完成後在一臺設備上運行所有測試,則需要幾個小時才能獲得結果。但是,如果我們在100個並行設備上運行測試,那麼我們可以在更短的時間內獲得結果。

所有的測試都有非常相似的起點。使用設備的IP地址來運行測試腳本,並使用用戶名/ pw調用測試腳本。該腳本將在設備上進行必要的測試,併爲每個測試項目報告回傳/失敗。

我覺得這樣的長/痛苦的方式是寫在詹金斯100個職位,每個將是一個不同的測試腳本直接(與上述參數)和並行使用可用的插件運行這些。然而,從長遠來看,保持所有這些工作將非常困難。

因此,更好的方法是創建一個可以帶參數的Job(我們稱之爲child_tester),例如:測試腳本名稱,設備的IP地址,用戶名/ pw等等。然後使用另一個作業(讓我們稱之爲mother_tester)用不同的IP地址調用child_tester作業100次並且並行運行它們。我需要一些方法來累積child_tester作業的每個單獨運行的所有測試結果,並將它們報告給mother_tester。

我的問題是有一個插件或在詹金斯完成此任何方式?我查看了名爲「Build Flow」,「Parallel Test Executor」和「Parameterized Trigger」的插件信息。但是,他們似乎不符合我的需求。

謝謝你的幫助。

回答

10

我知道你已經看了到構建流程插件,但我不知道爲什麼你被解僱了。也許你可以指出我提案中的漏洞。

假設你的系統中有足夠的執行器並行運行作業,我認爲Build Flow pluginBuild Flow Test Aggregator plugin可以做你想做的。

  • Build Flow插件支持running jobs in parallel。我沒有看到任何理由爲什麼Build Flow無法安排您的「孩子」作業與不同的參數並行運行。

  • 構建流測試聚合器從構建流作業的計劃構建中獲取測試結果,因此您的「子」作業需要發佈自己的測試結果。

  • 您需要配置您的「孩子」的工作,以便它可以通過檢查並行運行「執行併發建立必要時」在任務配置。

  • 無論奴隸組提供連接到嵌入式設備將需要足夠的執行者並行運行作業。


更新:用簡單的構建流程定義:

parallel (
    { build("dbacher flow child", VALUE: 1) }, 
    { build("dbacher flow child", VALUE: 2) }, 
    { build("dbacher flow child", VALUE: 3) }, 
    { build("dbacher flow child", VALUE: 4) } 
) 

我得到的輸出:

parallel { 
    Schedule job dbacher flow child 
    Schedule job dbacher flow child 
    Schedule job dbacher flow child 
    Schedule job dbacher flow child 
    Build dbacher flow child #5 started 
    Build dbacher flow child #6 started 
    Build dbacher flow child #7 started 
    Build dbacher flow child #8 started 
    dbacher flow child #6 completed 
    dbacher flow child #7 completed 
    dbacher flow child #5 completed 
    dbacher flow child #8 completed 
} 

作業歷史表明,所有四個作業計劃在幾秒鐘之內。但作業構建步驟包含一個人工延遲(睡眠),可以防止任何單個構建快速完成。


更新2:這裏是從另一數據結構中,動態地生成的並行任務的列表的一個示例:

// create a closure for the deploy job for each server 
def paramValues = (1..4) 
def testJobs = [] 
for (param in paramValues) { 
    def jobParams = [VALUE: param] 
    def testJob = { 
    // call build 
    build(jobParams, "dbacher flow child") 
    } 
    println jobParams 
    testJobs.add(testJob) 
} 

parallel(testJobs) 

平行傳遞的列表被調用構建封閉件的列表具有獨特的參數。我必須確保在關閉功能之外定義作業參數,以確保作業將分開計劃。

我在Jenkins郵件列表中挑選了另一個answerthis thread的語法。

+0

當並行運行相同的作業名稱時,構建流程插件不起作用。例如,我的生成流看起來像這樣: 平行( {建立( 「FreestyleTest1」)}, {建立( 「FreestyleTest1」)} ) 然而,在這種情況下,輸出的樣子: 平行{ 附表工作FreestyleTest1 安排工作FreestyleTest1 構建FreestyleTest1#29開始 構建FreestyleTest1#29開始 FreestyleTest1#29完成 FreestyleTest1#29完成 } 作業只運行一次。如果我要將其中一項工作改爲另一項工作,那麼它們都會並行運行。 – Ash 2015-02-24 23:22:18

+0

@垃圾,有趣。在構建流程0.16的Jenkins 1.580.2中,我可以使用不同參數計劃4次相同的子作業,並且子作業同時運行4次。 – 2015-02-25 00:08:33

+0

謝謝你的例子和細節。我發現如果我爲子作業提供不同的參數/值,那麼實際上會執行多個子作業。它可能是一個插件錯誤。但是,工作仍不能平行進行。防爆輸出:平行{ 安排工作FreestyleTest1 安排工作FreestyleTest1 構建FreestyleTest1#36開始 FreestyleTest1#36完成 建立FreestyleTest1#37開始 FreestyleTest1#37完成 } .....詹金斯狀態板上顯示,37正在等待在36節結束時,即使節點有2個以上的執行器空閒。 – Ash 2015-02-25 00:58:56

1

請確保管理Jenkins - >管理節點設置中的執行者數量多於MultiJob項目中單個作業的數量。 默認情況下,我猜它是2.因此,我們需要增加它。