2016-10-03 61 views
3

這是How to configure Git post commit hook如何在Jenkins中一次遠程觸發一次構建?

的延伸或變體我的問題是,我希望每一個致力於構建。我想要的是一次觸發一個構建的單個實例。當單個實例正在運行時,新的請求可能會累積,但是當前的構建完成後,它們應該合併到一個新的構建中。

顯然,觸發應該在通常來自同一分支的有意義的git修訂版本上,並且構建應始終在最接近HEAD的觸發修訂版上執行(這是否合理?)。

所以,爲了這個問題,假設每個人都在推動主,並且我放置了一個git鉤子來觸發構建。我該如何做到這一點,以便待處理的請求合併到單個請求中而不是作爲單獨的構建排隊?

此行爲通過使用輪詢可以進行簡單配置,但我不想爲各種不相關的原因(大量作業+需要輪詢單個作業所消耗的多個回購)使用輪詢。

Jenkins parameterized job that only queues one build提供了一種可能性:使用快速終止的「啓動器」作業並使用「組合排隊的混帳哈希」啓動實際的工作作業。這種方法的問題在於啓動器工作需要在啓動工作任務之前檢查回購。鑑於一個大的git回購,這引起了無法接受的延遲。

+0

我想到的一點是,我允許作業在隊列中累積,每當作業運行時,它完全忽略觸發運行的git commit並只檢出HEAD,然後運行一個小系統groovy腳本清除所有比作業啓動時間更早的請求的隊列,從而在啓動構建之後但在隊列上運行腳本之前留下任何新請求,所以即使在運行腳本之前也不會錯過運行沒有更多的新請求進來... –

+0

隊列清理的麻煩是,直到新的運行被觸發,數百個新的請求可以堆積起來,渲染左側的作業歷史是無用的。 –

+0

另一個想法是不直接觸發長時間運行的單件作業,而是觸發一個小型系統常規工作,然後管理長時間運行的作業的隊列。在每次調用時,它都會檢查實際作業是否正在運行,如果沒有,則啓動它。如果隊列爲空,則排隊,否則清空隊列並排隊新作業。 –

回答

1

您是否有通過git鉤子觸發構建的需求?

因爲如果沒有,您可以很容易地得到所需的行爲,將您的作業觸發器更改爲存儲庫輪詢,並且超時。 讓我們說五分鐘,這給了這些新版本的足夠時間來堆積起來並且一次建成。

您也可以使用Throttle Concurrent Builds plugin並添加避免併發構建的約束。

編輯: 還有保持你的git鉤子,但增加一個Quiet Period的選項。這是詹金斯的核心功能,可通過管理詹金斯部分到達。

EDIT2: 當我讀過你的新意見,我想過Parametrized Scheduler Plugin並添加參數指定庫的URL,但這不是輪詢更改它的調度定期構建,這是不是你想要的。

在新規定的光,我會做一些聽起來有點像傑裏鑽機: 我會創造另一個作業稱爲您的項目執行人這傢伙將定期(每隔2分鐘左右構建),然後運行一個shell腳本,該腳本會包含一個大的if-else塊,這樣可以獲取並檢查不同預定義存儲庫中的更改,如果給定的存儲庫發生更改,則會使用所需參數觸發當前作業REPO_URL等)。

要檢查更改,可以將HEAD當前修訂散列存儲在執行程序作業工作空間的屬性文件中,然後將其與git rev-parse HEAD的輸出進行比較。

EDIT3:設置生成率 例子: enter image description here 這將每小時一次消耗你的隊列中。

+0

主要問題是我需要輪詢多個回購,因爲工作消耗多個回購。 –

+0

另一個用例是在另一個作業的下游觸發的作業。我知道在這種情況下,有一個名爲「Combine Queued git hashes」的複選框,它可以實現我想要的功能,但實現遠程觸發構建意味着要執行兩個簽出(一個用於使用Combined Queued git運行實際作業的作業哈希,然後一個用於實際工作)。想想看看一個15G的git倉庫...... –

+0

有一點需要記住的是,你不需要克隆倉庫來檢查它是否有新的變化。你只需要獲取索引... –

相關問題