Разбор данных с использованием Jenkins Groovy Pipeline Script - PullRequest
0 голосов
/ 18 апреля 2019

Я получаю объект JSON из URL, используя httpRequest в скрипте groovy.

pipeline {
  agent any
  stages {
      stage ('Extract Data') {
          steps {
            script {
              def response = httpRequest \
              authentication: 'user', \
              httpMode: 'GET', \
              url: "https://example.com/data"
              writeFile file: 'output.json', text: response.content

              def data = readFile(file: 'output.json')
              def details = new groovy.json.JsonSlurperClassic().parseText(data)

              echo "Data: ${details.fields.customfield}"                                        

              }
            }
        }
   }
}

Меня интересует строка customfield. Формат строки:

Application!01.01.01 TestSuite1,TestSuite2,TestSuite3,TestSuite4 Product!01.01.01,Product2!01.01.02

Я хотел бы разобрать строку на 3 набора данных:

  1. Карта приложений [Приложение: версия] (всегда будет одна заявка)
  2. Список TestSuites [TestSuite1, ..., TestSuite]
  3. Карта продуктов [Product1: версия, ..., ProductN: версия].

Однако я не уверен, как это сделать. Существуют ли библиотеки Jenkins Groovy, которые я могу использовать для этого в декларативном конвейере?

EDIT Основываясь на ответе ниже, я вижу, что могу сделать карту следующим образом:

def applications = groups[0].split(',').collect { it.split('!') }.collectEntries { [(it):it] }

В моем примере:

application = [Application: Application]

Как мне получить: приложение = [приложение: 01.01.01]

EDIT2 Обратите внимание на следующий вывод:

def applications = groups[0].split(',').collect { it.split('!') }
[[Application, 01.01.01]]

Ответы [ 3 ]

1 голос
/ 18 апреля 2019

Вы можете упростить вашу проблему, используя шаг утилиты конвейера: readJSON

def data = readJSON(file: 'output.json')

echo data.fields.customfield
1 голос
/ 18 апреля 2019

У меня нет библиотек, в которых есть функции для анализа данных, но, поскольку вы знаете формат данных, их легко проанализировать вручную .

На входе есть 3 группы (applications, suites, products), разделенные символом . Чтобы получить группы вам нужно:

def input = "Application!01.01.01 TestSuite1,TestSuite2,TestSuite3,TestSuite4 Product!01.01.01,Product2!01.01.02"
def groups = input.split(' ')

Для обработки приложений вам нужно разделить группу 0 с символом , (на случай, если есть много приложений). Вы получили список пар в формате: name!version. Каждая пара должна быть разделена на !, поэтому вы получите список списков в формате: [[name, version]]. Из последней структуры легко создать карту. Все шаги вместе:

def applications = groups[0].split(',').collect { it.split('!') }.collectEntries { [(it[0]):it[1]] }

Получить список наборов просто, просто разделите группу 1 с , символом:

def suites = groups[1].split(',')

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

def products = groups[2].split(',').collect { it.split('!') }.collectEntries { [(it[0]):it[1]] }
0 голосов
/ 29 апреля 2019

Я нашел метод. Groovy может преобразовать значения массива объектов и преобразовать их в карту с toSpreadMap(). Однако в массиве должно быть четное количество элементов.

def appList = ['DevOpsApplication', '01.01.01']
def appMap = appList.toSpreadMap()

Для некоторых лучших ответов, пожалуйста, обратитесь к это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...