как я анализирую следующий формат массива json. я хочу, чтобы это значение имени файла было в bash или groovy?

У вас одновременно включено несколько разных версий в разных местах.

/etc/apt/sources.list.d/stable.list:deb http://ftp.nl.debian.org/debian/ stable main contrib non-free

В этой строке говорится, что вам нужны пакеты из stable, т.е. Buster в наши дни. Эти ярлыки «назначения» всегда указывают на соответствующую версию :oldstable, которая теперь относится к растяжке, а testing— к яблочко.

/etc/apt/sources.list:deb http://ftp.nl.debian.org/debian/ stretch main non-free

Этот явно получает пакеты от stretch, и это не меняется, когда появляется новая версия или когда stretch становится стабильным.

/etc/apt/sources.list.d/mono-official-stable.list:deb https://download.mono-project.com/repo/debian stable-stretch main
/etc/apt/sources.list:deb [arch=amd64] https://download.docker.com/linux/debian stretch stable

Это сторонние -репозитории с пакетами специально для растяжки. Они будут иметь зависимости от основных растянутых пакетов.

Некоторые несоответствия версий могут быть вызваны этим смешением (, в частности, инструкции по обновлению предлагают отключить сторонние -репозитории на время ). Линии stretch -update и stretch -backports должны быть безопасными, но я бы также отключил их для обновлений. Как только вы попадете в ловушку, они больше не будут служить цели.


Как правило, если вы не хотите таких обновлений, вам нужно, чтобы все ваши записи в sources.list были помечены кодовым именем (stretch, buster ), а не меткой ветви (stable ). Таким образом, вы можете выбрать время обновления, изменив ключевое слово везде, где оно появляется, а затем следуя инструкциям по обновлению.

В настоящее время это автоматическое обновление при выпуске новой версии — это именно то, о чем вы просили, в верхнем поле кода из stable.list. Кажется, это и есть основная цель stable.list (и то же самое для закомментированных строк в testing.list ).

Нежелательное смешивание версий является побочным эффектом одновременного включения как Stretch, так и Stable, когда они перестали быть синонимами.

Бастер на самом деле отсутствовал почти месяц,так что с еженедельным циклом обновления на вашей стороне кажется, что ваши зеркала обновлялись немного медленно, иначе это произошло бы несколько недель назад. Это также может быть поводом для беспокойства.


На данный момент вы не сможете откатиться назад, чтобы растянуться, и вам нужно будет полностью двигаться вперед, чтобы разбить. Обновите «stretch» ​​и «stable» до «buster» там, где они появляются, и обратитесь к инструкциям по обновлению . Судя по звукам вещей, вы все еще можете нуждаться в apt full-upgrade, но можете пройти через все остальное.

Я бы посоветовал на время отключить внешние репозитории и настроить их заново в соответствии с их собственными инструкциями для buster, как только остальная часть обновления будет завершена. Возможно, между ними произошли организационные изменения, из-за которых путь обновления не является чистым, и вы также можете удалить установленные из них пакеты и переустановить их после настройки новых репозиториев.

В будущем всегда используйте названия выпусков в своих источниках, и у вас не будет этой проблемы.

0
18.08.2021, 00:13
2 ответа

Поскольку это для Jenkins Pipeline, существует гораздо более простой способ, чем все, что было предложено до сих пор:

def json = readJSON(file: 'myJsonFile.json')
def filenames = json['filewhichisdeploy'].collect { it['filename'] }

filenamesбудет массивом имен файлов.

Обратите внимание, что это относится к конвейеру со сценарием. Если вы используете Declarative, вам нужно будет поместить это в блок script.

0
20.08.2021, 10:26

Для хранения тех из этих значений, которые являются строками (не нулевыми, логическими значениями, числами, массивами, объектами )и не содержат символов NUL (U+0000 )(, которые не может встречаться в имени файла или переменной bash, но в противном случае мы используем его для разграничения записей для readarray -td ''), в массиве bash с помощью jq, вы можете сделать (, предполагая bash 4.4 или выше):

readarray -td '' array < <(
  jq -j '.filewhichisdeploy?[].filename?|
           strings|
           select(index("\u0000")|not)|
          . + "\u0000"' file.json
)
wait "$!" || exit # abort if jq failed

Это сохраняет имена файлов в массиве, как если бы они были текстом и закодированы в кодировке UTF -8. Если вы предпочитаете, чтобы они были текстом в кодировке локали, вы должны передать его наiconv -f UTF-8:

readarray -td '' array < <(
  set -o pipefail
  jq -j '.filewhichisdeploy?[].filename?|
           strings|
           select(index("\u0000")|not)|
          . + "\u0000"' file.json |
    iconv -f UTF-8
)
wait "$!" || exit # abort if jq or iconv failed
1
20.08.2021, 10:26

Теги

Похожие вопросы