这篇介绍在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文件里。
上面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
这个批准脚本执行,以后你遇到了,知道怎么回事就行。今天暂时这样,下次我想到绕过这个方法,不用批准脚本执行,我再更新这段代码支持传入一个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