我正在尝试了解如何构建我的Jenkins 2.7管道groovy脚本。我已经阅读了pipeline tutorial,但觉得它可以在这些主题上进一步扩展。
我可以理解,管道可以有很多stage
个,每个stage
可以有很多step
个。但是step();
和stage
内的方法调用之间有什么区别,比如sh([script: "echo hello"]);
。 node
是stage
的内部还是外部?作业的整体属性应该在node
之内还是之外?
这是我在ubuntu主节点上的当前结构:
#!/usr/bin/env groovy
node('master') {
properties([
[$class: 'BuildDiscarderProperty', strategy: [$class: 'LogRotator', numToKeepStr: '10']]
]);
stage 'Checkout'
checkout scm
stage 'Build'
sh([script: "make build"]);
archive("bin/*");
}
答案 0 :(得分:31)
node
,stage
和step
的概念不同:
node
指定其中会发生什么。你给出一个名字或标签,Jenkins在那里运行。
stage
将您的脚本构建为高级序列。阶段在“管道舞台”视图中显示为列,具有平均阶段时间和阶段结果的颜色。
step
是指定将发生什么的一种方法。 sh
具有相似的品质,是一种不同的行为。 (您也可以将build
用于已指定为项目的内容。)
因此step
可以位于node
内,(如果他们不是,他们在主人身上执行),node
和step
可以使用stage
s将结构化为整体序列。
答案 1 :(得分:6)
这取决于。任何node
声明都会分配执行程序(在Jenkins主服务器或从服务器上)。这需要您stash
和unstash
工作区,因为另一个执行程序没有可用的签出源。
Pipeline DSL的几个步骤在flyweight执行程序中运行,因此不需要在node
块内。
这可能对以下示例有帮助,您需要分配多个节点:
stage("Checkout") {
checkout scm
}
stage("Build") {
node('linux') {
sh "make"
}
node('windows') {
bat "whatever"
}
}
stage("Upload") {
...
另一个(可能更现实的例子)是在parallel
中分配多个节点。然后,没有必要让stage
调用在另一个已分配的执行程序中执行(也就是在node
内)。
你的榜样对我很好。没有必要在单node
内分配多个stage
,因为这只是额外的开销。