在Jenkins的slave节点上读取和解析工作区中的json文件

95次阅读
没有评论

问题描述

在Jenkins上有一个作业,该作业在另一台机器上的slave节点上运行,主节点和slave节点都运行在Windows上。slave节点作为Windows服务运行。用户无法从slave节点的工作区中读取json文件并解析它。JSON文件的结构如下所示。用户需要读取EmailProperties对象并修改每个属性,然后再次保存json文件。用户尝试了多个关于readFile()和readJSON()的建议,但都没有成功。希望能得到帮助。

解决方案

请注意以下操作注意版本差异及修改前做好备份。
以下是一个可行的解决方案,如果有更好的方法,请提出建议。

主要方法

def transformjsonfile(propertiesPath, jsonfilepath) {
  // 加载Properties文件
  Properties props = new Properties()
  props.load(new StringReader(readFile(propertiesPath)))

  // 加载json文件
  def json = jsonParseFile(jsonfilepath)

  // 转换json
  json = transformValues(props, json)

  // 将转换后的配置写回json文件
  formatAndWriteBackJson(json)
}

辅助方法

def jsonParseFile(def jsonfilepath) {
  def fileContent = readFile(file: jsonfilepath, encoding: "UTF-8")
  def jsonSlurper = new JsonSlurperClassic()
  def data = jsonSlurper.parseText(fileContent.replaceAll("\\s", "").replaceAll("\uFEFF", ""))
  return data
}

def formatAndWriteBackJson(json) {
  def jsonOut = new JsonBuilder(json).toPrettyString()
  writeFile file: jsonfilepath, text: jsonOut.toString()
}

def transformValues(props, json) {
  for (String name: props.keySet()) {
    String givenValue = props.getProperty(name);
    String value = givenValue.trim();

    if (name.startsWith("json_${env.Environment}_")) {
      splitarray = name.split("json_${env.Environment}_")
      jsonvalue = splitarray[1]
      key = "${jsonvalue}"
      transformvalue = "${value}"

      def someString = "${key}"
      def someChar = '.'
      int count = 0;

      for (int i = 0; i < someString.length(); i++) {
        if (someString.charAt(i) == someChar) {
          count++;
        }
      }

      keyvalue = "json"
      splitarray = key.split('\\.')

      lab1: for (int j = 0; j <= count; j++) {
        keyvalue = keyvalue + "." + splitarray[j]
        jsonvalue = Eval.me('json', json, "${keyvalue}")

        if (jsonvalue == null) {
          break lab1;
        }

        if (jsonvalue != null) {
          println 'condition met'
          if (j == count) {
            Eval.me('json', json, "${keyvalue} ='$transformvalue'")
          }
        }
      }
    }
  }

  return json
}

在上面的解决方案中,我们定义了一个transformjsonfile方法,该方法接受两个参数:propertiesPathjsonfilepath。该方法的作用是读取propertiesPath指定的Properties文件和jsonfilepath指定的json文件,并对json文件进行转换。

jsonParseFile方法中,我们使用readFile函数读取json文件的内容,并使用JsonSlurperClassic解析json内容。

formatAndWriteBackJson方法中,我们使用JsonBuilder将转换后的json对象转换为格式化的字符串,并使用writeFile函数将其写回json文件。

transformValues方法中,我们遍历Properties文件中的每个属性,并根据属性名的前缀和json对象的结构进行转换。具体的转换逻辑可以参考代码注释。

请注意,以上代码是基于Groovy语言编写的,可以在Jenkins的Pipeline脚本中使用。在使用之前,请根据实际情况修改代码中的变量名和路径。

希望以上解决方案对您有所帮助。如果有更好的方法或其他问题,请随时提问。

正文完