如何使用管道插件在特定节点上触发 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。解决方法如下
- 安装节点和标签参数插件
- 在test_job的配置中,select'This build is parameterized'并添加一个Label参数,并将参数名称设置为'node'
- 在管道脚本中,使用代码:
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 参数来获得可用列表节点)。所以就我而言:
- 安装节点和标签参数插件
- 在test_job的配置中,select'This build is parameterized'并添加一个Node参数,并将参数名称设置为
node_name
- 在 pipeline 中添加 Choice 参数,将其命名为
node
,将可能的选择放在那里,这样 运行ning pipeline 你可以选择它应该在哪个节点上 运行.
要插入管道脚本的代码:
build job: 'my_job',
parameters: [[$class: 'NodeParameterValue', name: 'node_name', labels: ["$node"], nodeEligibility: [$class: 'AllNodeEligibility']]]
这是我如何让它工作的
创建一个 'job' 'test_job' 参数类型 'label' ,名称 'node' ,值可以是任何字符串。 (这是要触发的工作)
.设置'Restrict where this project can be run'为标签值
创建参数类型为 "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}" ]
]
}}}}}
我有一个名为 "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。解决方法如下
- 安装节点和标签参数插件
- 在test_job的配置中,select'This build is parameterized'并添加一个Label参数,并将参数名称设置为'node'
- 在管道脚本中,使用代码:
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 参数来获得可用列表节点)。所以就我而言:
- 安装节点和标签参数插件
- 在test_job的配置中,select'This build is parameterized'并添加一个Node参数,并将参数名称设置为
node_name
- 在 pipeline 中添加 Choice 参数,将其命名为
node
,将可能的选择放在那里,这样 运行ning pipeline 你可以选择它应该在哪个节点上 运行.
要插入管道脚本的代码:
build job: 'my_job',
parameters: [[$class: 'NodeParameterValue', name: 'node_name', labels: ["$node"], nodeEligibility: [$class: 'AllNodeEligibility']]]
这是我如何让它工作的
创建一个 'job' 'test_job' 参数类型 'label' ,名称 'node' ,值可以是任何字符串。 (这是要触发的工作) .设置'Restrict where this project can be run'为标签值
创建参数类型为 "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}" ]
]
}}}}}