json - Groovy/ Jenkins : how to prettify json string?

标签 json jenkins groovy jenkins-pipeline jenkins-declarative-pipeline

如何使用 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
}
def pretty_json =...上面 Jenkinsfile 中的语句触发以下错误:
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 字符串。
  • 我试过 def pretty_json = JsonOutput.toJson(status_json)基于 Create JSON strings from Groovy variables in Jenkins Pipeline ,并生成此错误:
  • Error when executing always post condition:
    groovy.lang.MissingPropertyException: No such property: JsonOutput for class: groovy.lang.Binding
    
  • 试过 def pretty_json = groovy.json.JsonOutput.prettyPrint(status_json)基于 https://gist.github.com/osima/1161966 ,它产生了这个错误:
  • 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)
    

    最佳答案

    根据上次错误信息

    groovy.lang.MissingMethodException: 
    No signature of method: java.lang.Class.prettyPrint() 
    is applicable for argument types: (net.sf.json.JSONObject)
    
    您有 net.sf.json.JSONObjectstatus_json多变的。

    that's really strange - seems you are getting status_json not in a standard way for jenkins


    但是根据这个类的文档
    http://json-lib.sourceforge.net/apidocs/jdk15/net/sf/json/JSONObject.html#toString(int)
    只需执行以下操作即可制作漂亮的 json:
    def pretty_json = status_json.toString(2)
    

    如果您有 Scripts not permitted to use method XYZ异常(exception):
    出于安全原因,jenkins 中禁用了许多非标准方法。
    请参阅此答案以解决此类问题:https://stackoverflow.com/a/39412951/1276664

    最后 - 您问题中的几乎每个案例都应该有效:
  • writeJSON( returnText: true, json: status_json ) :
    更新 pipeline-utility-steps jenkins 插件到最新版本支持 returnText范围
  • 和上面一样

  • ...
  • JsonOutput.toJson(status_json) :JsonOutput类(class)位于 groovy.json包裹。你可以在 t 导入这个包
    剧本开头import groovy.json或者这样称呼它:groovy.json.JsonOutput.toJson(status_json) .请注意,此方法返回非格式化的 json。
  • groovy.json.JsonOutput.prettyPrint(status_json) : 查看 JsonOutput.prettyPrint 的文档- 可以为字符串而不是对象调用它。所以这可以工作:groovy.json.JsonOutput.prettyPrint(status_json.toString())但仅在 status_json.toString() 的情况下返回一个有效的 json 和 JsonOutput.prettyPrint允许在 jenkins admin 中调用。
  • 关于json - Groovy/ Jenkins : how to prettify json string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67829146/

    相关文章:

    java - Jenkins 无法构建 Maven 项目

    java - 带参数的 Groovy 模拟 Java 类

    grails - 为什么此源代码在Grails 1.3.7中不起作用?

    java - 在接口(interface)中声明常量,但在实现中定义常量

    javascript - 将表单输入与 JSON 对象进行比较

    sql - json Web 服务输出到 azure sql with/credentials

    jenkins - 列出 Jenkins 上作业正在运行的当前构建总数

    python - 从不创建 JSON 输出文件的 python 脚本调用 scrapy

    javascript - Codeigniter:在 Controller 中定义 JSON 变量

    jenkins - 如何为 Jenkins 管道 httpRequest 方法传递一系列有效响应代码