这篇介绍在Pipeline Utility Steps这个插件里的第二个和第三个方法,和json读写有关。这些方法有一个前提,任何文件都需要放在jenkins的workspace下,执行的job才能去找到文件。Jenkins是没有能力去一个其他磁盘或者网络路径去访问并读取文件的,记住这个很重要。
1方法readJSON
为了接下来的代码测试,我提前在当前项目中的/testdata路径下新建了一个test_json.json的文件,里面写了几个键值对,没有考虑里面考虑嵌套的数组,内容如下。
{
"NAME":"Anthony",
"AGE":18,
"CITY":"Beijing",
"GENDER":"male"
}
在jenkins官网上,readJSON方法后面有两种参数,分别是file和text,我就把这两种情况都在模块类文件里都写成方法。
module文件内容
import hudson.model.*;
def find_files(filetype) {
def files = findFiles(glob:filetype)
for (file in files) {
println file.name
}
}
def read_json_file(file_path) {
def propMap = readJSON file : file_path
propMap.each {
println ( it.key + " = " + it.value )
}
}
def read_json_file2(json_string) {
def propMap = readJSON text : json_string
propMap.each {
println ( it.key + " = " + it.value )
}
}
return this;
pipeline stage文件内容
import hudson.model.*;
println env.JOB_NAME
println env.BUILD_NUMBER
pipeline{
agent any
stages{
stage("init") {
steps{
script{
model_test = load env.WORKSPACE + "/pipeline/module/pipeline-demo-module.groovy"
}
}
}
stage("Parse json") {
steps{
script{
json_file = env.WORKSPACE + "/testdata/test_json.json"
model_test.read_json_file(json_file)
println "================================"
json_string = '{"NAME":"Anthony","AGE":18,"CITY":"Beijing","GENDER":"male"}'
model_test.read_json_file2(json_string)
}
}
}
}
}
我的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文件内容
import hudson.model.*;
import groovy.json.*;
def find_files(filetype) {
def files = findFiles(glob:filetype)
for (file in files) {
println file.name
}
}
def read_json_file(file_path) {
def propMap = readJSON file : file_path
propMap.each {
println ( it.key + " = " + it.value )
}
}
def read_json_file2(json_string) {
def propMap = readJSON text : json_string
propMap.each {
println ( it.key + " = " + it.value )
}
}
def write_json_to_file(input_json, tofile_path) {
def input = ''
if(input_json.toString().endsWith(".json")) {
input = readJSON file : input_json
}else {
def jsonOutput = new JsonOutput()
def new_json_object = jsonOutput.toJson(input_json)
input = new_json_object
}
writeJSON file: tofile_path, json: input
}
return this;
pipeline stage文件内容
import hudson.model.*;
println env.JOB_NAME
println env.BUILD_NUMBER
pipeline{
agent any
stages{
stage("init") {
steps{
script{
model_test = load env.WORKSPACE + "/pipeline/module/pipeline-demo-module.groovy"
}
}
}
stage("write json") {
steps{
script{
json_file = env.WORKSPACE + "/testdata/test_json.json"
tojson_file = env.WORKSPACE + "/testdata/new_json.json"
model_test.write_json_to_file(json_file,tojson_file)
println "================================"
json_string = '{"NAME":"Anthony","AGE":18,"CITY":"Beijing","GENDER":"male"}'
tojson_file = env.WORKSPACE + "/testdata/new_json1.json"
model_test.write_json_to_file(json_string,tojson_file)
}
}
}
}
}
上面的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机器上。
[root@Anthony ~]# cd /var/lib/jenkins/workspace/
[root@Anthony workspace]# ls
mytest paramater_job_demo@tmp pipeline-project-demo
mytest@tmp Pipeline-learn-Demo1 pipeline-project-demo@tmp
paramater_job_demo Pipeline-learn-Demo1@tmp utilty_methods_demo
[root@Anthony workspace]# cd pipeline-project-demo
[root@Anthony pipeline-project-demo]# ls
Jenkinsfile lib pipeline testdata
[root@Anthony pipeline-project-demo]# cd testdata/
[root@Anthony testdata]# pwd
/var/lib/jenkins/workspace/pipeline-project-demo/testdata
[root@Anthony testdata]# ls
123.txt abc.log a.log new_json.json test_json.json
[root@Anthony testdata]# vi new_json.json
[root@Anthony testdata]# cat new_json.json
{"NAME":"Anthony","AGE":18,"CITY":"Beijing","GENDER":"male"}[root@Anthony testdata]
#