如何在 Jenkins 管道中的两个代理之间进行选择以实现高可用性

How to choose between two agents for high-availability in Jenkins pipeline

我在 Jenkins 中配置了多个代理。

对于我的一个管道作业执行,我希望在我的两个代理之间进行选择,即 MYHOST11-ANSIBLE-SLAVEMYHOST22-ANSIBLE-SLAVE 哪个可用。因此,如果 MYHOST11-ANSIBLE-SLAVE 不可用,我的 Jenkins 管道作业应该切换到使用 MYHOST22-ANSIBLE-SLAVE

能否请您建议我需要对以下管道代码进行哪些更改?

pipeline {
    agent { 
        node {
            label 'MYHOST11-ANSIBLE-SLAVE' 
        }
    }
    stages {
        stage('Precheck') {
            steps {
                sh "echo Im from Jenkins>/tmp/jenkinsmoht.txt"

注意:我希望我的管道仅在我提到的两个代理之间进行选择,因为只有它们对我的管道调用具有安全性。 其他代理没有 ansible,因此我的管道会失败。

我认为您的命名策略有点偏斜...

假设您有两个节点,名为“HOST11”和“HOST22”。这两个安装了ansible。其他节点(例如“HOST33”)没有。这些是节点的名称,反映了代理 运行 所在的主机。

您想根据节点的特性使用 "labels" 配置您的节点 (/computer/<NodeName>/configure),在本例中为 "ansible",从而创建一个 “节点池” 类似配置。

然后使用特征标签 ("ansible") 将作业分配给具有相应标签(和特征)的服务器池。通过 assigning labels to nodes,您可以指定要用于特定作业的资源,并为您的作业设置优雅排队。

例如:

agent { 
    node {
        label 'ansible' 
    }

Jenkins 然后将选择具有匹配标签的第一个可用节点并 运行 那里,除非该节点不可用。然后它将尝试下一个。如果 none 可用,作业将保持排队状态。

如果您选择使用主机名(实际上它也只是一个“标签”),那么您只能在那个节点上 运行。

另一个区别:Jenkins中的“Available Node”表示在线。如果所有执行者都忙,它仍然是“可用的”。 Jenkins 作业是“粘性”的,它会等到它之前 运行 所在的节点有可用的执行程序。这也可能导致第一个节点过载。如果这是一个问题,请安装 "Least Load" plugin,它将使用各种标准充当负载平衡器。

查看此 post 进一步 constrain jobs using multiple labels

ps:如果您的节点相似但不相同,您可以使用“节点属性”或 "Slave Setup" 插件使它们透明地兼容您的工作(例如:设置 VAR不同 values/paths).