如何让Jenkins流水线在(任何)代理机器上运行,而不是主节点?

13
我的 Jenkins 流水线在主节点和代理节点(从节点)之间随机切换运行。
整个流水线只有一个 `agent` 语句,如下所示:
pipeline {
  agent any
}

如何让构建在负载均衡代理上运行,而不是在主节点上运行?
也许可以通过agent { label 'some-label' }来实现。是否有一个预定义的标签来指定代理而不是主节点?还是我需要自己为所有代理打标签? 这个链接这个链接展示了如何选择一个特定的代理,但我想要在代理机器之间进行随机负载均衡。 这个问题讨论了agent anyagent none,但这两个选项都不能阻止使用主节点。 这个页面建议将所有内容都包装在一个node块中,但这似乎会强制构建在主节点或指定的节点上运行,这样又无法实现代理的负载均衡。

你可以为工作节点添加标签,并在node中使用它们。示例代码如下:node("标签名") { //执行语句 }在此处,“标签名”可以替换为要在特定节点上运行的节点名称。在“配置节点”页面中有一个标签部分,标签之间由空格隔开。 - jos
2个回答

18
你可以使用node('!master') {...}agent { label '!master' }语法。更多细节请参见这里
此外,Jenkins最佳实践页面中还有一种解决方案,用于对主节点本身设置限制。请点击这里查看。
如果您有一个更复杂的安全设置,允许某些用户仅配置作业,而不是管理Jenkins,那么您需要阻止他们在主节点上运行构建,否则他们将无限制地访问JENKINS_HOME目录。您可以通过将执行器计数设置为零来实现此目的。相反,确保所有作业都在代理上运行。这样可以确保Jenkins主节点能够扩展以支持更多的作业,并且还可以保护构建过程不会意外或恶意地修改$JENKINS_HOME中的潜在敏感数据。如果您需要一些作业在主节点上运行(例如Jenkins本身的备份),请使用Job Restrictions Plugin来限制哪些作业可以在那里执行。
更新:正如@Moshisho提到的,在Jenkins 2.307和Jenkins 2.319.1中,内置节点从“master node”更名为“built-in node”。因此,现在应该使用agent { label '!built-in' }。详细信息请参见此处

1
从Jenkins 2.307和Jenkins 2.319.1开始,应该使用agent { label '!built-in' } - Moshisho

2

在Jenkins Web界面中,配置基于标签的自由风格作业时,您可以使用表达式!master进行此操作。也支持布尔运算符||&&

我不确定管道配置是否支持相同的表达式语法,但值得一试。


我该如何在管道中实现它?尝试过 agent { label "include" && "!exclude" }agent { label "include && !exclude"},但它会在“排除”节点上运行。 - Andrey Regentov
1
第二种方法应该按照 https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#node-allocate-node 的说明有效。 - Wim Coenen
谢谢,仔细看了第二遍,它似乎真的可以工作。 - Andrey Regentov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接