简体   繁体   中英

Parse Data Using Jenkins Groovy Pipeline Script

I am retrieving JSON object from a URL using httpRequest in a groovy script.

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}"                                        

              }
            }
        }
   }
}

I am interested in the customfield string. The format of the string is:

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

I would like to parse the string into 3 data sets:

  1. Map of Applications [Application: version] (there will always be one Appliction)
  2. List of TestSuites [TestSuite1,...,TestSuite]
  3. Map of Prodcts [Product1: version,..., ProductN: version].

However, I am not sure how to do this. Are there any Jenkins Groovy libraries that I can use to do this in a declarative pipeline?

EDIT Based on the answer below I can see that I can make a map in the following way:

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

In the example I have:

application = [Application: Application]

How do I get: application = [Application: 01.01.01]

EDIT2 Note the following output:

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

There're no libraries I'm aware of that will have functionality to parse the data but, since you know the format of the data it's easy to parse them manually .

There are 3 groups in the input ( applications , suites , products ) separated by a character. To get the groups you need:

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

To process the applications you need to split group 0 with , character (just in case there are many applications). You got a list of pairs in format: name!version . Every pair must be splitted with ! , so you get a list of lists in format: [[name, version]] . From the last structure it's easy to create a map. All steps together:

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

Getting the list of suites is easy, just split group 1 with , character:

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

Finally, products are analogical to the list of applications but this time group 2 should be used:

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

You can simplifier your issue by using pipeline utility step: readJSON

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

echo data.fields.customfield

I found a method. Groovy can convert the values of an Object array and convert them into a map with the toSpreadMap() . However, the array must have an even number of elements.

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

For some better answers please refer to this

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM