詹金斯管道 "node inside stage" 对比 "stage inside node"

Jenkins Pipeline "node inside stage" vs "stage inside node"

由于 node 步骤和 stage 步骤都提供范围 {} 语法,在 groovy 代码中定义其拓扑的最佳实践是什么?

图表 A

node ("NodeName") {
    stage ("a stage inside node"){
        // do stuff here
    }
}

图表 B

stage ("a stage holding a node") {
    node ("NodeName"){
        // do stuff here
    }
}

这个要看你的实际需要了。

只要您可以 运行 单个节点上的完整管道,我会将 stage 包装在 node 中,这样管道就不会被繁忙的执行程序阻塞.

一旦使用 parallel 步骤,除了 stage 左右 node 分配外,您别无选择。

(至少对我而言)混合没有问题,即前 2-3 个阶段在同一节点上执行,然后一个阶段在 parallel 内的多个节点上执行。

node { stage { ... } } 每个阶段将共享同一个工作文件夹,上一阶段的所有文件都将用于下一阶段。

对于 stage { node { ... } },您需要在每个阶段之间 stash/unstash 文件。如果您有一个大型存储库,尤其是如果您有一个大型依赖项文件夹,如 node_modules,则重复的 stash/unstash 可能最终成为重要的,甚至是大多数,或者您的构建时间。

IMO 我通常会从第一个语法开始,首选 node { stage { ... } }。如果您有单独的构建阶段需要时间并且可以从并行性中获益,那么切换到 stage { node { ... } } 可能会更好,只要在并行化中获得的时间不会在存储中丢失。

更新:

我测试了在我们的一个构建中交换嵌套的确切效果。在一个节点内有一堆阶段,总构建时间只有一分钟多一点。每个阶段都有一个节点,总构建时间将近五分钟。大不同。