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

axkjgtzd  于 2022-11-01  发布在  Jenkins
关注(0)|答案(5)|浏览(177)

我正在使用声明式Jenkins管道来运行我的一些构建管道,并且想知道是否可以定义多个代理标签。
我有一些构建代理连接到我的Jenkins,并希望这个特定的管道能够由具有不同标签的各种代理构建(但不是由所有代理)。
更具体地说,假设我有2个标签为“small”的代理,4个标签为“medium”的代理,6个标签为“large”的代理。现在我有一个资源非常少的管道,我希望它只在“small”或“medium”大小的代理上执行,而不是在大型代理上执行,因为这可能会导致更大的构建在队列中等待不必要的长时间。
到目前为止,我看到的所有例子都只使用了一个标签。

agent { label 'small, medium' }

但它失败了。
我使用的是Jenkins管道插件的2.5版本。

kiz8lqtg

kiz8lqtg1#

您可以在Jenkins安装中查看“Pipeline-syntax”帮助,并查看示例步骤“node”参考。
您可以使用exprA||exprB

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

w80xi6nr2#

编辑:我误解了这个问题。这个答案是只有当你知道你想在每个阶段运行哪个特定的代理。
如果您需要多个代理,您可以声明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'
                }
            }
        }
    }
}
wfsdck30

wfsdck303#

下面的语法似乎对我有用:

agent { label 'linux && java' }
quhf5bfb

quhf5bfb4#

如Jenkins管道文档和Vadim Kotov所述,可以在标签定义中使用运算符。
因此,在您的情况下,如果您希望在具有特定标签的节点上运行作业,声明方式如下所示:

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

下面是Jenkins页面中使用不同运算符的一些示例

// with AND operator
agent { label('windows && jdk9 )')  }

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

备注

在构建这些定义时,只需要考虑以下规则/限制:

  • 所有运算符都是左关联的
  • 如果标签或代理名称包含与运算符语法冲突的字符,则可以用引号将其括起来
  • 表达式可以不带空格编写
  • Jenkins在计算表达式时将忽略空格
  • 不支持使用通配符或正则表达式匹配标签或代理名称
  • 空表达式的计算结果始终为true,与所有代理匹配
p8ekf7hl

p8ekf7hl5#

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

agent { label 'small-or-medium' }

相关问题