Использование yq для обновления файла yaml с помощью artifacthub.аннотации ввода-вывода

#bash #sed #yaml #yq

#bash #sed #yaml #yq

Вопрос:

У меня есть скрипт bash, который обновляет файл yaml helm с помощью artifacthub.аннотации ввода-вывода. Однако мой скрипт использует переменные, которые, я полагаю, требуют, чтобы команда использовала двойные кавычки вместо одинарных кавычек. Кроме того, artifacthub.io возникают проблемы, связанные с разделением артефакта и ввода-вывода. Какую yq команду я могу использовать для обновления changes images аннотации and? Я также пытался использовать sed безрезультатно.

 annotations:
  artifacthub.io/changes: |
    - Fixed linting issues.
  artifacthub.io/images: |
    - name: transmission
      image: ghcr.io/linuxserver/transmission:3.00-r0-ls75
 

Я попробовал что-то вроде приведенного ниже, но безуспешно.

 image=foo
yq e ".annotations."artifacthub.io/images"="${image}"" -i "${chart_file_path}"
 

Комментарии:

1. Поля name и image являются не отдельными записями, а частью многострочной строки — «блочного» литерала в мире YAML. См. — yaml-multiline.info

2. Вы не сможете напрямую управлять этими полями, но сформируете многострочную строку с требуемым значением. Бегите yq e '.. style="double"' yaml , чтобы увидеть сами

Ответ №1:

Чтобы сделать запрос yq максимально читаемым, я стараюсь избегать экранирования двойных кавычек. Используя одинарные кавычки вокруг запроса yq, двойные кавычки не нужно экранировать. Кроме того, одинарные кавычки можно закрывать и снова открывать, чтобы объединить переменную bash с запросом.

Что касается ключей со специальными символами, вам нужно заключить их в двойные кавычки и скобки : .annotations.["artifacthub.io/images"]

Учитывая файл:

 # file.yml
annotations:
  artifacthub.io/changes: |
    - Fixed linting issues.
  artifacthub.io/images: |
    - name: transmission
      image: ghcr.io/linuxserver/transmission:3.00-r0-ls75
 

Выполнение этого скрипта:

 image="foo"
yq eval '.annotations.["artifacthub.io/images"] = "'${image}'"' file.yml
#       |              |                     |    ||        |||
#       |              |                     |    ||        ||└> (a.1) close yq query
#       |              |                     |    ||        |└> (c) end string value
#       |              |                     |    ||        └> (a.2) open yq query (end concatenation)
#       |              |                     |    |└> (a.2) close yq query (start concatenation)
#       |              |                     |    └> (c) start string value
#       |              |                     └> (b) end key w/ special chars
#       |              └> (b) start key w/ special chars
#       └> (a.1) open yq query
 

Генерирует этот вывод:

 annotations:
  artifacthub.io/changes: |
    - Fixed linting issues.
  artifacthub.io/images: |-
    foo
 

Комментарии:

1. Спасибо за публикацию этого. Я протестирую это и посмотрю, как это работает.