我正在使用declarative Jenkins pipelines来运行我的一些构建管道,并想知道是否可以定义多个代理标签。
我有许多构建代理连接到我的Jenkins,并且希望这个特定的管道能够由具有不同标签的各种代理构建(但不是由所有代理构建)。
更具体地说,假设我有2个标签为“小”的代理,4个标签为“中”,6个标签为“大”。现在我有一个资源非常低的管道,我希望它只在一个'小'或'中'大小的代理上执行,但不能在大型代理上执行,因为它可能导致更大的构建在队列中等待不必要的长时间。
到目前为止我见过的所有例子都只使用一个标签。 我试过这样的事情:
agent { label 'small, medium' }
但它失败了。
我正在使用Jenkins管道插件的2.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)') }