如何从jenkins管道中的NodeParameterDefinition访问所有节点?

时间:2017-04-11 08:13:37

标签: jenkins jenkins-plugins jenkins-pipeline

我正在编写一个Jenkins文件,它使用NodeLabel Parameter Plugin作为jenkins。在这里,我使用NodeParameterDefinition让用户能够选择构建应该发生的节点。我已启用allowMultiSelectionForConcurrentBuilds,但在访问Jenkinsfile中的参数值时,我仍然只获得一个只有一个节点名的字符串。参数值类型也是一个字符串,如何获取用户为参数选择的所有节点?

参数定义:

 [
     $class: 'NodeParameterDefinition',
     allowedSlaves: ['ALL (no restriction)'],
     defaultSlaves: ['master'],
     description: 'What nodes to run the build on.',
     name: 'BUILD_NODE',
     nodeEligibility: [$class: 'AllNodeEligibility'],
     triggerIfResult: 'allowMultiSelectionForConcurrentBuilds'
 ]

因此,如果我在执行时选择多个节点,我在访问此参数值时仍然只获得一个节点名称。

echo "Will build on $BUILD_NODE";

管道脚本无法启用多节点选择吗?

我如何访问参数值:

echo "Will build on $BUILD_NODE";
node("$BUILD_NODE")
{
   ...
}

1 个答案:

答案 0 :(得分:1)

NodeLabel Parameter Plugin在Pipeline和Blue Ocean上无法正常使用,就像它不经常更新一样(请参阅revision history)。 Jenkins插件必须遵循requirements才能与管道兼容。

不幸的是,问题仍然没有解决(何时解决尚不知道): https://issues.jenkins-ci.org/browse/JENKINS-43720

  

问题是我无法使用env.NODE_PARAM或NODE_PARAM来获取   多个选择的节点,因为它们只是字符串表示形式   一个节点。

您可以投票给jira-task JENKINS-43720(单击“为此问题投票” ),或参与插件开发。

到目前为止,我发现我通过使用另一个参数选项 choice (模仿)来模仿插件行为的笨拙方式(但这在Blue Ocean中有效!):

properties([
    parameters([
    choice(choices: ["none", "node_1", "node_2"], description: "", name: "NODE_1"),
    choice(choices: ["none", "node_1", "node_2"], description: "", name: "NODE_2")
    ])
])
// here you can write your behaviour 
// e.g. validation of params, e.g. if 'none' is selected, then use the default node_X
node(env.NODE_1) { }
node(env.NODE_2) { } 

,或者您可以使用选项 string

properties([
    parameters([
       string(defaultValue: "node_1, node_2", description: "", name: "NODE", trim: false)
    ])
])
// parse here the param env.NODE