YAML解析器YQ用过滤器修改文件

时间:2020-03-05 13:38:48

标签: yaml yq

背景

我准备Kubernetes的清单文件,在GitOps操作中从circleci构建一个docker映像,将其推送到ECR,同时,将图像标签更改的PR从circleci发送到GitHub

那时,我也尝试在circleci作业中编辑清单文件

问题,未知点

我尝试使用yq命令更改yaml文件。

.Attach

清单文件

yq -y -i  '.images |= map(select(.name=="XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/backend-admin").newTag |= '$CIRCLE_SHA1')'  k8s/overlays/dev/bases/kustomization.yaml

但发生错误

namespace: production

bases:
  - ../../../bases/admin

patchesStrategicMerge:
  - patch-admin.yaml

images:
  - name: nginx
    newTag: 1.15.2
  - name: XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/backend
    newName: XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/backend
    newTag: backend-tag
  - name: XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/frontend
    newName: XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/frontend
    newTag: latest

我认为原因是直到 我看到了各种文章,但没有一个导致解决方案。

我想知道是否有人知道

2 个答案:

答案 0 :(得分:1)

生成的过滤器是正确的,但是RHS上的更新操作符|=可以使用字符串类型或适当的对象类型。您所拥有的不会被解释为文字字符串。将标签放在引号".."

周围
yq -y '.images |= map(select(.name=="XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/backend").newTag |= "a99cce09747507feb74799e1e1c9459aba43d4a6")'

yq与其前身jq类似,它支持在过滤器中使用要传递的参数字段,因此您可以这样做

yq -y --arg tag "${CIRCLE_SHA1}" '.images |= map(select(.name=="XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/backend").newTag |= $tag )'

答案 1 :(得分:0)

变量不会在单引号内扩展。请出去。

'$CIRCLE_SHA1' 

to

"'$CIRCLE_SHA1'"