我正在尝试使用awscli在Amazon ECR上重新停靠docker镜像,但是当我将json字符串传递到sh
步骤时,我收到错误Invalid JSON syntax
。当我记录json字符串时,键周围的双引号和值不存在。我假设groovy's string interpolation规则正在剥离报价?下面的代码镜像了awscli文档,并使用sh
步骤包装每个命令。
script {
MANIFEST = sh(
returnStdout: true,
script: "aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag=latest --query images[].imageManifest --output text"
).trim()
sh """ aws ecr put-image --repository-name amazonlinux --image-tag 2017.03 --image-manifest \\"$MANIFEST\\" """
}
错误返回
[test] Running shell script
+ aws ecr put-image --repository-name amazonlinux --image-tag 2017.03 --image-manifest "{
An error occurred (InvalidParameterException) when calling the PutImage operation: Invalid parameter at 'ImageManifest' failed to satisfy constraint: 'Invalid JSON syntax'
我尝试使用groovy.json.JsonOutput
但没有运气。它打印带有转义引号和新行字符{\n \"schemaVersion\": 2,\n \"mediaType\": ...
import groovy.json.JsonOutput
...
script {
def MANIFEST = sh(
returnStdout: true,
script: "aws ecr batch-get-image --repository-name amazonlinux --image-ids imageTag=latest --query images[].imageManifest --output text"
).trim()
def json = JsonOutput.toJson(MANIFEST)
echo JsonOutput.prettyPrint(json)
sh """ aws ecr put-image --repository-name amazonlinux --image-tag 2017.03 --image-manifest \\"$json\\" """
}
[edit]注意,如果我将最后一行更改为returnStdout
,它会将命令显示为aws ecr put-image --repository-name amazonlinux --image-tag 2017.03 --image-manifest "{\n "schemaVersion": 2,\n "mediaType": ...
,这意味着JsonOutput中的引号正在工作,但是它添加了新行?试图删除新行,看看会发生什么。
答案 0 :(得分:2)
是默认放弃引号。您可以参考此页面,它以非常精细的方式显示字符的转义: https://gist.github.com/Faheetah/e11bd0315c34ed32e681616e41279ef4
答案 1 :(得分:0)
遇到了同样的问题,最终使用shell脚本来处理AWS ECR标记。尝试了引号,转义的各种组合,甚至尝试将batch-get-image查询的返回类型更改为JSON。将其传递到put-image命令后,要么返回Invalid JSON Syntax错误,要么最终在ECR中使用新标记创建重复图像。
这是shell脚本:
#!/usr/bin/env sh
repo=$1
tag=$2
tag_as=$3
MANIFEST=$(aws ecr batch-get-image --repository-name $1 --image-ids imageTag=$2 --query images[].imageManifest --output text)
aws ecr put-image --repository-name $1 --image-tag $3 --image-manifest "$MANIFEST"
在詹金斯:
result = sh(returnStdout: true, script: "./retag.sh ${REPO_NAME} ${TAG} ${TAG_AS}")
答案 2 :(得分:0)
此代码块可以正常工作。
sh '''
$(aws ecr get-login --region your_region)
MY_MANIFEST=$(aws ecr batch-get-image --repository-name repo_name --image-ids imageTag='''+ tag +''' --region your_region --query images[].imageManifest --output text)
aws ecr put-image --repository-name repo_name --image-tag latest --image-manifest "$MY_MANIFEST" --region your_region
'''
aws --version aws-cli / 1.16.9
答案 3 :(得分:0)
以下解决方案有效:
MANIFEST= sh( script:"(aws ecr batch-get-image --repository-name ${ECRNAME} --image-ids imageTag=${IMAGE} --query 'images[0].imageManifest' --output json)",returnStdout: true)
MANIFEST1 = "${MANIFEST}".replace('\\n', '')
sh( script:"aws ecr put-image --repository-name ${ECRNAME} --image-tag ${env.RELEASE_SCOPE}_latest --image-manifest ${MANIFEST1}",returnStdout: true)
注意:我使用过--output json
,然后从json中替换了'\n'
。