JetBrains Space自动化脚本如何动态拼接Docker推送镜像标签
JetBrains Space 动态拼接 Docker 镜像标签的正确实现
原脚本错误原因
当前tag = "${'$'}versionOne-${'$'}versionTwo"的写法是混淆了DSL变量与Shell脚本的转义逻辑,最终生成的镜像标签会是字面量$versionOne-$versionTwo,完全不会解析流水线参数的实际值。
Space 自动化的 Docker DSL 原生支持Params对象的直接引用,不需要额外做$转义,流水线运行时会自动解析参数的实际值。
修正后的完整脚本
job("Docker | deploy") { docker { build { context = "docker" file = "./docker/Dockerfile" labels["vendor"] = "mycompany" args["HTTP_PROXY"] = "http://10.20.30.1:123" } push("registry.com") { val versionOne = Params("version-one") val versionTwo = Params("version-two") // 直接用Kotlin字符串模板拼接,DSL自动解析参数值 tag = "${versionOne}-${versionTwo}" } } }
常用扩展用法
- 拼接固定环境标识,比如加生产环境前缀:
tag = "prod-${versionOne}-${versionTwo}" - 预处理参数值后再拼接,比如去掉版本号开头的
v:tag = "${versionOne.trimStart('v')}-${versionTwo}" - 给参数设置默认值,避免参数缺失导致流水线失败:
val versionOne = Params("version-one", default = "dev") val versionTwo = Params("version-two", default = "latest")
注意事项
- 直接拼接
Params的写法仅适用于docker {}块内的build、push属性,如果是在普通shell步骤中引用参数,才需要用'$'转义传给Shell脚本解析。 - push方法的入参已经指定了镜像仓库根地址,tag中不需要重复写registry前缀,仅需填写「仓库路径:标签」即可。
内容的提问来源于stack exchange,提问作者andreas.teich
相关产品推荐
相关产品推荐

