Jenkins流水线循环执行ECR镜像扫描命令时变量未解析问题
问题解决:Jenkins流水线ECR镜像扫描时无法读取镜像摘要值
问题原因
你用Groovy的三重单引号(''')包裹sh命令时,Groovy不会解析字符串内的变量${x},导致shell执行时${x}被当作未定义变量展开为空值,进而触发ECR的参数验证错误。
解决方法
方法1:使用双引号包裹sh命令(推荐)
将外层的三重单引号换成双引号,让Groovy解析变量${x},同时注意参数值的引号处理:
arr.each{x -> sh "aws ecr start-image-scan --repository-name databricks --image-id imageDigest='${x}' --region us-east-1" }
或者转义双引号避免冲突:
arr.each{x -> sh "aws ecr start-image-scan --repository-name databricks --image-id imageDigest=\"${x}\" --region us-east-1" }
方法2:通过环境变量传递值
如果需要保留三重单引号,可借助withEnv将变量注入shell环境,再在shell中读取环境变量:
arr.each{x -> withEnv(["IMAGE_DIGEST=${x}"]) { sh '''aws ecr start-image-scan --repository-name databricks --image-id imageDigest="$IMAGE_DIGEST" --region us-east-1''' } }
验证效果
修改后,sh命令会正确替换镜像摘要值,执行的命令会变成符合ECR格式要求的内容:
aws ecr start-image-scan --repository-name databricks --image-id imageDigest=sha256:xxxxxx --region us-east-1
不会再触发InvalidParameterException错误。
内容的提问来源于stack exchange,提问作者nikita jha
相关产品推荐
相关产品推荐

