這是How to configure Git post commit hook如何在Jenkins中一次遠程觸發一次構建?
的延伸或變體我的問題是,我不希望每一個致力於構建。我想要的是一次觸發一個構建的單個實例。當單個實例正在運行時,新的請求可能會累積,但是當前的構建完成後,它們應該合併到一個新的構建中。
顯然,觸發應該在通常來自同一分支的有意義的git修訂版本上,並且構建應始終在最接近HEAD的觸發修訂版上執行(這是否合理?)。
所以,爲了這個問題,假設每個人都在推動主,並且我放置了一個git鉤子來觸發構建。我該如何做到這一點,以便待處理的請求合併到單個請求中而不是作爲單獨的構建排隊?
此行爲通過使用輪詢可以進行簡單配置,但我不想爲各種不相關的原因(大量作業+需要輪詢單個作業所消耗的多個回購)使用輪詢。
Jenkins parameterized job that only queues one build提供了一種可能性:使用快速終止的「啓動器」作業並使用「組合排隊的混帳哈希」啓動實際的工作作業。這種方法的問題在於啓動器工作需要在啓動工作任務之前檢查回購。鑑於一個大的git回購,這引起了無法接受的延遲。
我想到的一點是,我允許作業在隊列中累積,每當作業運行時,它完全忽略觸發運行的git commit並只檢出HEAD,然後運行一個小系統groovy腳本清除所有比作業啓動時間更早的請求的隊列,從而在啓動構建之後但在隊列上運行腳本之前留下任何新請求,所以即使在運行腳本之前也不會錯過運行沒有更多的新請求進來... –
隊列清理的麻煩是,直到新的運行被觸發,數百個新的請求可以堆積起來,渲染左側的作業歷史是無用的。 –
另一個想法是不直接觸發長時間運行的單件作業,而是觸發一個小型系統常規工作,然後管理長時間運行的作業的隊列。在每次調用時,它都會檢查實際作業是否正在運行,如果沒有,則啓動它。如果隊列爲空,則排隊,否則清空隊列並排隊新作業。 –