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
}
}
}
}