YAML解析器yq使用过滤器就地修改文件 出身背景

YAML解析器yq使用过滤器就地修改文件 出身背景,yaml,yq,Yaml,Yq,我准备了一个Kubernetes的清单文件,在GitOps操作中从circleci构建了一个docker映像,将其推送到ECR,同时将circleci的映像标记更改PR发送到GitHub 当时,我还试图在circleci作业中编辑清单文件 问题,未知点 我尝试使用yq命令更改yaml文件 yq -y -i '.images |= map(select(.name=="XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/backend-admin"

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

当时,我还试图在circleci作业中编辑清单文件

问题,未知点 我尝试使用yq命令更改yaml文件

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
但是错误发生了

jq: error: a99cce09747507feb74799e1e1c9459aba43d4a6/0 is not defined at <top-level>, line 1:
.images |= map(select(.name=="XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/backend-admin").newTag |= a99cce09747507feb74799e1e1c9459aba43d4a6)
我认为原因是它包括了 我看了很多文章,但都没有找到解决办法


我想知道是否有人知道一些事情

变量没有在单引号内展开。请出去

'$CIRCLE_SHA1' 

to

"'$CIRCLE_SHA1'"


生成的过滤器是正确的,但是RHS上的update操作符|=采用字符串类型或适当的对象类型。您拥有的内容不会被解释为文字字符串。在引号周围加上标记

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

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

你可以像我在回答中所展示的那样,将args传递给yq like-arg tag${CIRCLE_SHA1}。请通过编辑对你的答案进行一些解释,以便其他人可以从中学习,这更容易看到。非常感谢。
yq -y --arg tag "${CIRCLE_SHA1}" '.images |= map(select(.name=="XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/backend").newTag |= $tag )'