Jenkins声明性管道:如何从输入步骤读取选项?

Jenkins声明性管道:如何从输入步骤读取选项?,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,我试图使用声明性管道语法从输入步骤访问变量,但似乎无法通过env或params访问变量。 这是我的阶段定义: stage('User Input') { steps { input message: 'User input required', ok: 'Release!', parameters: [choice(name: 'RELEASE_SCOPE', choices: 'patch\nminor\nmajor', description:

我试图使用声明性管道语法从
输入
步骤访问变量,但似乎无法通过
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)

访问此选项参数的正确方法是什么?

由于您使用的是声明性管道,我们需要做一些技巧。通常您保存输入阶段的返回值,如下所示

def returnValue = input message: 'Need some input', parameters: [string(defaultValue: '', description: '', name: 'Give me a value')]
但是,这在声明性管道步骤中是不允许的。相反,您需要做的是将
输入
步骤包装在
脚本
步骤中,然后将该值传播到适当的位置(
env
似乎工作正常,但要注意,变量会暴露在管道的其余部分)

请注意,如果在输入步骤中有多个参数,则输入将返回一个映射,并且需要使用映射引用来获取所需的条目。从Jenkins中的代码段生成器:

如果只列出一个参数,其值将成为输入步骤的值。如果列出了多个参数,则返回值将是由参数名称键入的映射。如果未请求参数,则该步骤在批准后不返回任何内容


@大卫帕克,我知道你在问什么了。试着在代码中使用它。我有输入参数,并逐个使用它们。我只打印工作中的“变量”键。你也可以这样试试

        steps{
                    script {
                        deploymentParams.findAll{ key, value -> key.startsWith('backendIP') }.each  { entry ->
                            stage("Node_$entry.key "){ 
                echo $entry.value
            }
            }
        }
        } 

我试着像你说的那样添加id,但是在尝试读取map变量时,我得到了相同的错误:
groovy.lang.MissingPropertyException:没有这样的属性:在groovy.lang.Binding.getVariable(Binding.java:63)处的类:groovy.lang.Binding的用户输入。
My bad,没有意识到我们正在使用声明性管道。现在更新了我的答案。当通过SCM更改触发时,如何使其采用默认值(如firs值)?我有一个类似的要求,但在这种情况下,我希望用户能够灵活地将输入更新为自由文本(例如:文件的unix路径)。请让我知道如何才能做到这一点。我不确定我是否应该把它作为一个新问题来问,因为我的要求几乎是一样的。我意识到这个问题现在已经很老了,但在所有关于“如何在Jenkins声明性管道中使输入工作”的搜索中,这是唯一一个有答案的页面。。甚至文档()都是错误的。问题是我想访问多个参数,但我不知道如何访问。如果我将CHOICE1和CHOICE2返回到env.RELEASE_范围中,那么我如何实际获得RELEASE_范围.CHOICE1和RELEASE_范围.CHOICE2的值,而不必编写代码解析RELEASE_范围中的json字符串{“CHOICE1”:“x”,“CHOICE2”:“y”}?
        steps{
                    script {
                        deploymentParams.findAll{ key, value -> key.startsWith('backendIP') }.each  { entry ->
                            stage("Node_$entry.key "){ 
                echo $entry.value
            }
            }
        }
        }