Jenkins高级篇之Pipeline技巧篇-2-如何处理多个参数化变量

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

       在前面有一篇文章,我介绍seleinum自动化,如何通过pipeline方式去串联,其中使用了两个变量,一个浏览器类型一个是测试服务器地址。这两个变量,我是在让用户在构建的之前,需要勾选或者填写的。这看起来没有什么问题,那么如果一个项目真的需要很多个参数化变量去构建,那么我们直接这样写肯定不行,本篇就来讨论如下如何优化这个问题。

 

1.问题场景

之前的场景是这样,相关文章https://blog.csdn.net/u011541946/article/details/85549417

Jenkins高级篇之Pipeline技巧篇-2-如何处理多个参数化变量

这里有三个变量就有三个文本框或者其他前端元素,需要让用户去选择或者输入条件值,才能进行构建。那么真实的项目,可能远远不止3个变量,如果有十个或者十几个呢。那么是不是也需要一个很长篇幅的构建页面。这种我在想项目中也遇到过,可以实现构建需求,但是不美观,也不友好,很多参数都暴露出来。

 

2.解决方案

假如有十来个可变的参数,其中有几个是可以提取出来,没必要暴露出来,那么我们就可以把其他参数放入到一个json文件。这个json文件,可以存放在linux服务器上。原则上,每一个有权限去构建这个job的人,需要去linux服务器上创建自己的名称的文件夹,这个文件夹下然后放一个json文件。

我pipeline脚本中,初始化的stage需要读取这个json文件,然后拿到每一个变量的值,赋值给pipeline中的变量,这些变量都是全局变量,任何stage中都可以用到这些全局变量。

这么说,可能不是很明白,没关系,接下来,我一步一步图形和代码来讲明白我的思路。

 

3.准备一个json文件

重点在于,拿到项目的全部可能需要的参数,如何去做一个json文件。这个文件的路径在服务器哪里没有关系,可以是本地,也可以是远程共享服务地址,这种共享,运维人员很容易提供这种路径。

假如说我们ProjectA需要用到一下几个参数,这里我就不去勉强举例十个或者十个以上的参数在json文件里。随便来几个,能表示这个意思就行。例如,用户名称name, 年龄age,手机phoneNumber, 家庭地址addr, 邮箱地址:xxx@xxx.com, 性别gender, 是否已婚,默认是否。

好了就上面这七个参数,六个可以是字符串变量,是否已婚是布尔型变量。我们可以写成一个扁平的json格式,只有一层,没有json嵌套。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1{
2
3   "NAME" : "Lucy",
4
5   "AGE" : "18",
6
7   "PHONE_NUMBER" : "13912345678",
8
9   "ADDRESS" : "Haidian Beijing",
10
11   "EMAIL" : "lucy@demo.com",
12
13   "GENDER" : "male",
14
15   "IS_MARRY" : false
16
17}
18

例如在Jenkins虚拟机里的目录下/tmp/Anthony/test.json写入上面的内容,保存,这个路径下面会用到。

 

4.修改job成参数化构建

由于我们上面有一个参数是需要提供json文件的路径,所以,我们这里在UI勾选参数化构建,并添加一个字符串参数叫INPUT_JSON.

Jenkins高级篇之Pipeline技巧篇-2-如何处理多个参数化变量

保存之后,立即构建菜单变成参数化构建。

 

5.写debug代码

上面json文件我们做好了,接下来,我们来写stage.groovy中代码,先来读取json文件,然后打印里面属性NAME的值。如果能打印出一个,那么其他变量也能打印出来。

相关代码如下


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
3
4pipeline{
5
6   agent any
7   stages{
8      stage("Hello Pipeline") {
9         steps {
10             script {
11                println "Hello Pipeline!"
12                println env.JOB_NAME
13                println env.BUILD_NUMBER
14            }
15         }
16      }
17
18      stage("Init paramters in json") {
19         steps {
20             script {
21
22                println "read josn input file"
23                json_file = INPUT_JSON? INPUT_JSON.trim() : ""
24                prop = readJSON file : json_file
25                name = prop.NAME? prop.NAME.trim() : ""
26                println "Name:" + name
27            }
28         }
29      }
30   }
31
32}
33

 

6.测试和调试

在参数化构建,填入之前准备json文件路径:/tmp/anthony/test.json

Jenkins高级篇之Pipeline技巧篇-2-如何处理多个参数化变量

点击构建,观察控制台日志。

如果提示报错,没有readJSON方法,说明你jenkins环境没有安装插件:Utility Steps, 去插件管理中搜索并安装这个。

Jenkins高级篇之Pipeline技巧篇-2-如何处理多个参数化变量

 

7.打印全部参数的值

