如何在CodeBuild的buildspec中正确生成appspec.json构建制品
报错原因
- YAML命令拆分问题:buildspec的commands数组默认将每一行
-后的单行内容识别为独立命令,你直接换行书写的JSON内容被拆分为多个单独的cat命令执行,而非作为cat的输入内容处理。 - 结束标记缩进问题:bash语法要求here-document的结束标记
EOF必须顶格书写,不能带有前导缩进,否则bash无法识别结束标记,会抛出找不到EOF的警告。 - 多余转义问题:你使用了
<<'EOF'(EOF包裹单引号)的写法,这种场景下here-document内部的内容会原样输出,不需要额外转义双引号,你额外添加的转义符会导致生成的JSON格式非法,后续CodeDeploy无法正常解析。
正确配置示例
post_build: commands: - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG - | cat <<'EOF' > appspec.json { "version": 0.0, "Resources": [ { "TargetService": { "Type": "AWS::ECS::Service", "Properties": { "TaskDefinition": "arn:aws:ecs:ap-southeast-1:414193698200:task-definition/deploy-wmi:1" } } } ] } EOF
注意:结束标记
EOF必须完全顶格书写,不能有任何前导空格或缩进。
更稳妥的替代方案:用jq生成JSON
如果需要动态传入TaskDefinition等参数,使用jq生成JSON可以完全避免手动书写JSON带来的格式错误,示例配置:
post_build: commands: - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG - | jq -n \ --arg td "arn:aws:ecs:ap-southeast-1:414193698200:task-definition/deploy-wmi:1" \ '{ version: 0.0, Resources: [ { TargetService: { Type: "AWS::ECS::Service", Properties: { TaskDefinition: $td } } } ] }' > appspec.json
内容的提问来源于stack exchange,提问作者nanakondor
相关产品推荐
相关产品推荐

