如何使用管道插件触发特定节点上的jenkins构建?

时间:2016-07-07 08:37:23

标签: jenkins jenkins-pipeline

我有一个名为“TestPipeline”的Jenkins管道作业。我想触发2个标记为“tester1”和“tester2”的不同从属的构建。管道脚本在这里非常简单:

node('tester1') {
    build 'test_job'
}
node('tester2') {
    build 'test_job'
}

但是,当我运行TestPipeline作业时,“test_job”将不会在我指定的节点上运行。但是在随机节点上运行。

我想知道我是否应该在“test_job”上设置“限制此项目可以运行的位置”。所以我把它设置为“tester”(“tester”标签包含节点“tester1”和“tester2”)。但是当我再次运行管道作业时,“test_job”在“tester2”上运行两次。我应该期望首先在“tester1”上运行该作业,然后在“tester2”上运行。 这是为什么?是因为“节点”步骤在构建构建步骤的哪个节点上无关紧要?

4 个答案:

答案 0 :(得分:22)

请参阅错误here。解决方案如下。

  1. 安装节点和标签参数插件
  2. 在test_job的配置中,选择“This build is parameterized”并添加Label参数并将参数名称设置为“node”
  3. 在管道脚本中,使用代码:
  4. build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester1']]
    build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester2']]
    

    这项工作将按照我的意愿建造。

    然而,我认为这只是一种解决方法。我仍然相信这是一个错误。因为节点步骤应该完成它的工作,而不是让其他插件为它做。

答案 1 :(得分:6)

我做了同样的事,但是使用Node参数,所以我可以直接使用节点列表运行作业,或者运行管道(在管道中我使用Choice参数来获得可用节点列表)。所以在我的情况下:

  1. 安装节点和标签参数插件
  2. 在test_job的配置中,选择“This build is parameterized”并添加Node参数并将参数名称设置为node_name
  3. 在管道中添加Choice参数,将其命名为node,添加可能的选项,以便运行管道,您可以选择应该在哪个节点上运行。
  4. 要插入管道脚本的代码:

    build job: 'my_job', 
      parameters: [[$class: 'NodeParameterValue', name: 'node_name', labels: ["$node"], nodeEligibility: [$class: 'AllNodeEligibility']]]
    

答案 2 :(得分:1)

这就是我的工作方式

  1. 创建一个'job''test_job',其参数类型为'label',名称为'node',值可以是任何字符串。 (这是要触发的作业) 设置“限制此项目的运行位置”为标签值

  2. 创建参数类型为“节点”的“管道”。在管道部分,使用以下脚本

请注意,test_job的标签为$ {env.NODE_NAME},它将由管道根据用户的选择进行设置

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
              echo 'Building..'
              script {
                build job: 'test_job', parameters: [
                [$class: 'LabelParameterValue', name: 'node', label: "${env.NODE_NAME}" ]
                ]
}}}}}
 

答案 3 :(得分:0)

我刚刚在我的安装上对此进行了测试,并在每个节点上正确运行了每个脚本。 您可能需要检查是否已正确配置了从属设备。我相信文档说他们需要通过Java Web Start设置启动启动从属代理,你可以验证。