2017-04-10 112 views
8

私はdeclarative Jenkins pipelinesを使用してビルドパイプラインのいくつかを実行していて、複数のエージェントラベルを定義できるかどうか疑問に思っていました。宣言型Jenkinsパイプラインで複数のエージェントラベルを定義できますか?

Jenkinsに数多くのビルドエージェントが接続されていて、この特定のパイプラインが、異なるラベル(ただし、すべてのエージェントではありません)を持つさまざまなエージェントによって構築できるようにしたいと考えています。

より具体的には、ラベルが「小」のエージェントが2つ、ラベルが「中」のラベルが4つ、ラベルが「大」のラベルが6つあるとします。今私は非常にリソースの低いパイプラインを持っています。そして、私はそれがキュー内でより大きなビルドを待たせるかもしれないので、「小さい」または「中規模」のエージェントでのみ実行されたいが、不必要に長い時間です。

私が今まで見たすべての例では、1つのラベルしか使用していません。 私はこのようなものを試しました:

agent { label 'small, medium' } 

しかし、それは失敗しました。

私はJenkins Pipeline Pluginのバージョン2.5を使用しています。

答えて

9

あなたはジェンキンスインストール内「パイプライン構文」ヘルプを参照してくださいとサンプルステップ「ノード」リファレンスを参照してくださいすることができます。

あなたはexprA||exprBを使用することができます。

node('small||medium') { 
    // some block 
} 
+2

ああ、実際に働いていたね。宣言型パイプラインの場合、エージェント{label 'small || medium'}のようになります。ありがとう。 – FrontSide

+3

OPは何を要求したのではなく、AND演算子(&&)は両方のラベルが必要な場合にもうまく機能します: 'node( 'small && medium')'と演算子とラベルの間にスペースを入れることができます。 – firepol

6

EDIT:質問に誤解されました。この回答は、特定のエージェントを各ステージで実行する が分かっている場合にのみ表示されます。

複数のエージェントが必要な場合は、agent noneを宣言し、各段階でエージェントを宣言できます。ドキュメントから

https://jenkins.io/doc/book/pipeline/jenkinsfile/#using-multiple-agents

pipeline { 
    agent none 
    stages { 
     stage('Build') { 
      agent any 
      steps { 
       checkout scm 
       sh 'make' 
       stash includes: '**/target/*.jar', name: 'app' 
      } 
     } 
     stage('Test on Linux') { 
      agent { 
       label 'linux' 
      } 
      steps { 
       unstash 'app' 
       sh 'make check' 
      } 
      post { 
       always { 
        junit '**/target/*.xml' 
       } 
      } 
     } 
     stage('Test on Windows') { 
      agent { 
       label 'windows' 
      } 
      steps { 
       unstash 'app' 
       bat 'make check' 
      } 
      post { 
       always { 
        junit '**/target/*.xml' 
       } 
      } 
     } 
    } 
} 
+0

ねえ。ありがとう。残念ながら、それは私が探していたものではありません。あなたがここに投稿したこのパイプラインを検討するならば、私はすべてのステージをLinuxまたはWindowsエージェントで実行できるようにしたいと思います。 – FrontSide

+0

さて、私は誤解しました。私が読んだことから、jenkinsfileのエージェントのサブセットを宣言する方法はありません。幸運 – mcalcote

+0

いいえ、気にしないでください。宣言的なパイプラインの前でうまくいきました。私が推測するプル・リクエスト時間。 – FrontSide

0

6つのすべてのエージェントを持つ別のラベルコール「小または媒体」を作成します。その後Jenkinsfileに:

agent { label 'small-or-medium' } 
+0

これは特定の方法で動作することが確認できます。私はそれを次のようにテストしました:わずかに異なる設定のfedoraシステムを持つ2つのノード。両者に "fedora"というラベルを付けました。Jenkinsfile:agent {label 'fedora'}ビルドが始まると、1つのノードがランダムに選択されます。しかし、あなたがもう一度それを始めると、それは次のノードでもすぐに始まります。 – Freitags

4

この構文は私のために動作するように表示されます。

agent { label 'linux && java' } 
+0

ロジックが正常に動作する場合、これは、このジョブを選択するためにエージェントが両方のラベルを必要とすることを意味します。これはまさに私が探していたものの反対です。上記の回答は私が必要としていたものです。しかし、ありがとう。 – FrontSide

+0

私はその部分を見逃した...私の悪い。誰かが両方のラベルを探している場合でも、私はここに残します。 –

関連する問題