Подтвердить что ты не робот

Jenkins Pipeline: исполнительный блок "вход"

После прохождения pipeline и Jenkinsfile документация, я немного запутался в том, как создать конвейер Stage → Production.

Один из способов - использовать шаг input, например

node() {
  stage 'Build to Stage'
  sh '# ...'

  input 'Deploy to Production'
  stage 'Build to Production'
  sh '# ...'
}

Это кажется немного неуклюжим, так как это будет блокировать исполнителя все время, пока вы не захотите развернуть его на производство. Есть ли альтернативный способ быть способным к развертыванию в производство, от Дженкинса.

4b9b3361

Ответ 1

EDIT (октябрь 2016 г.): см. мой другой ответ "Использовать веху и блокировку" ниже, в котором представлены недавно введенные функции.

Использовать timeout Шаг

В качестве первого варианта вы можете поместить ваш шаг sh в шаг timeout.

node() {
  stage 'Build to Stage' {
    sh '# ...'
  }

  stage 'Promotion' {
    timeout(time: 1, unit: 'HOURS') {
      input 'Deploy to Production?'
    }
  }

  stage 'Deploy to Production' {
    sh '# ...'
  }
}

Это останавливает сборку после таймаута.

Переместить input "Шаг к мухи"

Другой вариант - не назначать супертяжелого исполнителя для шага input. Вы можете сделать это, используя шаг input вне блока node, например:

stage 'Build to Stage' {
  node {
      sh "echo building"
      stash 'complete-workspace'
  }
}

stage 'Promotion' {
  input 'Deploy to Production?'
}

stage 'Deploy to Production' {
  node {
    unstash 'complete-workspace'
    sh "echo deploying"
  }
}

Этот был, вероятно, более элегантным, но все же можно сочетать с шагом timeout.

EDIT: как указано в @amuniz, вы должны зачеркнуть/размять содержимое рабочей области, так как разные узлы соответственно каталоги рабочих областей могут быть выделены для двух шагов node.

Ответ 2

Учитывая недавние достижения конвейеров Дженкинса, вероятно, лучший способ был бы следующим (источник: jenkins.io/blog):

Используйте milestone и lock

  • Шаг lock (из блокируемых ресурсов) позволяет заблокировать определенный ресурс, так что только одно выполнение конвейера может войти на этот уровень одновременно (вы не хотите запускать два развертывания одновременно, не так ли?)
  • Шаг milestone (из конвейер-шаг-шаг) прервет любые более старые исполнения конвейера, если более поздняя фиксация уже достигла рубежа (вы не хотите, чтобы более старая фиксация, которая больше зависает в CI, перезаписывает развертывание нового коммита, не так ли?).
stage('Deploy') {
  input "Deploy?"
  milestone()
  lock('Deployment') {
    node {
      echo "Deploying"
    }
  }
}

Этап развертывания не ограничивает concurrency, но требует ввода вручную от пользователя. Несколько сборок могут достичь этого шага, ожидая ввода. Когда пользователь продвигает конкретную сборку, все предыдущие сборки прерываются, чтобы последний код всегда был развернут.

Я рекомендую прочитать всю историю, которая включает в себя дополнительную полезную информацию.

Кредиты идут в @amuniz, который поддерживает эти плагины.

Ответ 3

Вы должны использовать шаг ввода вне любого блока node, поэтому он не содержит никакого исполнителя:

stage 'Build'
node('build-node') {
  sh 'call you build tool'
  stash includes: 'target/my-output-artifact.whatever', name: 'built'
}

input 'Continue to deploy stage?'

stage 'Deploy'
node('deploy-node') {
  unstash 'built'
  sh 'scp target/my-output-artifact.whatever [email protected]:/deploy'
}

И вы можете заблокировать этап развертывания, если хотите, чтобы только один раз развертывал:

lock ('deploy-server') {
  stage 'Deploy'
  node('deploy-node') {
    unstash 'built'
    sh 'scp target/my-output-artifact.whatever [email protected]:/deploy'
  }
}

Обратите внимание, что ключевой частью здесь является шаг stash, так как вы можете перемещать артефакты из одного node в другой (вы можете использовать один и тот же node для обоих действий, но рабочее пространство не предоставляется нетронутым между два вызова node, особенно если какое-то время проходит на input).