Дженкинс: Невозможно определить переменную на стадии трубопровода

Я пытаюсь создать декларативный конвейер 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