【问题标题】:YAML parser yq modifying file in place with filterYAML 解析器 yq 使用过滤器修改文件
【发布时间】:2020-03-06 11:34:48
【问题描述】:

背景

我准备了一个Kubernetes的manifest文件,在GitOps操作中从circleci构建一个docker镜像,推送到ECR,同时将circleci的image tag change的PR发送到GitHub

当时我也尝试在circleci作业中编辑manifest文件

问题,未知点

我尝试使用 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)

我认为原因是它包含在 我看了很多文章,但都没有找到解决办法。

我想知道有没有人知道

【问题讨论】:

    标签: yaml yq


    【解决方案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 )'
    

    【讨论】:

    • 哦,这个比较容易看。谢谢!!
    【解决方案2】:

    变量不在单引号内展开。请到外面去。

    '$CIRCLE_SHA1' 
    
    to
    
    "'$CIRCLE_SHA1'"
    
    

    【讨论】:

    • 您可以将 args 传递给 yq,就像我在答案中显示的 --arg tag "${CIRCLE_SHA1}" 一样
    • 请在您的答案中添加一些解释,以便其他人学习
    猜你喜欢
    • 2014-06-26
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2013-08-31
    • 2011-06-22
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多