Использование jq в Gitlab CI yaml

#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