当前位置: 代码迷 >> 综合 >> Jenkins 进阶03 Generic Webhook实践 解析GET/POST请求数据
  详细解决方案

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

热度:105   发布时间:2023-09-30 12:59:40.0

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

解析GET数据


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

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

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

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

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

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

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

解析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."
}

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

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

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

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

  • 通过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会使用上次构建的参数再去触发一遍。

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

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

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

解析HEADER参数数据


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

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

  •  客户端发送请求(什么请求都可以,这里的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 = 100header_id_0 = 100header_name = jenkinsheader_name_0 = jenkins

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

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

  • 通过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参数。

获取所有数据

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

获取username字段

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

获取groupname字段

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

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

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

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

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 = jenkinsallData_name = zhangsangroupName = jenkinsuserName = 
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不一样得使用$符号,$符号代表着整体,通过$.的方式获取里面的值。

也可以是列表

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

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

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

扩展流水线解析JSON数据


安装插件: Pipeline Utility Steps

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

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

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

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

def webHookData = readJSON text: "${allData}"String name1 = webHookData["name"]
String name2 = webHookData.nameString groupName1 = webHookData["group"]["name"]
String groupName2 = webHookData.group.namepipeline {agent anystages {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去处理。

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

  相关解决方案