#shell #gitlab #devops #gitlab-ci #jq
#оболочка #gitlab #devops #gitlab-ci #jq
Вопрос:
У меня есть образец файла json.json. Ниже приведен фрагмент из sample.json —
{
"AddOnModules": {
"Description": "add on modules",
"Type": "Array",
"AllowedValues": [
"a",
"b",
"c"
],
"value": []
}
}
Я пытаюсь предоставить значение AddOnModules через переменную git ci (параметр-значение) во время выполнения во время выполнения конвейера. Ниже приведен фрагмент конвейера —
stages:
- deploy
# Job to deploy for development
dev-deploy:
variables:
before_script:
- apk add jq
image: python:3.7.4-alpine3.9
script:
- tmp=$(mktemp)
- jq -r --arg add_on_modules "$add_on_modules" '.AddOnModules.value |= . [$add_on_modules] ' sample.json > "$tmp" amp;amp; mv "$tmp" sample.json
- cat sample.json
stage: deploy
tags:
- docker
- linux
only:
variables:
- $stage =~ /^deploy$/ amp;amp; $deployment_mode =~ /^dev$/
Я даю значение переменной add_on_modules как «a», «b» через git ci во время запуска конвейера. При выполнении cat sample.json наблюдается —
{
"AddOnModules": {
"Description": "add on modules",
"Type": "Array",
"AllowedValues": [
"a",
"b",
"c"
],
"value": [ ""a","b""]
}
}
Дополнительные двойные кавычки добавляются и добавляются, в то время как существующие экранируются.
Я хочу вывести что-то вроде —
{
"AddOnModules": {
"Description": "add on modules",
"Type": "Array",
"AllowedValues": [
"a",
"b",
"c"
],
"value": ["a","b"]
}
}
Похоже, я что-то упускаю в jq —
- jq -r --arg add_on_modules "$add_on_modules" '.AddOnModules.value |= . [$add_on_modules] ' sample.json > "$tmp" amp;amp; mv "$tmp" sample.json
Пытался использовать флаг -r/ —raw-output с помощью jq, но безуспешно. Любые предложения о том, как это решить?
Вот как я запускаю конвейер —
Комментарии:
1. Попробовал ваш фрагмент через bash, выглядит хорошо для меня. Установка add_on_module=a,b дает правильный ответ. Итак, вы уверены, что ваш CI действительно настраивает переменную?
2. Я имею в виду, я не настраиваю add_on_module=»a»,»b» внутри задания. Я прохожу через комбинацию параметров и значений при запуске конвейера во время выполнения. Я отредактировал сообщение и прикрепил изображение. Пожалуйста, обратитесь.
Ответ №1:
Если $add_on_modules равен ["a","b"]
Если вы можете установить add_on_modules для текстового представления массива JSON, тогда вы бы использовали --argjson
, например:
add_on_modules='["a","b"]'
jq -r --argjson add_on_modules "$add_on_modules" '
.AddOnModules.value = $add_on_modules
' sample.json
Если $add_on_modules является строкой "a","b"
add_on_modules='"a","b"'
jq -r --arg add_on_modules "$add_on_modules" '
.AddOnModules.value = ($add_on_modules|split(",")|map(fromjson))
' sample.json
Комментарии:
1. Я не настраиваю add_on_modules внутри задания. Я прохожу через комбинацию параметров и значений при запуске конвейера во время выполнения. Я отредактировал сообщение и прикрепил изображение. Пожалуйста, обратитесь к этому. Даже если я передаю [«a»,»b»] во время запуска конвейера, он просто выдает ошибку array, а строка не может быть добавлена с тех пор. AddOnModules.value имеет значение по умолчанию в виде пустого массива ([]) в sample.json