2

背景

我准备了一个Kubernetes的manifest文件,在GitOps操作中从circleci构建一个docker镜像,push到ECR,同时将circleci的image tag change的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)

我认为原因是它包含在我看到各种文章中,但没有一个导致解决方案。

我想知道是否有人知道

4

2 回答 2

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 )'
于 2020-03-05T14:10:59.523 回答
0

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

'$CIRCLE_SHA1' 

to

"'$CIRCLE_SHA1'"

于 2020-03-05T14:09:49.307 回答