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

And*_*ang 24 jenkins jenkins-pipeline

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

node('tester1') {
    build 'test_job'
}
node('tester2') {
    build 'test_job'
}
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*ang 22

请在这里查看错误.解决方案如下.

  1. 安装Node和Label参数插件
  2. 在test_job的配置中,选择"This build is parameterized"并添加Label参数并将参数名称设置为"node"
  3. 在管道脚本中,使用代码:
build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester1']]
build job: 'test_job', parameters: [[$class: 'LabelParameterValue', name: 'node', label: 'tester2']]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 正如[Jesse Glick](https://issues.jenkins-ci.org/secure/ViewProfile.jspa?name=jglick)所说:节点上的标签选择在其阻塞期间分配的节点.在节点内包装构建毫无意义; 忽略节点上下文,你只是浪费一个执行程序槽.使用LabelParameterValue是所请求问题的适当解决方案. (2认同)

小智 6

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

  1. 安装Node和Label参数插件
  2. 在test_job的配置中,选择"This build is parameterized"并添加Node参数并将参数名称设置为 node_name
  3. 在管道中添加Choice参数,命名它node,放置可能的选择,因此运行管道可以选择应该在哪个节点上运行.

要插入管道脚本的代码:

build job: 'my_job', 
  parameters: [[$class: 'NodeParameterValue', name: 'node_name', labels: ["$node"], nodeEligibility: [$class: 'AllNodeEligibility']]]
Run Code Online (Sandbox Code Playgroud)


can*_*nie 6

这是我如何让它工作的

  1. 创建一个 'job' 'test_job' 参数类型为 'label' ,名称为 'node',值可以是任何字符串。(这是要触发的作业) .Set 'Restrict where this project can be run' 为标签值

  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}" ]
                ]
}}}}}
 
Run Code Online (Sandbox Code Playgroud)