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

Jenkins流水线中如何在后续阶段调用前序定义的文本参数?

Jenkins流水线跨阶段调用文本参数的解决方法

Jenkins流水线中通过parameters块定义的参数是全局可用变量,不需要用stash(stash仅用于存储文件),直接通过params.参数名即可在任意阶段调用。针对你的场景,以下是具体的正确调用方式:

1. 先修正参数定义的小问题

你的参数定义里defaultValue: NA会被Groovy识别为变量,应该改为字符串形式:

parameters {
    text(name: 'docker_images', defaultValue: 'NA', description: 'Enter the list of images')
}

2. 在Groovy代码中直接引用

在流水线的Groovy逻辑(比如script块、echo步骤)中,直接用params.docker_images获取参数值:

stage('docker_image_movement') {
    steps {
        container('tools') {
            echo "当前传入的镜像列表:${params.docker_images}"
            // 其他Groovy代码
        }
    }
}

3. 在Shell脚本中正确引用

你的原Shell代码存在两个问题:单引号包裹的脚本不会解析变量,且for docker_image in 'echo $docker_images'的写法逻辑错误。以下是两种正确的实现方式:

方式一:用双引号传递参数给Shell

通过双引号包裹Shell脚本,让Groovy先替换params.docker_images的值,再传递给Shell执行:

stage('docker_image_movement') {
    steps {
        container('tools') {
            script {
                sh """
                    # 处理空格分隔的镜像列表
                    for docker_image in \$(echo "${params.docker_images}")
                    do
                        echo "正在处理镜像:\$docker_image"
                        # 这里写你的Docker命令,比如:
                        # docker pull \$docker_image
                        # docker tag \$docker_image new-registry/\$docker_image
                    done
                """
            }
        }
    }
}

注意:Shell中的变量前要加\转义,避免被Groovy提前解析。

方式二:用withEnv传递环境变量(推荐复杂场景)

将Groovy参数转为Shell环境变量,避免引号转义的麻烦,尤其适合参数包含换行、空格的情况:

stage('docker_image_movement') {
    steps {
        container('tools') {
            script {
                sh '''
                    # 处理每行一个镜像的多行文本参数
                    echo "$DOCKER_IMAGES" | while read -r docker_image
                    do
                        # 跳过空行
                        if [ -n "$docker_image" ]; then
                            echo "正在处理镜像:$docker_image"
                            # Docker命令
                        fi
                    done
                '''.withEnv(["DOCKER_IMAGES=${params.docker_images}"])
            }
        }
    }
}

关键总结

  • Jenkins流水线的params对象是全局可见的,任意阶段都能直接调用params.参数名
  • stash仅用于在阶段间传递文件,不适合字符串参数
  • Shell脚本中引用Groovy变量时,注意单/双引号的区别:双引号会让Groovy解析变量,单引号则保留原字符串

内容的提问来源于stack exchange,提问作者Khushi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:17:37