由于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
}
}
答案 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 { ... } }
可能会更好,只要在并行化中获得的时间不会浪费。
更新:
我测试了在我们的其中一个版本上交换嵌套的确切效果。在节点内部有许多阶段,总的构建时间仅超过一分钟。每个阶段都有一个节点,因此总构建时间将近五分钟。很大的不同。