使用Jenkins Groovy管道脚本解析数据

时间:2019-04-18 04:50:10

标签: jenkins groovy

我正在使用Groovy脚本中的httpRequest从URL检索JSON对象。

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. 应用程序地图[应用程序:版本](总会有一个Appliction)
  2. TestSuites列表[TestSuite1,...,TestSuite]
  3. 产品图[Product1:版本,...,ProductN:版本]。

但是,我不确定如何执行此操作。 我可以在声明式管道中使用任何Jenkins Groovy库吗?

编辑 根据以下答案,我可以看到我可以通过以下方式制作地图:

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

在示例中,我有:

application = [Application: Application]

我如何获得:     application = [Application:01.01.01]

EDIT2 请注意以下输出:

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

3 个答案:

答案 0 :(得分:1)

据我所知,没有一个库具有解析数据的功能,但是,由于您知道数据的格式,因此手动解析它们很容易。

输入中有3个组(applicationssuitesproducts),由字符分隔。要获得组,您需要:

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(',')

最后,产品与应用列表类似,但是应该使用第二组:

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

答案 1 :(得分:1)

您可以使用管道实用程序步骤readJSON

简化问题
def data = readJSON(file: 'output.json')

echo data.fields.customfield

答案 2 :(得分:0)

我找到了一种方法。 Groovy可以转换Object数组的值,并使用toSpreadMap()将它们转换为映射。但是,数组必须具有偶数个元素。

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

有关一些更好的答案,请参阅this