Jenkins Pipeline "node inside stage" vs "stage inside node"
With node { stage { ... } }
each stage will share the same working folder and all the files from the previous stage will be there for the next stage.
With stage { node { ... } }
you need to stash
/unstash
files between each stage. If you have a large repository, and especially if you have a large folder of dependencies like node_modules
, this repeated stash
/unstash
could end up being a significant, or even majority, or your build time.
IMO I would generally start with the first syntax, node { stage { ... } }
as preferred. If you have individual build stages that take time and can benefit from parallelism, then switching to stage { node { ... } }
might be better, as long as the time gained in parallelization is not lost in stashing.
Update:
I tested the exact effect of swapping nesting on one of our builds. with a bunch of stages inside a node, the total build time is just over one minute. With a node inside each stage, total build time is almost five minutes. Big difference.
This depends on your actual needs.
As long as you can run your complete pipeline on a single node, I would wrap the stage
s in a node
so that the pipeline is not blocked by busy executors.
As soon as you use the parallel
step, then you don't really have a choice besides having stage
around node
allocations.
There are (at least for me) no issues around mixing that, i.e., have the first 2-3 stages executed on the same node and then one stage that executes on multiple nodes within parallel
.