我可以在声明性Jenkins管道中定义多个代理标签吗?

时间:2017-04-10 10:39:40

标签: jenkins groovy jenkins-pipeline

我正在使用declarative Jenkins pipelines来运行我的一些构建管道,并想知道是否可以定义多个代理标签。

我有许多构建代理连接到我的Jenkins,并且希望这个特定的管道能够由具有不同标签的各种代理构建(但不是由所有代理构建)。

更具体地说,假设我有2个标签为“小”的代理,4个标签为“中”,6个标签为“大”。现在我有一个资源非常低的管道,我希望它只在一个'小'或'中'大小的代理上执行,但不能在大型代理上执行,因为它可能导致更大的构建在队列中等待不必要的长时间。

到目前为止我见过的所有例子都只使用一个标签。 我试过这样的事情:

 agent { label 'small, medium' }

但它失败了。

我正在使用Jenkins管道插件的2.5版本。

5 个答案:

答案 0 :(得分:28)

您可以看到' Pipeline-syntax'在Jenkins安装中提供帮助,并查看示例步骤" node"参考。

您可以使用exprA||exprB

node('small||medium') {
    // some block
}

答案 1 :(得分:16)

这种语法对我有用:

agent { label 'linux && java' }

答案 2 :(得分:14)

  编辑:我误解了这个问题。这个答案只有你知道   您希望为每个阶段运行哪个特定代理。

如果您需要多个代理,您可以声明agent none,然后在每个阶段声明代理。

https://jenkins.io/doc/book/pipeline/jenkinsfile/#using-multiple-agents

来自文档:

pipeline {
    agent none
    stages {
        stage('Build') {
            agent any
            steps {
                checkout scm
                sh 'make'
                stash includes: '**/target/*.jar', name: 'app' 
            }
        }
        stage('Test on Linux') {
            agent { 
                label 'linux'
            }
            steps {
                unstash 'app' 
                sh 'make check'
            }
            post {
                always {
                    junit '**/target/*.xml'
                }
            }
        }
        stage('Test on Windows') {
            agent {
                label 'windows'
            }
            steps {
                unstash 'app'
                bat 'make check' 
            }
            post {
                always {
                    junit '**/target/*.xml'
                }
            }
        }
    }
}

答案 3 :(得分:0)

创建另一个标签调用'small-or-medium',其中包含6个所有代理。然后在Jenkinsfile:

agent { label 'small-or-medium' }

答案 4 :(得分:0)

如 Vadim Kotov 在 Jenkins pipeline documentation 及以上所述,可以在标签定义中使用运算符。

因此,如果您想在具有特定标签的节点上运行作业,则声明方式如下:

agent { label('small || medium') }

来自 jenkins 页面的更多示例:

// AND
agent { label('windows && jdk9 )')  }
 
// more complex one
agent { label('postgres && !vm && (linux || freebsd)')  }