【发布时间】:2021-06-03 21:58:41
【问题描述】:
如何使用 Jenkins 声明式语法管道将 JSON 对象捕获为美化字符串?
pipeline {
agent any
stages {
stage( "Set up" ) {
steps {
script {
hostname = "bld-machine"
reply_email = "jenkins@${hostname}.company.com"
actor_email = "user@company.com"
status_json = initStatusJson()
}
}
}
/** Try figure out the difference between "global" and "env." variables. */
stage( "Capture variables" ) {
steps {
script {
status_json.env["var"] = "${env.var}" as String
status_json.env["var2"] = "${var}" as String
}
}
}
}
post {
always {
script {
def pretty_json = writeJSON( returnText: true, json: status_json )
}
emailext( subject: "CI/CD | ${currentBuild.currentResult}",
from: "${reply_email}",
to: "${actor_email}",
mimeType: "text/plain",
body: "${pretty_json}" )
}
}
}
def initStatusJson() {
def json_obj = readJSON text: '{}'
json_obj.job = readJSON text: '{}'
json_obj.env = [:]
json_obj.job.name = "${JOB_BASE_NAME}" as String
json_obj.job.number = "${BUILD_ID}" as String
json_obj.job.server = "${JENKINS_URL}" as String
json_obj.job.visualization = "${JENKINS_URL}/blue/organizations/jenkins/${JOB_BASE_NAME}/detail/${JOB_BASE_NAME}/${BUILD_ID}/pipeline" as String
return json_obj
}
上述Jenkinsfile中的def pretty_json =...语句触发如下错误:
WARNING: Unknown parameter(s) found for class type WARNING: Unknown parameter(s) found for class type 'org.jenkinsci.plugins.pipeline.utility.steps.json.WriteJSONStep': returnText
[Pipeline] }
[Pipeline] // script
Error when executing always post condition:
java.lang.IllegalArgumentException: You have to provided a file for writeJSON.
at org.jenkinsci.plugins.pipeline.utility.steps.json.WriteJSONStepExecution.run(WriteJSONStepExecution.java:61)
at org.jenkinsci.plugins.pipeline.utility.steps.json.WriteJSONStepExecution.run(WriteJSONStepExecution.java:43)
at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
我尝试过的:
-
def pretty_json = writeJSON( returnText: true, json: status_json )语句的灵感来自以下资源:
Jenkinsfile pipeline construct JSON object and write to file
https://www.jenkins.io/doc/pipeline/steps/pipeline-utility-steps/#writejson-write-json-to-a-file-in-the-workspace -
我也尝试了
def pretty_json = writeJSON returnText: true, json: status_json,但结果相同。 -
status_json.toString()返回一个有效但未经美化的 JSON 字符串。 -
我在Create JSON strings from Groovy variables in Jenkins Pipeline的基础上尝试了
def pretty_json = JsonOutput.toJson(status_json),它会产生这个错误:
Error when executing always post condition:
groovy.lang.MissingPropertyException: No such property: JsonOutput for class: groovy.lang.Binding
- 基于https://gist.github.com/osima/1161966 尝试了
def pretty_json = groovy.json.JsonOutput.prettyPrint(status_json),它产生了这个错误:
Error when executing always post condition:
groovy.lang.MissingMethodException: No signature of method: java.lang.Class.prettyPrint() is applicable for argument types: (net.sf.json.JSONObject)
更新:尝试@daggett的解决方案如下:
post {
always {
script {
def pretty_json = status_json.toString(2)
}
emailext( subject: "CI/CD | ${currentBuild.currentResult}",
from: "${reply_email}",
to: "${actor_email}",
mimeType: "text/plain",
body: "${pretty_json}" )
}
}
...还尝试了一些变体,例如pretty_json = ...(而不是def pretty_json = ...),还将pretty_json 分配移到script{...} 范围之外...但没有任何效果。
在script{...} 上下文中,.toString(2) 产生了这个错误:
Scripts not permitted to use method net.sf.json.JSON toString int.
在script{...} 上下文之外,它产生了我解释为“语法错误”的内容:
WorkflowScript: 79: Expected a step @ line 79, column 7.
pretty_json = status_json.toString(2)
【问题讨论】:
标签: json jenkins groovy jenkins-pipeline jenkins-declarative-pipeline