В чем разница между node, этапом и шагом в трубопроводах Дженкинса?
Я пытаюсь понять, как структурировать конвейер Jenkins 2.7 groovy script. Я прочитал руководство по конвейеру, но чувствую, что он может расшириться по этим темам.
Я могу понять, что в конвейере может быть много stage
, и каждый stage
может иметь много step
s. Но в чем разница между step();
и вызовом метода внутри a stage
, скажем sh([script: "echo hello"]);
. Должно ли node
находиться внутри или вне stage
s? Если общие свойства задания находятся внутри или снаружи node
?
Вот моя текущая структура на мастеру ubuntu node:
#!/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/*");
}
Ответы
Ответ 1
Понятия node
, stage
и step
различны:
-
node
указывает, где что-то произойдет. Вы даете имя или ярлык, а Дженкинс запускает там блок.
-
stage
структурирует ваш script в последовательности высокого уровня. Этапы отображаются в виде столбцов в представлении "Сценарий трубопровода" со средними этапами и цветами для результата этапа.
-
step
- это один из способов указать, что произойдет. sh
имеет аналогичное качество, это другой вид действия. (Вы можете также использовать build
для вещей, которые уже указаны как проекты.)
So step
может находиться внутри node
s (если они этого не делают, они выполняются на главном компьютере), а node
и step
могут быть структурированы в общую последовательность с stage
s.
Ответ 2
Это зависит. Любая декларация node
выделяет исполнителя (на главном или подчиненном устройстве Jenkins). Для этого требуется stash
и unstash
рабочее пространство, поскольку другой исполнитель не имеет доступных доступных источников.
Несколько шагов DSL Pipeline запускаются в мультяшном исполнителе и, следовательно, не требуют внутри блока node
.
Это может быть полезно для примера, например следующего: где вам нужно распределять несколько узлов:
stage("Checkout") {
checkout scm
}
stage("Build") {
node('linux') {
sh "make"
}
node('windows') {
bat "whatever"
}
}
stage("Upload") {
...
Другим (возможно, более реалистичным примером) было бы выделение нескольких узлов в parallel
. Тогда нет необходимости разрешать вызов stage
в другом выделенном исполнителе (также в node
).
Ваш пример выглядит хорошо для меня. Нет необходимости выделять несколько node
в пределах одного stage
s, так как это будет только дополнительные накладные расходы.