Jenkins脚本流水线Input步骤引用If内变量作为参数默认值报错如何解决
问题原因分析
你的代码存在3个核心问题,直接导致了报错和功能不生效:
- 执行顺序完全颠倒:你先调用了
userInputs()函数,之后才在if判断中给name、age变量赋值。userInputs内部构造input参数的默认值时,name和age还未被定义,自然就会抛出MissingPropertyException异常。 - 变量作用域不符合预期:你没有在脚本最顶层提前声明
name、age变量,函数内部访问这两个变量时会直接去绑定变量中查找,找不到就直接报错。 - 存在多处语法错误:
- 接收
input返回值赋值给name、age时,字符串插值缺少$符号,写为"{chosenInputs['username']}"是错误的,正确写法是"${chosenInputs['username']}" - 第二个
if块中的name=${name}属于无效语法,赋值操作不需要加${},这行本身也属于冗余代码,可以直接删掉
- 接收
修复方案
按照如下逻辑调整代码即可实现你的需求:
- 先在脚本最顶层声明
name、age变量,保证全局作用域可访问 - 先执行
if (a > b)的判断,给name、age赋默认值,再调用userInputs()函数 - 修正所有语法错误,删除冗余代码
修复后完整代码
def a = 9 def b = 6 def c = 7 def d = 5 // 顶层提前声明全局变量 def name = "" def age = "" def chosenInputs = null def userInputs(){ timeout(time:10, unit:'MINUTES'){ chosenInputs = input( id:'Proceed', message: 'choose', parameters:[ [$class: 'StringParameterDefinition', defaultValue:"${name}", description:'Your name', name:'username'], [$class: 'StringParameterDefinition', defaultValue:"${age}", description:'No of Pods', name:'userAge'] ] ) } } node{ // 先判断赋值,给input生成默认值 if (a > b){ name= "Peace" age="4" } // 再调用input,此时name和age已经有值,可作为默认值显示 userInputs() // 修正字符串插值语法 name = "${chosenInputs['username']}" age = "${chosenInputs['userAge']}" println ("User Input:\n" + chosenInputs) timeout(time:10, unit:'MINUTES') { if (d < c){ println("Name: ${name}") println("Age: ${age}") } } }
内容的提问来源于stack exchange,提问作者Omo
相关产品推荐
相关产品推荐

