В чем разница между 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, так как это будет только дополнительные накладные расходы.