YAML parser yq, изменяющий файл на месте с фильтром
задний план
Я готовлю файл манифеста Kubernetes, создаю образ докера из circleci в операции GitOps, отправляю его в ECR и в то же время отправляю PR изменения тега изображения из circleci в GitHub
В то время я также пытался отредактировать файл манифеста в задании circleci
Проблемы, неизвестные точки
Я попытался изменить файл 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 ответа
Сгенерированный фильтр правильный, но оператор обновления |=
на 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'"