YAML парсер yq модифицирующий файл на месте с фильтром - PullRequest
2 голосов
/ 05 марта 2020

background

Я готовлю файл манифеста Kubernetes, создаю docker изображение из circleci в операции GitOps, pu sh его в ECR, и в то же время отправляю PR изменения тега изображения из кружка в GitHub

В то время я пытался редактировать файл манифеста и в работе кружка

Проблемы, неизвестные точки

Я пытался изменить файл yaml используя команду yq.

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)

Я думаю, что причина в том, что она включена до тех пор, как я увидел различные статьи, но ни одна из них не привела к решению.

Я хочу знать, если кто-то что-то знает

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Сгенерированный фильтр правильный, но оператор обновления |= в 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 )'
0 голосов
/ 05 марта 2020

Переменные не раскрываются внутри одинарных кавычек. Пожалуйста go снаружи.

'$CIRCLE_SHA1' 

to

"'$CIRCLE_SHA1'"

...