Jenkins流水线跨阶段传值时choice参数选项为空问题排查
问题根因
Jenkins声明式流水线中,直接定义在stage顶层的input配置块属于静态解析范畴:流水线启动时就会提前解析所有stage的结构、渲染input参数的默认配置,这个解析动作发生在所有stage的业务逻辑执行之前。
你定义的projectsString初始值是空字符串,这个初始值会在流水线启动解析debug2阶段的input配置时,直接被读取作为choice参数的选项列表。后续debug阶段修改变量值的逻辑是运行时才执行的,此时input的参数配置早就渲染完成,不会再同步更新变量的最新值,所以最终选项列表为空。
另外你代码里的选项分隔符写法有误:当前拼接的是\\n(反斜杠字符加字母n),而choice参数需要用\n(换行符)分隔不同选项,就算变量能正常传值,所有选项也会挤在同一行无法正常识别。
修复方案
不要使用stage顶层的静态input块,把input逻辑移到stage的steps -> script块内,用方法调用的形式执行input步骤。这时候input会在代码运行到对应位置时才渲染参数,能正确读取前序阶段赋值完成的projectsString变量。
修正后的可运行代码如下:
def projectsString = '' pipeline { agent any stages { stage('debug') { when { branch 'master' } steps { script { def files = findFiles() files.each { f -> if (f.directory) { // 修正换行符写法,用\n作为选项分隔符 projectsString = projectsString + f.name + "\n" echo projectsString } } } } } stage('debug2') { when { branch 'master' } steps { script { // 运行时执行input,此时projectsString已完成赋值 def selectedValue = input( message: "Choose", ok: "Submit", parameters: [ choice( name: 'CHOICES', choices: projectsString, description: 'Please Select One' ) ] ) echo "Selected choice is : ${selectedValue}" } } } } }
额外注意:如果工作目录下不存在子文件夹,projectsString会是空值,直接传给choice参数会触发参数校验错误,建议在执行input前加一层判断,比如无匹配目录时提前终止构建或者追加默认选项。
内容的提问来源于stack exchange,提问作者MrRobot9
相关产品推荐
相关产品推荐

