Дженкинс: Невозможно определить переменную на стадии трубопровода
Я пытаюсь создать декларативный конвейер Jenkins script, но имеет проблемы с простым объявлением переменной.
Вот мой script:
pipeline {
agent none
stages {
stage("first") {
def foo = "foo" // fails with "WorkflowScript: 5: Expected a step @ line 5, column 13."
sh "echo ${foo}"
}
}
}
Однако я получаю эту ошибку:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 5: Expected a step @ line 5, column 13.
def foo = "foo"
^
Я на Jenkins 2.7.4 и Pipeline 2.4.
Ответы
Ответ 1
Декларативная модель для Jenkins Pipelines имеет ограниченное подмножество синтаксиса, которое она допускает в блоках stage
- см. Руководство по синтаксису для получения дополнительной информации. Вы можете обойти это ограничение, обернув свои шаги в блок script {... }
, но в результате вы потеряете проверку синтаксиса, параметров и т.д. Внутри блока script
.
Ответ 2
Я думаю, что ошибка не идет из указанной строки, а из первых трех строк. Вместо этого попробуйте:
node {
stage("first") {
def foo = "foo"
sh "echo ${foo}"
}
}
Я думаю, что у вас есть лишние строки, которые недействительны...
EDIT
Из декларативной документации модели трубопровода кажется, что вы должны использовать блок объявления environment
для объявления своих переменных, например:
pipeline {
environment {
FOO = "foo"
}
agent none
stages {
stage("first") {
sh "echo ${FOO}"
}
}
}
Ответ 3
Согласитесь с @Pom12, @abayer. Для завершения ответа вам необходимо добавить блок скрипта
Попробуйте что-то вроде этого:
pipeline {
agent any
environment {
ENV_NAME = "${env.BRANCH_NAME}"
}
// ----------------
stages {
stage('Build Container') {
steps {
echo 'Building Container..'
script {
if (ENVIRONMENT_NAME == 'development') {
ENV_NAME = 'Development'
} else if (ENVIRONMENT_NAME == 'release') {
ENV_NAME = 'Production'
}
}
echo 'Building Branch: ' + env.BRANCH_NAME
echo 'Build Number: ' + env.BUILD_NUMBER
echo 'Building Environment: ' + ENV_NAME
echo "Running your service with environemnt ${ENV_NAME} now"
}
}
}
}
Ответ 4
В Jenkins 2.138.3 есть два разных типа конвейеров.
Декларативные и скриптовые конвейеры.
"Декларативные конвейеры - это новое расширение конвейерной DSL (в основном это конвейерный скрипт с одним шагом, конвейерным шагом с аргументами (называемыми директивами), эти директивы должны следовать определенному синтаксису. Смысл этого нового формата в том, является более строгим и, следовательно, должно быть проще для новичков в конвейерах, допускает графическое редактирование и многое другое. Сценарии конвейеров являются запасным вариантом для расширенных требований ".
конвейер Дженкинса: агент против узла?
Вот пример использования среды и глобальных переменных в декларативном конвейере. Из того, что я могу сказать, среда статична после того, как она установлена.
def browser = 'Unknown'
pipeline {
agent any
environment {
//Use Pipeline Utility Steps plugin to read information from pom.xml into env variables
IMAGE = readMavenPom().getArtifactId()
VERSION = readMavenPom().getVersion()
}
stages {
stage('Example') {
steps {
script {
browser = sh(returnStdout: true, script: 'echo Chrome')
}
}
}
stage('SNAPSHOT') {
when {
expression {
return !env.JOB_NAME.equals("PROD") && !env.VERSION.contains("RELEASE")
}
}
steps {
echo "SNAPSHOT"
echo "${browser}"
}
}
stage('RELEASE') {
when {
expression {
return !env.JOB_NAME.equals("TEST") && !env.VERSION.contains("RELEASE")
}
}
steps {
echo "RELEASE"
echo "${browser}"
}
}
}//end of stages
}//end of pipeline