簡體   English   中英

YAML 解析器 yq 使用過濾器修改文件

[英]YAML parser yq modifying file in place with filter

背景

我准備了一個Kubernetes的manifest文件,在GitOps操作中從circleci構建docker鏡像,push到ECR,同時將circleci的image tag變化的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)

我認為原因是它被包含在內,直到我看到了各種文章,但沒有一個導致解決方案。

我想知道有沒有人知道

生成的過濾器是正確的,但 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 )'

變量不在單引號內展開。 請到外面去。

'$CIRCLE_SHA1' 

to

"'$CIRCLE_SHA1'"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM