Зависит от того, используете ли вы сценарий или декларативный конвейер.
Скриптовый конвейер более гибок и позволяет вам, например, создавать этапы на основе определенных условий (каждый этап конвейера может иметь различное количество и вид этапов). В этом типе конвейера вы можете извлечь полную стадию в класс совместно используемой библиотеки и внутри блока node {}
. Рассмотрим следующий пример:
// src/ScriptedFooStage.groovy
class ScriptedFooStage {
private final Script script
ScriptedFooStage(Script script) {
this.script = script
}
// You can pass as many parameters as needed
void execute(String name, boolean param1) {
script.stage(name) {
script.echo "Triggering ${name} stage..."
script.sh "echo 'Execute your desired bash command here'"
if (param1) {
script.sh "echo 'Executing conditional command, because param1 == true'"
}
}
}
}
Тогда Jenkinsfile может выглядеть так:
node {
new ScriptedFooStage(this).execute('Foo', true)
}
Как видите, вся сцена была заключена в методе ScriptedFooStage.execute()
. Его имя также взято из параметра name
- сценарий конвейера позволяет вам делать такие вещи.
Декларативный конвейер , с другой стороны, более строг и самоуверен. Это исправлено, если речь идет о количестве этапов и их именах (вы не можете динамически моделировать, какие этапы присутствуют в каждой сборке и как они называются). Вы по-прежнему можете использовать классы совместно используемой библиотеки, но вы можете выполнять их только внутри блока script {}
внутри блока stage('Name') { steps {} }
. Это означает, что вы не можете извлечь всю стадию в отдельный класс, но только некоторую часть, которая выполняется на уровне шагов. Рассмотрим следующий пример:
// src/DeclarativeFooStage.groovy
class DeclarativeFooStage {
private final Script script
DeclarativeFooStage(Script script) {
this.script = script
}
// You can pass as many parameters as needed
void execute(String name, boolean param1) {
script.echo "Triggering script with name == ${name}"
script.sh "echo 'Execute your desired bash command here'"
if (param1) {
script.sh "echo 'Executing conditional command, because param1 == true'"
}
}
}
И Jenkinsfile может выглядеть так:
// Jenkinsfile
pipeline {
agent any
stages {
stage('Foo') {
steps {
script {
new DeclarativeFooStage(this).execute('something', false)
}
}
}
}
}
Если бы мы попытались выполнить new DeclarativeFooStage(this).execute('something', false)
вне блока script {}
в декларативном конвейере, мы получили бы ошибки компиляции.
Заключение
Выбор между сценарием или декларативным конвейером зависит от конкретного варианта использования. Если вы хотите получить максимальную гибкость при моделировании бизнес-логики конвейера, сценарий конвейера может быть хорошим выбором. Тем не менее, это идет с некоторой ценой. Например, скриптовый конвейер не поддерживает перезапуск сборки конвейера с определенного этапа - это поддерживается только декларативным конвейером. (Представьте, что у вас есть 10 этапов в конвейере, а этап 7 не выполнен из-за какой-то глупой ошибки, и вы хотели бы перезапустить сборку с 7-го этапа - в сценарии с конвейером вам придется перезапускаться с самого начала, тогда как декларативный конвейер может перезапускаться с 7-го этапа, запоминая результаты всех 6 предыдущих этапов).