zoukankan      html  css  js  c++  java
  • DEVOPS技术实践_19:Pipeline的多参数json调用

    在上一篇学习了把参数写进Json文件,然后通过去Json文件,调用参数的方法

    1. 三元运算符介绍

    调用的方法是通过一个三元运算符实现的

    gender = prop.GENDER? prop.GENDER.trim() : ""
    is_marry = prop.IS_MARRY? prop.IS_MARRY.trim() : false

    这种写法就是Java中三元运算符的写法,prop.GENDER?表示判断这个变量是否存在,如果存在我们就prop.GENDER.trim(), 如果不存在,我们设置默认值为空字符串。上面函的数trim(),就是去除变量值的前后的多余空格,这个写法还是很严谨,我们不可能保证用户就不一定带着多余空格进来。其实在groovy语法中,还有简写版的三元运算符:

    GENDER = prop.GENDER?: "default"

     上面意思还是一样,只不过是更加符合groovy的风格,意思性别字段存在吗,如果存在就是里面的值,如果不存在,就设置default这个值。这个缺点就是无法直接trim(),去除前后空格。

    下面学习使用map方式传递参数

    2. 写一个module.groovy文件

    [root@node1 ~]# mkdir /root/.jenkins/moodlegroovy
    [root@node1 ~]# vi /root/.jenkins/moodlegroovy/model.groovy

    def getUserInfo(args) {
        def name = args.name
        def age = args.age
        def phone = args.phone
        def address = args.address
        def email = args.email
        def gender = args.gender
        def is_marry = args.is_marry
        
        // she or he
        def binge = (gender == "male")? "he" : "she"
        // if is marry
        def marry = (is_marry == true)? "is marry" : "is not marry yet"
        def userInfo = """
        ${name} come from ${address}, ${binge} is ${age} old. ${binge}'s phone number is
        ${phone}, or you can contact ${binge} via ${email}, ${binge} ${marry}.
        """
        println userInfo
    }
    return this;

    在这里使用def重新定义了两个参数(bing和marry)

    3. 重新写pipeline语法,在gitlab修改

    import hudson.model.*;
        pipeline{
        agent any
        environment {
        INPUT_JSON = "/tmp/test.json"
        }
        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
                    }
                }
            }
        stage("call a method") {
                steps {
                    script {
                        println "send the parameter as map type"
                        model_call = load env.JENKINS_HOME + "/moodlegroovy/model.groovy"
                        model_call.getUserInfo(name:name, age:age, phone:phone, address:address, email:email, gender:gender, is_marry:is_marry)
                    }
                }
            }
         }
     
    }

    点击构建

    4. 构建结果

    Started by user darren ning
    Obtained pipeline.jenkinsfile from git http://192.168.132.132/root/pipeline-parameter-test.git
    Running in Durability level: MAX_SURVIVABILITY
    [Pipeline] Start of Pipeline
    [Pipeline] node
    Running on Jenkins in /root/.jenkins/workspace/pipeline_parameter_project
    [Pipeline] {
    [Pipeline] stage
    [Pipeline] { (Declarative: Checkout SCM)
    [Pipeline] checkout
    No credentials specified
     > git rev-parse --is-inside-work-tree # timeout=10
    Fetching changes from the remote Git repository
     > git config remote.origin.url http://192.168.132.132/root/pipeline-parameter-test.git # timeout=10
    Fetching upstream changes from http://192.168.132.132/root/pipeline-parameter-test.git
     > git --version # timeout=10
     > git fetch --tags --progress http://192.168.132.132/root/pipeline-parameter-test.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=10
    Checking out Revision edda078d67705019d7183dd7d1c4201003f682b1 (refs/remotes/origin/master)
     > git config core.sparsecheckout # timeout=10
     > git checkout -f edda078d67705019d7183dd7d1c4201003f682b1
    Commit message: "Update pipeline.jenkinsfile"
     > git rev-list --no-walk 0f09c80389aa181c2066555209110a2afa041b53 # timeout=10
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] withEnv
    [Pipeline] {
    [Pipeline] withEnv
    [Pipeline] {
    [Pipeline] stage
    [Pipeline] { (Hello Pipeline)
    [Pipeline] script
    [Pipeline] {
    [Pipeline] echo
    Hello Pipeline!
    [Pipeline] echo
    pipeline_parameter_project
    [Pipeline] echo
    13
    [Pipeline] }
    [Pipeline] // script
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] stage
    [Pipeline] { (Init paramters in json)
    [Pipeline] script
    [Pipeline] {
    [Pipeline] echo
    read josn input file
    [Pipeline] readJSON
    [Pipeline] echo
    Name:Lucy
    [Pipeline] echo
    Age:18
    [Pipeline] echo
    Phone:13912345678
    [Pipeline] echo
    Address:Haidian Beijing
    [Pipeline] echo
    Email:lucy@demo.com
    [Pipeline] echo
    Gender:male
    [Pipeline] echo
    is_marry:false
    [Pipeline] }
    [Pipeline] // script
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] stage
    [Pipeline] { (call a method)
    [Pipeline] script
    [Pipeline] {
    [Pipeline] echo
    send the parameter as map type
    [Pipeline] load
    [Pipeline] { (/root/.jenkins/moodlegroovy/model.groovy)
    [Pipeline] }
    [Pipeline] // load
    [Pipeline] echo
    
        Lucy come from Haidian Beijing, he is 18 old. he's phone number is
        13912345678, or you can contact he via lucy@demo.com, he is not marry yet.
        
    [Pipeline] }
    [Pipeline] // script
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] }
    [Pipeline] // withEnv
    [Pipeline] }
    [Pipeline] // withEnv
    [Pipeline] }
    [Pipeline] // node
    [Pipeline] End of Pipeline
    Finished: SUCCESS

    构建成功,也按照原有方式传递进来

    总结,上面模块方法的时候参数就写了一个args, 调用方法的时候传了7个map对象进去。然后模块方法中每个变量前面都加上def, 加上之后模块中的变量都变成了局部变量。这样和已经存在内存中的stage里面的全局变量不会被覆盖和重写

    5. 测试一

    假如不适用三元运算符调用json文件的参数,但是依然把这个参数传递到model.groovy里

    删掉:is_marry参数

    import hudson.model.*;
        pipeline{
        agent any
        environment {
        INPUT_JSON = "/tmp/test.json"
        }
        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
                    }
                }
            }
        stage("call a method") {
                steps {
                    script {
                        println "send the parameter as map type"
                        model_call = load env.JENKINS_HOME + "/moodlegroovy/model.groovy"
                        model_call.getUserInfo(name:name, age:age, phone:phone, address:address, email:email, gender:gender, is_marry:is_marry)
                    }
                }
            }
         }
     
    }

    点击构建,则会报错,没有这个参数

    6. 测试二

    加上这个参数,但是不传递到model.groovy中

    jenkinsfile文件

    import hudson.model.*;
        pipeline{
        agent any
        environment {
        INPUT_JSON = "/tmp/test.json"
        }
        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
                    }
                }
            }
        stage("call a method") {
                steps {
                    script {
                        println "send the parameter as map type"
                        model_call = load env.JENKINS_HOME + "/moodlegroovy/model.groovy"
                        model_call.getUserInfo(name:name, age:age, phone:phone, address:address,gender:gender, is_marry:is_marry)
                    }
                }
            }
         }
    }

    在此构建,看构建结果

    Started by user darren ning
    Obtained pipeline.jenkinsfile from git http://192.168.132.132/root/pipeline-parameter-test.git
    Running in Durability level: MAX_SURVIVABILITY
    [Pipeline] Start of Pipeline
    [Pipeline] node
    Running on Jenkins in /root/.jenkins/workspace/pipeline_parameter_project
    [Pipeline] {
    [Pipeline] stage
    [Pipeline] { (Declarative: Checkout SCM)
    [Pipeline] checkout
    No credentials specified
     > git rev-parse --is-inside-work-tree # timeout=10
    Fetching changes from the remote Git repository
     > git config remote.origin.url http://192.168.132.132/root/pipeline-parameter-test.git # timeout=10
    Fetching upstream changes from http://192.168.132.132/root/pipeline-parameter-test.git
     > git --version # timeout=10
     > git fetch --tags --progress http://192.168.132.132/root/pipeline-parameter-test.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=10
    Checking out Revision 029b57783a597bb66636c932c6e45289317f6ce1 (refs/remotes/origin/master)
     > git config core.sparsecheckout # timeout=10
     > git checkout -f 029b57783a597bb66636c932c6e45289317f6ce1
    Commit message: "Update pipeline.jenkinsfile"
     > git rev-list --no-walk 732222f86b3bb78bfba7833a3a5a3ad00a60950a # timeout=10
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] withEnv
    [Pipeline] {
    [Pipeline] withEnv
    [Pipeline] {
    [Pipeline] stage
    [Pipeline] { (Hello Pipeline)
    [Pipeline] script
    [Pipeline] {
    [Pipeline] echo
    Hello Pipeline!
    [Pipeline] echo
    pipeline_parameter_project
    [Pipeline] echo
    17
    [Pipeline] }
    [Pipeline] // script
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] stage
    [Pipeline] { (Init paramters in json)
    [Pipeline] script
    [Pipeline] {
    [Pipeline] echo
    read josn input file
    [Pipeline] readJSON
    [Pipeline] echo
    Name:Lucy
    [Pipeline] echo
    Age:18
    [Pipeline] echo
    Phone:13912345678
    [Pipeline] echo
    Address:Haidian Beijing
    [Pipeline] echo
    Email:lucy@demo.com
    [Pipeline] echo
    Gender:male
    [Pipeline] echo
    is_marry:false
    [Pipeline] }
    [Pipeline] // script
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] stage
    [Pipeline] { (call a method)
    [Pipeline] script
    [Pipeline] {
    [Pipeline] echo
    send the parameter as map type
    [Pipeline] load
    [Pipeline] { (/root/.jenkins/moodlegroovy/model.groovy)
    [Pipeline] }
    [Pipeline] // load
    [Pipeline] echo
    
        Lucy come from Haidian Beijing, he is 18 old. he's phone number is
        13912345678, or you can contact he via null, he is not marry yet.        #邮件的内容显示为null
        
    [Pipeline] }
    [Pipeline] // script
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] }
    [Pipeline] // withEnv
    [Pipeline] }
    [Pipeline] // withEnv
    [Pipeline] }
    [Pipeline] // node
    [Pipeline] End of Pipeline
    Finished: SUCCESS

    7. 总结参数的一个传递过程

    1. 把参数写进json文件
    2. 通过readJSON方法读取JSON文件内容
    3. 使用三元运算符把参数Pipeline中重新调用,变成Pipeline的全局变量
    4. 使用model_call加载model.groovy模块文件
    5. 使用model_call.getUserInfo括号后面的参数传递给model.groovy文件使用
    6. model.groovy文件获取参数,在使用args重新定义当下模块的变量,成为一个本模块可用的局部变量
    7. model.groovy文件调用参数,并做相应处理,返回
    8. Pipeline获得返回信息,形成一个完整的过程

    参考文档:https://blog.csdn.net/u011541946/article/details/88956846,下面继续和作者学习

  • 相关阅读:
    android widgets控件
    android test控件
    android layout
    android build.gradle
    android studio AndroidManifest
    android studio settings
    (2)git本地生成SSH关联github
    (1)git
    bzoj2286 (sdoi2011)消耗战(虚树)
    Tree 树(树形期望dp)
  • 原文地址:https://www.cnblogs.com/zyxnhr/p/11872388.html
Copyright © 2011-2022 走看看