2016-11-07 5 views
0

ジョブのビルドインスタンスを最大x個のノードで実行するように制限できますか?各Jenkinsビルドインスタンスを最大x個のノードに制限する方法

例えば、私は20のスレーブと "ParentJob"と呼ばれる親ジョブを持っているとしましょう。 「ParentJob」は、使用可能なスレーブ上で、「ChildJob」と呼ばれる20の子ジョブを同時に実行するように設定されています。複数のParentJobをキックオフする必要があるため、ParentJobビルドインスタンスごとに5つのノードに子ジョブを制限したいと考えています。

基本的には、ParentJob#1、#2、#3を同時に起動したいですが、ParentJob#1から生成されたChildJobsすべてがすべてのスレーブに影響しないようにしたいと思います。 ParentJob#1のChildJobsはノード1-5を使用し、ParentJob#2のChildJobsはノード6-10を使用し、ParentJob#3のChildJobsはノード11-15を使用する必要があります。

私はThrottle Concurrent BuildsプラグインとLockable Resourceプラグインを見てきましたが、達成したいことに対処していないようです。彼らは仕事レベルでのみ動作し、ビルドレベルでは動作しないようです。

私の他の選択肢は、使用可能なx個のノードをつかみ、一意にラベルを付け、これらのノードで子ジョブを実行するためのGroovyコードを書くことです。ジョブが終了すると、ラベルをクリアして他のビルドで使用できるようにすることができます。

もっと簡単なオプションやプラグインがありますか?多分、私はこれを複雑にしています。

あまりにも混乱しないことを望みます。前もって感謝します。

+0

したがって、トリガーしているジョブは同じジョブではありませんか?それらは別の仕事ですか?それが同じ仕事であれば、Throttle Concurrent Buildsプラグインはまさに必要なものです。私はアーキテクチャを誤解しているかもしれません。 – Dvir669

+0

私の問題を見てくれてありがとう。私は上記の説明を更新しました。うまくいけばそれはもっとはっきりしています。 – asahi7777777

答えて

0

何も見つかりませんでしたので、パイプラインジョブ用に以下のGroovyスクリプトを書いています。

このスクリプトは、最初の3つのスレーブを "TESTING _。*"ラベルなしで取得し、新しいラベルを追加します。ジョブは、ファーム内のすべてのスレーブを使用せずに、それらのノードでのみ実行されます。ジョブが終了すると、ラベルが削除されます。

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) 
     } 
    } 
} 
関連する問題