本文共 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/