Jenkins高级篇之Pipeline方法篇-Pipeline Utility Steps-2-方法readJSON和writeJSON

释放双眼,带上耳机,听听看~!

这篇介绍在Pipeline Utility Steps这个插件里的第二个和第三个方法,和json读写有关。这些方法有一个前提,任何文件都需要放在jenkins的workspace下,执行的job才能去找到文件。Jenkins是没有能力去一个其他磁盘或者网络路径去访问并读取文件的,记住这个很重要。

1方法readJSON

为了接下来的代码测试,我提前在当前项目中的/testdata路径下新建了一个test_json.json的文件,里面写了几个键值对,没有考虑里面考虑嵌套的数组,内容如下。


1
2
3
4
5
6
7
8
1{
2"NAME":"Anthony",
3"AGE":18,
4"CITY":"Beijing",
5"GENDER":"male"
6}
7
8

在jenkins官网上,readJSON方法后面有两种参数,分别是file和text,我就把这两种情况都在模块类文件里都写成方法。

module文件内容


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1import hudson.model.*;
2
3
4def find_files(filetype) {
5  
6   def files = findFiles(glob:filetype)
7   for (file in files) {
8       println file.name
9   }
10}
11
12def read_json_file(file_path) {
13  def propMap = readJSON file : file_path
14  propMap.each {
15      println ( it.key + " = " + it.value )
16  }
17}
18
19def read_json_file2(json_string) {
20  def propMap = readJSON text : json_string
21  propMap.each {
22      println ( it.key + " = " + it.value )
23  }
24}
25return this;
26
27

pipeline stage文件内容


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1import hudson.model.*;
2
3println env.JOB_NAME
4println env.BUILD_NUMBER
5
6pipeline{
7  
8   agent any
9   stages{
10      stage("init") {
11          steps{
12              script{
13                  model_test = load env.WORKSPACE + "/pipeline/module/pipeline-demo-module.groovy"
14              }
15          }
16      }
17      stage("Parse json") {
18          steps{
19              script{
20                  json_file = env.WORKSPACE + "/testdata/test_json.json"
21                  model_test.read_json_file(json_file)
22                  println "================================"
23                  json_string = '{"NAME":"Anthony","AGE":18,"CITY":"Beijing","GENDER":"male"}'
24                  model_test.read_json_file2(json_string)
25              }
26          }
27      }
28  }
29}
30
31
32
33

我的jenkins Job测试成功的是:http://65.49.216.200:8080/job/pipeline-project-demo/27/console

2方法writeJSON

上面介绍json的读取内容,下面介绍如何写入内容到一个json文件里。

Jenkins高级篇之Pipeline方法篇-Pipeline Utility Steps-2-方法readJSON和writeJSON

上面wirteJSON方法有两个必须的字段,分别是json和file,json是一个json对象,是你需要把这个json写入到文件的内容,第二个file字段是一个文件的路径,这个文件肯定在jenkins的workspace范围之内。第三个字段pretty是可选,也就是可以选择把json对象插入到一个指定的位置。

先来演示,把一个json对象写入到/testdata下的一个new_json.json文件,看看这个json文件会不会自动创建,并检查内容是否是我们写入的。

modele文件内容


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
1import hudson.model.*;
2import groovy.json.*;
3
4def find_files(filetype) {
5  
6   def files = findFiles(glob:filetype)
7   for (file in files) {
8       println file.name
9   }
10}
11
12def read_json_file(file_path) {
13  def propMap = readJSON file : file_path
14  propMap.each {
15      println ( it.key + " = " + it.value )
16  }
17}
18
19def read_json_file2(json_string) {
20  def propMap = readJSON text : json_string
21  propMap.each {
22      println ( it.key + " = " + it.value )
23  }
24}
25
26def write_json_to_file(input_json, tofile_path) {
27  def input = ''
28  if(input_json.toString().endsWith(".json")) {
29      input = readJSON file : input_json
30  }else {
31      def jsonOutput = new JsonOutput()
32        def new_json_object = jsonOutput.toJson(input_json)
33      input = new_json_object
34  }
35  writeJSON file: tofile_path, json: input
36}
37
38return this;
39
40

pipeline stage文件内容


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1import hudson.model.*;
2
3println env.JOB_NAME
4println env.BUILD_NUMBER
5
6pipeline{
7  
8   agent any
9   stages{
10      stage("init") {
11          steps{
12              script{
13                  model_test = load env.WORKSPACE + "/pipeline/module/pipeline-demo-module.groovy"
14              }
15          }
16      }
17      stage("write json") {
18          steps{
19              script{
20                  json_file = env.WORKSPACE + "/testdata/test_json.json"
21                  tojson_file = env.WORKSPACE + "/testdata/new_json.json"
22                  model_test.write_json_to_file(json_file,tojson_file)
23                  println "================================"
24                  json_string = '{"NAME":"Anthony","AGE":18,"CITY":"Beijing","GENDER":"male"}'
25                  tojson_file = env.WORKSPACE + "/testdata/new_json1.json"
26                  model_test.write_json_to_file(json_string,tojson_file)
27              }
28          }
29      }
30  }
31}
32
33
34
35

上面的module中的write json方法,我参数接收做了判断,如果是一个json文件,没问题,用readJSON然后赋值给一个对象就好。如果传入是一个json格式的字符串对象,需要把字符串转换成json,这里使用了JsonOutput方法,但是出了一个异常,这个需要每次管理员去批准这个script,默认是被禁止的。这个功能也是jenkins管理员需要了解的一个,具体可以看我jenkins job:http://65.49.216.200:8080/job/pipeline-project-demo/35/console

Jenkins高级篇之Pipeline方法篇-Pipeline Utility Steps-2-方法readJSON和writeJSON

 

这个批准脚本执行,以后你遇到了,知道怎么回事就行。今天暂时这样,下次我想到绕过这个方法,不用批准脚本执行,我再更新这段代码支持传入一个json格式的字符串。然后处理成json对象,最后调用writeJSON方法。

最后来看看,一个json文件作为参数传入,写入到另外一个json文件的效果。这个需要去你自己jenkins执行环境下,我的是linux机器上。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1[root@Anthony ~]# cd /var/lib/jenkins/workspace/
2[root@Anthony workspace]# ls
3mytest              paramater_job_demo@tmp    pipeline-project-demo
4mytest@tmp          Pipeline-learn-Demo1      pipeline-project-demo@tmp
5paramater_job_demo  Pipeline-learn-Demo1@tmp  utilty_methods_demo
6[root@Anthony workspace]# cd pipeline-project-demo
7[root@Anthony pipeline-project-demo]# ls
8Jenkinsfile  lib  pipeline  testdata
9[root@Anthony pipeline-project-demo]# cd testdata/
10[root@Anthony testdata]# pwd
11/var/lib/jenkins/workspace/pipeline-project-demo/testdata
12[root@Anthony testdata]# ls
13123.txt  abc.log  a.log  new_json.json  test_json.json
14[root@Anthony testdata]# vi new_json.json
15[root@Anthony testdata]# cat new_json.json
16{"NAME":"Anthony","AGE":18,"CITY":"Beijing","GENDER":"male"}[root@Anthony testdata]
17#
18

 

给TA打赏
共{{data.count}}人
人已打赏
安全经验

职场中的那些话那些事

2021-9-24 20:41:29

安全经验

Apache日志分析

2021-11-28 16:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索