YAML解析器yq使用过滤器就地修改文件 出身背景
我准备了一个Kubernetes的清单文件,在GitOps操作中从circleci构建了一个docker映像,将其推送到ECR,同时将circleci的映像标记更改PR发送到GitHub 当时,我还试图在circleci作业中编辑清单文件 问题,未知点 我尝试使用yq命令更改yaml文件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"
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 )'