zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Jenkins 进阶03 Generic Webhook实践 解析GET/POST请求数据

Jenkins数据 解析 实践 请求 进阶 get 03
2023-09-14 09:15:16 时间

解析GET数据


传参注意,第一个参数使用?号连接, 后面的参数使用&符号连接。

通过触发器给Jenkins传入参数,也就是我在客户端请求Jenkins,然后Jenkins怎么获取到请求当中参数?

Jenkins 配置Generic hook,获取请求参数versionusername参数名称要一致)) 

image.png

 如果需要看效果,打印日志

解析GET数据

  • 客户端发送Get请求, 带有两个参数 version 和 username 。

  触发成功,并且传递了一些变量

{
    "jobs": {
        "Gitlab-Generic-Webhook-Trigger": {
            "regexpFilterExpression": "",
            "triggered": true,
            "resolvedVariables": {
                "username": "\"lulei\"",
                "username_0": "\"lulei\"",
                "version": "1",
                "version_0": "1"
            },
            "regexpFilterText": "",
            "id": 501,
            "url": "queue/item/501/"
        }
    },
    "message": "Triggered jobs."
}

http://139.198.170.122:8080/generic-webhook-trigger/invoke?token=generic-webhook-trigger&version=1&username="lulei"

下面可以看到客户端请求当中带的参数被Jenkins拿到了,在Jenkinsfile里面去拿这些变量就行了 

  • 通过jenkinsfile读取传递的参数
println("${username}")
println("${version}")

  通过postman工具再去调用一次,记住不要手动去触发,因为参数的值需要请求里面包含

[Pipeline] node
Running on build-01 in /data/cicd/jenkinsagent/workspace/Gitlab-Generic-Webhook-Trigger
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Hello)
[Pipeline] echo
1
[Pipeline] echo
"lulei"
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline

为了方便调试,可以安装rebuild插件,那么不需要重复触发。点开某次成功的构建,然后rebuilder会使用上次构建的参数再去触发一遍。

 上面整个过程就先触发,再捕获,  发get请求-------》Jenkins获取请求参数------》验证

解析HEADER参数数据


  •  客户端发送请求(什么请求都可以,这里的header与请求类型无关), 带有两个参数 header_name 和 header_id 。
curl --location --request GET 'http://139.198.170.122:8080/generic-webhook-trigger/invoke?token=generic-webhook-trigger' \
--header 'header_name: jenkins' \
--header 'header_id: 100'
Contributing variables:

    header_id = 100
    header_id_0 = 100
    header_name = jenkins
    header_name_0 = jenkins

 可以看到并不返回包体数据。

  • 通过jenkinsfile读取传递的参数
println("${header_id}")
println("${header_name}")
println(header_id)
println(header_name)

String headerName = "${header_id}"
println(headerName)


//pipeline {  
//}

解析POST数据(往Jenkins里面推数据)


$:表示所有的body数据

  • Jenkins 配置触发器来获取Post参数。

获取所有数据

获取username字段

获取groupname字段

  • 客户端发送POST请求, 参数存储在body体中(参考POSTMAN中的样例

在使用post请求时候,Jenkins里面定义的变量名字可以与json格式里面的变量名字不同,这个变量名字就相当于在Jenkins里面定义的变量,变量的值使用jsonpath语法。

curl --location --request POST 'http://192.168.11.128:8080/generic-webhook-trigger/invoke?token=webhook-01' \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "jenkins",
    "version": "1",
    "groupname": {
        "name": "gitlab"
    }
}'
Contributing variables:

    allData = {
    "name": "zhangsan",
    "group": {
        "name" : "jenkins"
    }
}
    allData_group_name = jenkins
    allData_name = zhangsan
    groupName = jenkins
    userName = 
curl --location --request POST 'http://139.198.170.122:8080/generic-webhook-trigger/invoke?token=generic-webhook-trigger' \
--header 'Content-Type: application/json' \
--data-raw '{
    "name": "zhangsan",
    "group": {
        "name" : "jenkins"
    }
}'
  • Jenkinsfile中使用参数
println("所有body数据 --> ${allData}")
println('最外层name ---> $.name' + "${userName}")
println('第二层name ---> $.group1.name' + "${group1Name}")

首先在客户端发起请求,里面包含了数据,Jenkins要想拿到数据和上面两种get,header不一样得使用$符号,$符号代表着整体,通过$.的方式获取里面的值。

也可以是列表

这里是索引,也可以不写索引,直接返回list。 

扩展流水线解析JSON数据


安装插件: Pipeline Utility Steps

现在不想在触发器里面去写这些一个一个的变量了,但是还是想获取变量的值,那么需要插件。

我们会使用到这个插件的resdJSON方法,是用来专门用来处理json数据的。如果不知道怎么使用这个插件可以在片段生成器里面查看,有处理文本和处理json数据,最后赋值给变量。

def webHookData = readJSON text: "${allData}"

String name1 = webHookData["name"]
String name2 = webHookData.name

String groupName1 = webHookData["group"]["name"]
String groupName2 = webHookData.group.name


pipeline {
    agent any

    stages {
        stage('webHook') {
            steps {
             println("所有body数据 --> ${allData}")
             println(name1)
             println(name2)
             println(groupName1)
             println(groupName2)
             
            }
        }
    }
}
[Pipeline] readJSON
[Pipeline] node
Running on build-01 in /data/cicd/jenkinsagent/workspace/Gitlab-Generic-Webhook-Trigger
[Pipeline] {
[Pipeline] stage
[Pipeline] { (webHook)
[Pipeline] echo
所有body数据 --> {
    "name": "zhangsan",
    "group": {
        "name" : "jenkins"
    }
}
[Pipeline] echo
zhangsan
[Pipeline] echo
zhangsan
[Pipeline] echo
jenkins
[Pipeline] echo
jenkins
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

 所以有两种方法,一种是在webhook里面将每个参数都写出来,另外一种是使用readJSON去处理。

image.png