Использование groovy для синтаксического анализа объекта JSON в сценариях оболочки для Jenkin - PullRequest
1 голос
/ 07 мая 2020

Скажем, у меня есть JSON как показано ниже:

{"id":"1.0.0-6",
"version":"1.0.0",
"build":6,
"tag":"android-v1.0.0-6",
"commitHash":"5a78c4665xxxxxxxxxxe1b62c682f84",
"dateCreated":"2020-03-02T08:11:29.912Z"}

Я хочу извлечь из него идентификатор версии в файле Jenkins Groovy и передать идентификатор версии в плагин JIRA под названием XRAY, поэтому что он создаст версию сборки как Label в JIRA.

stage('Get App version') {
      steps {
          container('devicefarm') {
               steps {
                   sh "LATEST_VERSION=$(curl ${APP_ARTIFACTORY_URL}/${XRAY_PLATFORM}/builds/latest.json | sed \"s/.*$VERSION_KEY\":\"\\([^\"]*\\).*/'\\1'/\")"
               }
           }
      }
}
environment {
        AWS_DEFAULT_REGION = 'uk-xxx'
        XRAY_ENVIRONMENT = 'e2e'
        VERSION_KEY = 'id'
        XRAY_PLATFORM = 'Android'
        APP_ARTIFACTORY_URL = 'https://artifactory.example.com/mobile'
        LATEST_VERSION = ''
}

У меня два вопроса: будет ли результат команды curl назначен переменной, определенной в том же файле Jenkins под названием «LATEST_VERSION», как ожидалось?

Я, вероятно, смогу проверить это, запустив конвейер на Jenkins, но у меня возникла другая проблема, которая мешает мне сделать это, он жалуется, что «Ожидается идентификатор или блок кода».

error while include sh bash in groovy Jenkins file

При запуске того же самого в файле sh этой проблемы нет, идентификатор версии был получен из JSON, как и ожидалось.

1 Ответ

1 голос
/ 07 мая 2020

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

build_json = sh(label: 'Retrieve Build Info', script: "curl ${APP_ARTIFACTORY_URL}/${XRAY_PLATFORM}/builds/latest.json", returnStdout: true)

Это допустимое выполнение метода оболочки, которое также вернет стандарт и назначит его к переменной. См. Дополнительную информацию в документации .

Затем нам нужно проанализировать полученный JSON и присвоить это возвращаемое значение переменной:

build_map = readJSON(text: build_json)

См. документация для получения дополнительной информации.

Наконец, теперь у нас есть карта, где мы можем получить доступ к значению для ключа latest_version и присвоить его переменной. Мы можем получить доступ с помощью этого синтаксиса:

latest_version = build_map['version']

или этого:

latest_version = build_map.version

Обратите внимание, что, хотя это отвечает на ваш вопрос, вы не можете передавать значения c * environment в *1022* block во время выполнения конвейера (что из вашего вопроса подразумевает, что вы хотите выполнить позже). Итак, вам нужно будет попробовать другой маршрут для этого, и, возможно, потребуется задать дополнительный вопрос по этому поводу.

...