如何在对 Jenkins 的 buildWithParameters 调用中指定多个节点值?

Eli*_*ght 2 webhooks jenkins

我有一个启动buildWithParametersJenkins 作业的 webhook 服务,我希望能够指定正在使用哪些构建服务器。

这在作业配置中非常简单 - 我添加了一个 Node 参数,它可以让我指定哪些节点有效,并且在 Jenkins Web UI 中手动启动作业时,我可以选择我想要的节点:

Jenkins节点参数

我可以使用buildWithParametersJenkins 功能通过curl 开始工作:

curl -vvv 'https://webhook:examplepassword@jenkins.example.com/job/build-sideboard-plugin/buildWithParameters?token=exampletoken&GIT_REPO=example/repo&YUM_REPO=example&BUILDSERVER=sideboard.build.dev.xr'
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何指定多个参数。我期望我能够简单地添加第二个&BUILDSERVER=xxx值并使其工作,但运行以下命令:

curl -vvv 'https://webhook:examplepassword@jenkins.example.com/job/build-sideboard-plugin/buildWithParameters?token=exampletoken&GIT_REPO=example/repo&YUM_REPO=example&BUILDSERVER=sideboard.build.dev.xr&BUILDSERVER=sideboard.rocky8.build.dev.xr'
Run Code Online (Sandbox Code Playgroud)

返回 500 错误。我还尝试提供一个用逗号分隔两个值的单个值,即

curl -vvv 'https://webhook:examplepassword@jenkins.example.com/job/build-sideboard-plugin/buildWithParameters?token=exampletoken&GIT_REPO=example/repo&YUM_REPO=example&BUILDSERVER=sideboard.build.dev.xr,sideboard.rocky8.build.dev.xr'
Run Code Online (Sandbox Code Playgroud)

但 Jenkins 将其解释为单个 Node 值,它与任何节点都不匹配,因为没有名为 的节点sideboard.build.dev.xr,sideboard.rocky8.build.dev.xr。当提交用空格分隔的两个值时,我得到了相同的结果。

有什么方法可以让 Jenkins 在使用该buildWithParameter功能的同时执行此操作吗?我不想重做我们的构建触发结构或切换到 Jenkins Pipeline。考虑到我们的 webhooks 的结构,即使创建 2 个不同的curl命令也会有点痛苦,所以我希望能够提供这两个参数,就像在 Jenkins Web UI 中一样。

Noa*_*mer 5

我认为不可能像您尝试过的那样使用查询参数,因为该插件实际上触发了两个不同的构建。

您可以做的是将提交命令的参数作为 JSON 数据传递,这将模拟选择多个服务器的构建触发器。
一般语法类似于:

curl -u USER:PASSWORD --show-error \
     --data 'json={"parameter":[{"name":"PARAMNAME","value":["node1","node2"]}]}' \
     http://localhost:8080/job/remote/build?token=TOKEN
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

curl -u webhook:examplepassword --show-error \
     --data 'json={"parameter":[{"name":"BUILDSERVER","value":["sideboard.build.dev.xr","sideboard.rocky8.build.dev.xr"]}]}' \
     https://jenkins.example.com/job/build-sideboard-plugin/build?token=exampletoken
Run Code Online (Sandbox Code Playgroud)

当然,您可以将所有其他需要的参数与BUILDSERVERJSON 数据一起传递:

curl -u webhook:examplepassword --show-error \
     --data 'json={"parameter":[{"name":"BUILDSERVER","value":["sideboard.build.dev.xr","sideboard.rocky8.build.dev.xr"]},{"name":"YUM_REPO","value":"example"},{"name":"GIT_REPO","value":"=example/repo"}]}' \
     https://jenkins.example.com/job/build-sideboard-plugin/build?token=exampletoken
Run Code Online (Sandbox Code Playgroud)

此外,最好使用curl命令的标志--data-urlencode而不是标志--data,以避免参数值具有特殊字符时出现编码问题。

有关通过远程访问 API 提交作业的更多信息,请参阅此处