Создайте файл Json, используя параметры Jenkins - PullRequest
0 голосов
/ 28 июня 2019

Я хотел построить как json, как показано ниже, из сценария Jenkins Pipeline.

{
  type:"create_instance",
  order:{
    "system_order_specs":{
      "location":{ "name": "${params.LOCATION_NAME}" },
      "zones":[
        {
          "$ESXI_TYPE":params.ESXI_COUNT,
          "vlan":[ 
            {
              "type": "${params.VLAN_TYPE}",
            },
            {
              "type": "${params.VLAN_TYPE}",
            } 
          ]
        }
      ],
      "create_dp_instance": false
    }
  }
}

Я испробовал следующий подход, предложенный в этом URL Создание строк JSON из переменных Groovy в Jenkins Pipeline

def data = [
          type:"create_instance",
          order:[
            "system_order_specs":[
              "environment_type":"PROD",
              "location":[ "name": "${params.LOCATION_NAME}" ],
              "zones":[
                [
                  "$ESXI_TYPE":params.ESXI_COUNT,
                  "vlan":[ [
                    "type": "${params.VLAN_TYPE}",
                  ] ]
                ]
              ],
              "create_dp_instance": false
            ]
          ]
        ]
        writeJSON(file: 'initial_temp.json', json: data)

Но это вызывает исключение, в котором говорится, что данные не в надлежащем формате.

Также пробовал простое эхо с использованием shell, но это создает JSON без двойных кавычек ""'.

Пример кода ниже:

sh `echo { \"type\":\"create_instance\", \"job_id\":$JOB_ID, \"order\":{ \"system_order_specs\": "123" } } > xyz.json`

Представленный ниже подход работает, но я уверен, что это не лучший ответ. Поэтому я ищу оптимальное решение для этого.

node{
    def data = readJSON text: '{}'
    def order = readJSON text: '{}'
    def sys_order = readJSON text: '{}'
    def location = readJSON text: '{}'
    def vlan = readJSON text: '{}'
    def zones = readJSON text: '{}'
    data.type = "create_instance"
    location.name = "${params.LOCATION_NAME}" as String
    sys_order.environment_type = 'PROD'
    sys_order.system_number = "${params.SYSTEM_NUMBER}" as String
    sys_order.company = company
    sys_order.location = location
    zones["${params.ESXI_TYPE}"] = params.ESXI_COUNT
    script {
        if (params.VLAN_TYPE != 'nil') {
            vlan.type = "${params.VLAN_TYPE}" as String
            zones.vlan = [vlan]
        }
    }
    sys_order.zones = [zones]
    order.system_order_specs = sys_order
    data.order = order
    writeJSON(file: 'initial_temp.json', json: data)
}
...