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

How to trigger a jenkins build on specific node using pipeline plugin?

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

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

然而,当我 运行 TestPipeline 作业时,"test_job" 不会 运行 在我分配的节点上。但是 运行 在随机节点上。

我想知道是否应该在 "test_job" 上设置 "Restrict where this project can be run"。所以我将它设置为 "tester"("tester" 标签同时包含节点 "tester1" 和 "tester2")。但是,当我再次 运行 管道作业时, "test_job" 运行 在 "tester2" 上两次。我应该期望这份工作首先在 "tester1" 上 运行,然后在 "tester2" 上 运行。 这是为什么?是因为 "node" 一步在构建步骤应该构建在哪个节点上时无关紧要吗?

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

请查看错误 here。解决方法如下

  1. 安装节点和标签参数插件
  2. 在test_job的配置中,select'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']]

作业将按照我的意愿构建。

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

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

  1. 安装节点和标签参数插件
  2. 在test_job的配置中,select'This build is parameterized'并添加一个Node参数,并将参数名称设置为node_name
  3. 在 pipeline 中添加 Choice 参数,将其命名为 node,将可能的选择放在那里,这样 运行ning pipeline 你可以选择它应该在哪个节点上 运行.

要插入管道脚本的代码:

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

这是我如何让它工作的

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

  2. 创建参数类型为 "Node" 的 'pipeline'。在管道部分,使用以下脚本

注意 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}" ]
                ]
}}}}}