代码调整如下


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
41
42
43
44
45
46
1import hudson.model.*;
2
3
4pipeline{
5  
6   agent any
7   stages{
8       stage("Hello Pipeline") {
9           steps {
10              script {
11                  println "Hello Pipeline!"
12                  println env.JOB_NAME
13                  println env.BUILD_NUMBER
14              }
15          }
16      }
17     
18      stage("Init paramters in json") {
19          steps {
20              script {
21                  println "read josn input file"
22                  json_file = INPUT_JSON? INPUT_JSON.trim() : ""
23                  prop = readJSON file : json_file
24                  name = prop.NAME? prop.NAME.trim() : ""
25                  println "Name:" + name
26                  age = prop.AGE? prop.AGE.trim() : ""
27                  println "Age:" + age
28                  phone = prop.PHONE_NUMBER? prop.PHONE_NUMBER.trim() : ""
29                  println "Phone:" + phone
30                  address = prop.ADDRESS? prop.ADDRESS.trim() : ""
31                  println "Address:" + address
32                  email = prop.EMAIL? prop.EMAIL.trim() : ""
33                  println "Email:" + email
34                  gender = prop.GENDER? prop.GENDER.trim() : ""
35                  println "Gender:" + gender
36                  is_marry = prop.IS_MARRY? prop.IS_MARRY.trim() : false
37                  println "is_marry:" + is_marry
38              }
39          }
40      }
41  }
42
43}
44
45
46

测试通过的完整日志


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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
1Started by user root
2Obtained src/Jenkinsfile/projectA-stages.groovy from git https://github.com/Anthonyliu86/pipeline-skills-demo.git
3Running in Durability level: MAX_SURVIVABILITY
4[Pipeline] Start of Pipeline
5[Pipeline] node
6Running on Jenkins in /var/lib/jenkins/workspace/ProjectA-pipeline-demo
7[Pipeline] {
8[Pipeline] stage
9[Pipeline] { (Declarative: Checkout SCM)
10[Pipeline] checkout
11using credential 03214975-2168-4795-981a-ddd935f62a76
12 > git rev-parse --is-inside-work-tree # timeout=10
13Fetching changes from the remote Git repository
14 > git config remote.origin.url https://github.com/Anthonyliu86/pipeline-skills-demo.git # timeout=10
15Fetching upstream changes from https://github.com/Anthonyliu86/pipeline-skills-demo.git
16 > git --version # timeout=10
17using GIT_ASKPASS to set credentials
18 > git fetch --tags --progress https://github.com/Anthonyliu86/pipeline-skills-demo.git +refs/heads/*:refs/remotes/origin/*
19 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
20 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
21Checking out Revision 1c1c552166f9854ee1e16c402de034fbc8517134 (refs/remotes/origin/master)
22 > git config core.sparsecheckout # timeout=10
23 > git checkout -f 1c1c552166f9854ee1e16c402de034fbc8517134
24Commit message: "fix"
25 > git rev-list --no-walk 5b08f84e9f15c2d159aecd136a3a2b072431f3b7 # timeout=10
26[Pipeline] }
27[Pipeline] // stage
28[Pipeline] withEnv
29[Pipeline] {
30[Pipeline] stage
31[Pipeline] { (Hello Pipeline)
32[Pipeline] script
33[Pipeline] {
34[Pipeline] echo
35Hello Pipeline!
36[Pipeline] echo
37ProjectA-pipeline-demo
38[Pipeline] echo
399
40[Pipeline] }
41[Pipeline] // script
42[Pipeline] }
43[Pipeline] // stage
44[Pipeline] stage
45[Pipeline] { (Init paramters in json)
46[Pipeline] script
47[Pipeline] {
48[Pipeline] echo
49read josn input file
50[Pipeline] readJSON
51[Pipeline] echo
52Name:Lucy
53[Pipeline] echo
54Age:18
55[Pipeline] echo
56Phone:13912345678
57[Pipeline] echo
58Address:Haidian Beijing
59[Pipeline] echo
60Email:lucy@demo.com
61[Pipeline] echo
62Gender:male
63[Pipeline] echo
64is_marry:false
65[Pipeline] }
66[Pipeline] // script
67[Pipeline] }
68[Pipeline] // stage
69[Pipeline] }
70[Pipeline] // withEnv
71[Pipeline] }
72[Pipeline] // node
73[Pipeline] End of Pipeline
74Finished: SUCCESS
75

上面多个参数,用JSON方法来处理介绍到这里。其中引出了一些新的代码,例如上面的三元运算符以及局部变量和全局变量的概念,readJSON方法在前面博客完整学习pipeline工具插件的时候介绍过了。这篇,我们有了参数,拿到了多个参数,下面文章,我们详细来介绍下三元运算符在groovvy中的运用和全局变量和局部变量的以及使用map来传参的学习。

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

职场中的那些话那些事

2021-9-24 20:41:29

安全经验

Apache日志分析

2021-11-28 16:36:11

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