Jenkins Pipeline"节点内部阶段"vs"阶段内部节点"

Rak*_*kib 13 groovy jenkins jenkins-pipeline

由于node步骤和stage步骤都提供了作用域{}语法,因此在groovy代码中定义拓扑的最佳实践是什么?

图表A.

node ("NodeName") {
    stage ("a stage inside node"){
        // do stuff here
    }
}
Run Code Online (Sandbox Code Playgroud)

图表B

stage ("a stage holding a node") {
    node ("NodeName"){
        // do stuff here
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ing 14

这取决于您的实际需求.

只要您可以在单个节点上运行完整的管道,我就会将stages 包装成一个,node以便繁忙的执行程序不会阻塞管道.

只要你使用的parallel一步,那么你真的没有除了有一个选择,stage周围node的分配.

有(至少对我来说)混合没有问题,即在同一节点上执行前2-3个阶段,然后在其中的多个节点上执行一个阶段parallel.


Sam*_*eff 9

随着node { stage { ... } } 每个阶段将共享相同的工作文件夹和所有从前一阶段的文件将在那里为下一阶段。

stage { node { ... } }您需要在每个阶段之间使用stash/unstash文件。如果您有一个大型存储库,尤其是如果您有一个大型依赖项文件夹,例如node_modules,则重复的stash/unstash最终可能会占用大量甚至大部分时间,或者占用您的构建时间。

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

更新:

我在我们的一个构建中测试了交换嵌套的确切效果。在一个节点中有一堆阶段,总构建时间刚好超过一分钟。每个阶段都有一个节点,总构建时间几乎是五分钟。巨大差距。

构建阶段时序示例