Декларативный трубопровод Дженкинса: как читать выбор с шага ввода?

Я пытаюсь получить доступ к переменной с шага input, используя синтаксис декларативных конвейеров, но, похоже, не доступен через env или params. Это мое определение сцены:

stage('User Input') {
    steps {
        input message: 'User input required', ok: 'Release!',
            parameters: [choice(name: 'RELEASE_SCOPE', choices: 'patch\nminor\nmajor', description: 'What is the release scope?')]
        echo "env: ${env.RELEASE_SCOPE}"
        echo "params: ${params.RELEASE_SCOPE}"
    }
}

Оба echo шага печатают null. Я также попытался получить доступ к переменной напрямую, но получил следующую ошибку:

groovy.lang.MissingPropertyException: No such property: RELEASE_SCOPE for class: groovy.lang.Binding
    at groovy.lang.Binding.getVariable(Binding.java:63)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:224)

Каков правильный способ доступа к этому параметру выбора?

Ответ 1

Поскольку вы используете декларативные конвейеры, нам нужно будет сделать некоторые трюки. Обычно вы сохраняете возвращаемое значение со стадии ввода, например,

def returnValue = input message: 'Need some input', parameters: [string(defaultValue: '', description: '', name: 'Give me a value')]

Однако это не допускается непосредственно в декларативных шагах конвейера. Вместо этого нужно сделать шаг input на шаге script, а затем распространить значение в подходящее место (env, похоже, работает хорошо, остерегайтесь того, что переменная подвергается остальной части конвейера, хотя).

pipeline {
    agent any
    stages {
        stage("foo") {
            steps {
                script {
                    env.RELEASE_SCOPE = input message: 'User input required', ok: 'Release!',
                            parameters: [choice(name: 'RELEASE_SCOPE', choices: 'patch\nminor\nmajor', description: 'What is the release scope?')]
                }
                echo "${env.RELEASE_SCOPE}"
            }
        }
    }
}

Обратите внимание, что если на шаге ввода есть несколько параметров, вход будет возвращать карту, и вам нужно использовать ссылки на карту, чтобы получить нужную запись. Из генератора фрагментов в Дженкинсе:

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

Ответ 2

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

Итак, вкратце из приведенного выше примера, я сейчас использую что-то вроде этого:

def foo_inputs = null
pipeline {
    agent any
    stages {
        stage("foo") {
            steps {
                script {
                    foo_inputs = input message: 'User input required', ok: 'Release!',
                            parameters: [choice(name: 'RELEASE_SCOPE', choices: 'patch\nminor\nmajor', description: 'What is the release scope?')]
                }
                println foo_inputs.getClass()
                println foo_inputs

                env.RELEASE_SCOPE = foo_inputs.RELEASE_SCOPE

            }
        }
    }
}