Jenkins构建中动态定义的Choice参数跨Stage调用问题
解决Jenkins流水线中动态生成参数跨Stage访问问题
你的问题核心是**provider变量是Choose provider阶段script块内的局部变量**,其他Stage无法访问。要在不使用环境变量或文件的前提下解决,只需把变量提升到流水线的全局作用域,同时修正变量引用的语法问题(单引号不会解析Groovy变量)。
具体修改步骤:
- 在流水线代码最外层定义一个全局变量,用来存储用户选择的provider值
- 在
input步骤后,将用户选择的结果赋值给这个全局变量(注意input返回的是包含参数名的Map,这里参数名是Provider,所以取inputResult.Provider) - 后续Stage中直接使用这个全局变量,同时把需要解析变量的字符串从单引号改为双引号(Groovy中双引号才会解析变量)
修改后的完整Jenkinsfile:
// gets list of currently supported cloud providers from available folders def findProviders(path){ def dirs = [] //get files from root dir, and loop over them to find relevant dirs new File(path).listFiles().each { file -> if (file.isDirectory()) { dirs.add(file.getName()) } } return dirs } // 定义全局变量存储选中的provider def selectedProvider pipeline { // agents to run on agent any stages { // checkout code from github stage('Checkout Code') { steps { git branch: 'master', url: 'https://github.com/castleking1810/infra-configuration.git' } } // find currently supported cloud providers stage('Choose provider') { steps { script { // execute findProviders on build workspace def providers = findProviders(pwd()) // prompt user for cloud deployment target, using the providers list generated def inputResult = input( id: 'provider', message: 'Choose a cloud provider to deploy its managed k8s service:', parameters: [choice(choices: providers, name: 'Provider')] ) // 将选择结果赋值给全局变量 selectedProvider = inputResult.Provider } } } // 用双引号解析全局变量 stage("plan deployment for ${selectedProvider} managed k8s service") { steps { // 同样用双引号引用全局变量 dir("${selectedProvider}") { sh 'terraform init -upgrade' sh 'terraform plan' input id: 'Approve_tf_plan', message: 'do you approve the above plan?', ok: 'approve' } } } stage("Deploy ${selectedProvider} managed k8s service"){ steps{ dir("${selectedProvider}"){ sh 'terraform apply -auto-approve' } } } stage('clean workspace'){ steps{ cleanWs cleanWhenFailure: false, notFailBuild: true } } } }
关键说明:
- 全局变量
selectedProvider在流水线外部定义,所有Stage的script块或步骤都能访问 input步骤返回的是一个Map,键是你定义的参数名(这里是Provider),所以需要用inputResult.Provider获取用户选择的值- Groovy中,单引号字符串不会解析变量,所以Stage名称、
dir路径这类需要动态替换的地方必须用双引号
内容的提问来源于stack exchange,提问作者Castleking1810
相关产品推荐
相关产品推荐

