我正在尝试在Groovy中为我的一个Jenkins作业生成以下JSON输出。
预期的 JSON
{
"svc-a": {
"type": "object",
"properties": {
"svcVersion": {
"type": "string",
"propertyOrder": 1,
"enum": ["No build", "1.0.0.59", "1.0.0.58"]
},
"skipConfigs": {
"type": "boolean",
"format": "checkbox"
}
}
},
"svc-b": {
"type": "object",
"properties": {
"svcVersion": {
"type": "string",
"propertyOrder": 1,
"enum": ["No build", "1.0.0.177", "1.0.0.176", "1.0.0.175"]
},
"skipConfigs": {
"type": "boolean",
"format": "checkbox"
}
}
}
}
我正在遍历每个服务并从 Jenkins 获取内部版本号。对于每个服务,我正在尝试生成 json 以及一些额外的标头并将其附加到映射中。最后,当从映射现有构建 json 对象时,json 被视为字符串。
我的代码。
#!/usr/bin/env groovy
import org.boon.Boon;
import groovy.json.JsonSlurper;
import groovy.transform.Field;
import groovy.json.JsonBuilder;
import groovy.json.*
def serviceList = [
"svc-a",
"svc-b"
]
def getBuildVersions(serviceName) {
def resultList = []
resultList.add(0,"No build")
def job = jenkins.model.Jenkins.instance.getAllItems().findAll { it.name.contains(serviceName) }
job.each { s ->
if (s.toString().contains("")) {
print s
def builds = s.getBuilds()
builds.each { t->
if((t.result).toString() == "SUCCESS" && !t.displayName.contains("SNAPSHOT") && !t.displayName.contains("config")){
resultList.add(t.displayName)
}
}
}
}
return resultList
}
def retVal = new HashMap<String, Map>()
for (svc in serviceList) {
def myBuilds = getBuildVersions(svc)
List ver = myBuilds.collect{ "'" + it + "'"}
def header = """
{"type": "object", "properties": { "svcVersion": { "type": "string", "propertyOrder": 1, "enum": $ver }, "skipConfigs": { "type": "boolean", "format": "checkbox" } } }
"""
def json = JsonOutput.toJson(header)
def result = new JsonSlurper().parseText(json)
// s = "'" + svc + "'"
retVal.put(svc, result)
}
def builder = new JsonBuilder()
sjson = JsonOutput.toJson(retVal)
return sjson
接收的输出
{"svc-a":"n{"type": "object", "properties": { "svcVersion": { "type": "string", "propertyOrder": 1, "enum": ['No build', '1.0.0.59', '1.0.0.58', '1.0.0.57', '1.0.0.56', '1.0.0.55', '1.0.0.54', '1.0.0.53', '1.0.0.52', '1.0.0.51', '1.0.0.49', '1.0.0.48', '1.0.0.47', '1.0.0.46', '1.0.0.45', '1.0.0.38', '1.0.0.37', '1.0.0.36', '1.0.0.35', '1.0.0.33', '1.0.0.31', '1.0.0.30', '1.0.0.29', '1.0.0.28', '1.0.0.27', '1.0.0.26', '1.0.0.25', '1.0.0.24', '1.0.0.22', '1.0.0.20', '1.0.0.19', '1.0.0.18', '1.0.0.17', '1.0.0.16', '1.0.0.13', '1.0.0.11', '1.0.0.8', '1.0.0.6', '1.0.0.5'] }, "skipConfigs": { "type": "boolean", "format": "checkbox" } } }n","svc-b":"n{"type": "object", "properties": { "svcVersion": { "type": "string", "propertyOrder": 1, "enum": ['No build', '1.0.0.177', '1.0.0.176', '1.0.0.175', '1.0.0.173', '1.0.0.172', '1.0.0.171', '1.0.0.170', '1.0.0.169', '1.0.0.167', '1.0.0.166', '1.0.0.165', '1.0.0.164', '1.0.0.163', '1.0.0.162', '1.0.0.158', '1.0.0.156', '1.0.0.38', '1.0.0.37', '1.0.0.36', '1.0.0.35', '1.0.0.33', '1.0.0.31', '1.0.0.29', '1.0.0.27'] }, "skipConfigs": { "type": "boolean", "format": "checkbox" } } }n"}
当 Groovy Map 转换为 JSON 时,将值中的 json 对象视为一个字符串。
如何获得正确格式的 json 输出。 我来自python背景,对Groovy没有mcuh的想法。
仅使用字符串操作即可找到解决方案
for (svc in serviceList) {
def myBuilds = getBuildVersions(svc)
List ver = myBuilds.collect{ '"' + it + '"'}
def header = """
"$svc": {"type": "object", "properties": { "svcVersion": { "type": "string", "propertyOrder": 1, "enum": $ver }, "skipConfigs": { "type": "boolean", "format": "checkbox" } } }
"""
if (firstRun == "true"){
retVal = header
} else {
retVal = retVal + "," + header
}
firstRun = "false"
}