[英]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.