Jenkins Pipeline"节点在舞台上#34; vs"节点内的阶段"

时间:2017-01-15 11:09:08

标签: jenkins groovy jenkins-pipeline

由于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
    }
}

2 个答案:

答案 0 :(得分:13)

这取决于您的实际需求。

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

只要您使用parallel步骤,除了stage分配node之外,您还没有其他选择。

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

答案 1 :(得分:2)

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

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

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

更新:

我测试了在我们的其中一个版本上交换嵌套的确切效果。在节点内部有许多阶段,总的构建时间仅超过一分钟。每个阶段都有一个节点,因此总构建时间将近五分钟。很大的不同。

Build stage timing example