我正在阅读有关 Jenkins 管道的最佳实践。 我创建了一个声明性管道,它不执行并行作业,并且我想在同一个从属设备上运行所有内容。
我使用:
agent {
label 'xxx'
}
我的管道的其余部分如下所示:
pipeline {
agent {
label 'xxx'
}
triggers {
pollSCM pipelineParams.polling
}
options {
buildDiscarder(logRotator(numToKeepStr: '3'))
}
stages {
stage('stage1') {
steps {
xxx
}
}
stage('stage2') {
steps {
xxx
}
}
}
post {
always {
cleanWs()
}
failure {
xxx"
}
success {
xxx
}
}
}
现在我阅读了最佳实践 here 。 第 4 点说明了这一点:
- Do: All Material Work Within a Node
Any material work within a pipeline should occur within a node block.
Why? By default, the Jenkinsfile script itself runs on the Jenkins master, using a lightweight executor expected to use very few resources. Any material work, like cloning code from a Git server or compiling a Java application, should leverage Jenkins distributed builds capability and run an agent node.
我怀疑这是用于脚本管道的。
现在我的问题是:
我是否需要创建一个 node
里面 stage
在声明性管道中(这是可能的),或者当我想在另一个特定代理上运行我的阶段时,我是否必须在阶段内使用代理?
我当前的管道已定义 label
这是在 4 个代理上。但我的整个管道始终在一个代理上执行(我想要的),但我怀疑它正在执行 stage1
上slaveX
也许stage2
上slaveY
。为什么这没有发生?
最佳答案
该文档非常具有误导性。
文档建议的是利用分布式构建。通过使用 agent
或 node
block 激活分布式构建。
当您想要几乎只在一个节点上运行管道时,应该使用代理
。节点 block 提供了更大的灵活性,因为它允许您指定应在何处执行粒度任务。
如果您在某个代理上运行管道,并且使用同一代理封装了带有节点的步骤,则除了将新的执行器分配给用节点封装的步骤之外,不会有任何效果。 这样做没有明显的好处。您只会消耗不需要的执行器。
总之,您在使用 agent
时已经在使用分布式构建,这也是文档隐含推荐的内容。
关于jenkins - 我是否必须在声明式 Jenkins 管道中使用节点 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47551193/