博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jenkins高级篇之Pipeline技巧篇-2-如何处理多个参数化变量
阅读量:4302 次
发布时间:2019-05-27

本文共 5431 字,大约阅读时间需要 18 分钟。

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

 

1.问题场景

之前的场景是这样,相关文章

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

 

2.解决方案

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

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

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

 

3.准备一个json文件

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

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

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

{   "NAME" : "Lucy",   "AGE" : "18",   "PHONE_NUMBER" : "13912345678",   "ADDRESS" : "Haidian Beijing",   "EMAIL" : "lucy@demo.com",   "GENDER" : "male",   "IS_MARRY" : false}

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

 

4.修改job成参数化构建

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

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

 

5.写debug代码

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

相关代码如下

import hudson.model.*;pipeline{   agent any   stages{      stage("Hello Pipeline") {         steps {             script {                println "Hello Pipeline!"                println env.JOB_NAME                println env.BUILD_NUMBER            }         }      }      stage("Init paramters in json") {         steps {             script {                println "read josn input file"                json_file = INPUT_JSON? INPUT_JSON.trim() : ""                prop = readJSON file : json_file                name = prop.NAME? prop.NAME.trim() : ""                println "Name:" + name            }         }      }   }}

 

6.测试和调试

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

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

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

 

7.打印全部参数的值

代码调整如下

import hudson.model.*;pipeline{ 		agent any	stages{		stage("Hello Pipeline") {			steps {			    script {					println "Hello Pipeline!"					println env.JOB_NAME					println env.BUILD_NUMBER				}			}		}				stage("Init paramters in json") {			steps {			    script {					println "read josn input file"					json_file = INPUT_JSON? INPUT_JSON.trim() : ""					prop = readJSON file : json_file					name = prop.NAME? prop.NAME.trim() : ""					println "Name:" + name					age = prop.AGE? prop.AGE.trim() : ""					println "Age:" + age					phone = prop.PHONE_NUMBER? prop.PHONE_NUMBER.trim() : ""					println "Phone:" + phone					address = prop.ADDRESS? prop.ADDRESS.trim() : ""					println "Address:" + address					email = prop.EMAIL? prop.EMAIL.trim() : ""					println "Email:" + email					gender = prop.GENDER? prop.GENDER.trim() : ""					println "Gender:" + gender					is_marry = prop.IS_MARRY? prop.IS_MARRY.trim() : false					println "is_marry:" + is_marry				}			}		}	}}

测试通过的完整日志

Started by user rootObtained src/Jenkinsfile/projectA-stages.groovy from git https://github.com/Anthonyliu86/pipeline-skills-demo.gitRunning in Durability level: MAX_SURVIVABILITY[Pipeline] Start of Pipeline[Pipeline] nodeRunning on Jenkins in /var/lib/jenkins/workspace/ProjectA-pipeline-demo[Pipeline] {[Pipeline] stage[Pipeline] { (Declarative: Checkout SCM)[Pipeline] checkoutusing credential 03214975-2168-4795-981a-ddd935f62a76 > git rev-parse --is-inside-work-tree # timeout=10Fetching changes from the remote Git repository > git config remote.origin.url https://github.com/Anthonyliu86/pipeline-skills-demo.git # timeout=10Fetching upstream changes from https://github.com/Anthonyliu86/pipeline-skills-demo.git > git --version # timeout=10using GIT_ASKPASS to set credentials  > git fetch --tags --progress https://github.com/Anthonyliu86/pipeline-skills-demo.git +refs/heads/*:refs/remotes/origin/* > git rev-parse refs/remotes/origin/master^{commit} # timeout=10 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10Checking out Revision 1c1c552166f9854ee1e16c402de034fbc8517134 (refs/remotes/origin/master) > git config core.sparsecheckout # timeout=10 > git checkout -f 1c1c552166f9854ee1e16c402de034fbc8517134Commit message: "fix" > git rev-list --no-walk 5b08f84e9f15c2d159aecd136a3a2b072431f3b7 # timeout=10[Pipeline] }[Pipeline] // stage[Pipeline] withEnv[Pipeline] {[Pipeline] stage[Pipeline] { (Hello Pipeline)[Pipeline] script[Pipeline] {[Pipeline] echoHello Pipeline![Pipeline] echoProjectA-pipeline-demo[Pipeline] echo9[Pipeline] }[Pipeline] // script[Pipeline] }[Pipeline] // stage[Pipeline] stage[Pipeline] { (Init paramters in json)[Pipeline] script[Pipeline] {[Pipeline] echoread josn input file[Pipeline] readJSON[Pipeline] echoName:Lucy[Pipeline] echoAge:18[Pipeline] echoPhone:13912345678[Pipeline] echoAddress:Haidian Beijing[Pipeline] echoEmail:lucy@demo.com[Pipeline] echoGender:male[Pipeline] echois_marry:false[Pipeline] }[Pipeline] // script[Pipeline] }[Pipeline] // stage[Pipeline] }[Pipeline] // withEnv[Pipeline] }[Pipeline] // node[Pipeline] End of PipelineFinished: SUCCESS

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

转载地址:http://lkows.baihongyu.com/

你可能感兴趣的文章
MasOS 安装 hashdb 报错 fatal error: ‘openssl/evp.h‘ file not found 的解决方案
查看>>
安卓Kotlin 安卓6及以下 使用HttpURLConnection时 转换url路径中的汉字
查看>>
C语言 x86_64处理器下利用gcc内联汇编实现打印char的二进制编码
查看>>
蛮力、贪心、减治、分治、动态规划算法总结
查看>>
凸优化问题
查看>>
LPL的S9总决赛IG对阵FPX分析
查看>>
算法工程师的日常训练--个人参考
查看>>
看论文的方法论
查看>>
各大机器学习算法的总结
查看>>
监控摄像头分类
查看>>
深度神经网络总结
查看>>
Tensorflow论文学习
查看>>
大数据技术总结
查看>>
云计算技术总结
查看>>
C/C++内存申请函数总结
查看>>
c++文件读写坑总结
查看>>
Java递归删除文件
查看>>
流 java 流 字符流 字节 流的学习与理解
查看>>
《六顶思考帽》读书笔记
查看>>
《你的灯亮着吗》第一遍读后感
查看>>