You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins构建中动态定义的Choice参数跨Stage调用问题

解决Jenkins流水线中动态生成参数跨Stage访问问题

你的问题核心是**provider变量是Choose provider阶段script块内的局部变量**,其他Stage无法访问。要在不使用环境变量或文件的前提下解决,只需把变量提升到流水线的全局作用域,同时修正变量引用的语法问题(单引号不会解析Groovy变量)。

具体修改步骤:

  1. 在流水线代码最外层定义一个全局变量,用来存储用户选择的provider值
  2. 在input步骤后,将用户选择的结果赋值给这个全局变量(注意input返回的是包含参数名的Map,这里参数名是Provider,所以取inputResult.Provider)
  3. 后续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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 15:32:53