2016-11-07 37 views
0

是否可以將作業的構建實例限制爲最多x個節點上運行?如何將每個Jenkins構建實例限制爲最多x個節點

例如,假設我有20個從屬和一個名爲「ParentJob」的父作業。 「ParentJob」被配置爲在任何可用的從站上同時運行20個子作業,稱爲「ChildJob」。由於我需要啓動多個ParentJob,因此我想將每個ParentJob構建實例的子作業限制爲5個節點。

基本上,我想同時啓動ParentJob#1,#2和#3,但我不希望所有從ParentJob#1生成的ChildJob都佔用所有的從屬。來自ParentJob#1的ChildJob應使用節點1-5,來自ParentJob#2的ChildJob應使用節點6-10,來自ParentJob#3的ChildJob應使用節點11-15。

我看過油門併發構建插件和可鎖定資源插件,但他們似乎並沒有解決我想要完成的任務。他們似乎只在工作層面上工作,而不是在構建層面上工作。

我的另一種選擇是編寫Groovy代碼來抓取x個可用節點,將它們唯一標記,然後在這些節點上運行子作業。作業完成後,我可以清除標籤,使其可用於其他版本。

有沒有更簡單的選項或插件可以做到這一點?也許我過於複雜了。

希望不是太混亂。提前致謝。

+0

所以你觸發的工作是不一樣的工作嗎?那些是不同的工作?如果它是相同的工作油門併發構建插件正是你所需要的。我可能誤解了架構。 – Dvir669

+0

感謝您關注我的問題。我已經更新了上面的描述,希望更清楚。 – asahi7777777

回答

0

由於找不到任何東西,我爲管道作業編寫了以下Groovy腳本。

該腳本將抓取沒有「TESTING _。*」標籤的前3個從站並附加一個新標籤。然後只在這些節點上執行作業,而不佔用我的農場中的所有奴隸。作業完成後,標籤將被刪除。

node ("master") { 
    def new_label = "TESTING_" + org.apache.commons.lang.RandomStringUtils.random(7, true, true) 
    echo "New label for slaves: " + new_label 

    try { 
     stage('Reserve slaves') { 
      reserve_slaves(3, new_label) 
     } 

     stage('Smoke tests') { 
      // Do your parallel jobs here 
      // Pass in new_label to the job 
     } 
    } 

    finally { 
     stage('Return slaves') { 
      remove_label_from_slaves(new_label) 
     } 
    } 
} 


def reserve_slaves(number_of_slaves, new_label) { 
    def label_prefix = "TESTING_" 
    def slaves_with_new_label = 0 

    while (slaves_with_new_label < number_of_slaves) { 
     for (slave in jenkins.model.Jenkins.instance.slaves) { 
      def current_labels = slave.getLabelString() 

      if (!current_labels.contains(label_prefix)) { 
       echo "Adding label '${new_label}' to " + slave.name + ". Existing labels are: ${current_labels}" 
       slave.setLabelString(current_labels + " " + new_label) 
       slaves_with_new_label += 1 
      } 

      if (slaves_with_new_label >= number_of_slaves) { 
       break 
      } 
     } 

     if (slaves_with_new_label < number_of_slaves) { 
      echo "Waiting for nodes to become available..." 
      sleep(10) // in seconds 
     } 
    } 
} 


def remove_label_from_slaves(label) { 
    for (slave in jenkins.model.Jenkins.instance.slaves) { 
     def current_labels = slave.getLabelString() 

     if (current_labels.contains(label)) { 
      echo "Removing label '${label}' from " + slave.name + ". Existing labels are: ${current_labels}" 

      current_labels = current_labels.replace(label, '') 
      slave.setLabelString(current_labels) 
     } 
    } 
} 
相關問題