玩轉(zhuǎn)觸發(fā)器之Jenkins Generic Webhook使用技巧
1. 預(yù)備知識
目標(biāo):學(xué)習(xí)HTTP基礎(chǔ)知識,掌握如何使用Postman和Curl調(diào)用接口的方法。
1.1 Web HTTP基礎(chǔ)知識
HTTP請求是什么?
HTTP超文本傳輸協(xié)議,是確保服務(wù)器(Server)和客戶端(Client)之間的正確通信。
一個請求和響應(yīng)的過程:
Request用戶通過瀏覽器向服務(wù)端發(fā)起請求。Response服務(wù)端將客戶端請求的資源數(shù)據(jù)進行響應(yīng)。
HTTP常見的錯誤碼
1xx : 服務(wù)已收到請求,請求者繼續(xù)執(zhí)行操作。
2xx:請求成功,常見(201)
3xx:請求成功,頁面發(fā)生重定向(301)
4xx:客戶端發(fā)生了錯誤
- 常見的是資源找不到了(404)
- 資源請求需要認證認證失敗(401)
- 認證成功但是權(quán)限不夠(403)
5xx:服務(wù)端發(fā)生了錯誤
- 網(wǎng)關(guān)超時(504)
- 內(nèi)部錯誤(500)
- 網(wǎng)關(guān)錯誤(502)
- 服務(wù)不可用(503)
2. Jenkins Generic Webhook實踐
目的:為Jenkins作業(yè)添加觸發(fā)器,便于其他系統(tǒng)調(diào)用。
安裝配置Generic WebHook
插件名稱:Generic Webhook Trigger
重啟后,進入一個Pipeline項目設(shè)置,已經(jīng)可以選擇這個觸發(fā)器了....
插件文檔:https://plugins.jenkins.io/generic-webhook-trigger/

Jenkins作業(yè)配置觸發(fā)器
啟動Generic Webhook觸發(fā)器后, 相當(dāng)于給Jenkins加了一個新的接口(http://JENKINS_URL/generic-webhook-trigger/invoke)。
調(diào)用的時候:這里要把 JENKINS_URL 換成自己真實的Jenkins 服務(wù)器地址,有端口就加上端口,是域名就寫域名。下面是一個參考的URL:
- http://192.168.1.200:8080/generic-webhook-trigger/invoke
Post content parameters:獲取調(diào)用接口傳進來的數(shù)據(jù)
JsonPath語法文檔:https://github.com/json-path/JsonPath
Header parameters:獲取Header中的參數(shù)
Request parameters:獲取URL中的請求參數(shù)
- curl http://192.168.1.200:8080/generic-webhook-trigger/invoke?runopts=gitlab
Token: 給URL添加一個觸發(fā)的認證
- curl http://192.168.1.200:8080/generic-webhook-trigger/invoke?token=devops-service
打印調(diào)試信息到日志中
觸發(fā)條件過濾:僅滿足條件才能觸發(fā)此作業(yè)
實踐:demo
解析GET/POST請求數(shù)據(jù)
傳參注意,第一個參數(shù)使用?號連接, 后面的參數(shù)使用&符號連接。
- ?token=demo-pipeline-service&user=jenkins&a=1&b=2
演示將postman中的請求轉(zhuǎn)換curl方式。
- [root@zeyang-nuc-service ~]# curl --location --request GET 'http://192.168.1.200:8080/generic-webhook-trigger/invoke?token=demo-pipeline-service'
- {"jobs":{"demo-pipeline-service":{"regexpFilterExpression":"","triggered":true,"resolvedVariables":{},"regexpFilterText":"","id":209,"url":"queue/item/209/"}},"message":"Triggered jobs."}[root@zeyang-nuc-service ~]#
解析GET數(shù)據(jù)
客戶端發(fā)送Get請求, 帶有兩個參數(shù) version 和 username 。
- http://192.168.1.200:8080/generic-webhook-trigger/invoke?token=demo-pipeline-service&version=1.1.1&username=jenkins
Jenkins 配置Generic hook,獲取請求參數(shù)version 和 username (參數(shù)名稱要一致)
驗證測試(Jenkins日志中能夠打印出獲取的值,則正常)
通過jenkinsfile讀取傳遞的參數(shù)
- println("${username}")
- println("${version}")
解析HEADER參數(shù)數(shù)據(jù)
客戶端發(fā)送請求(什么請求都可以,這里的header與請求類型無關(guān)), 帶有兩個參數(shù) header_name 和 header_id 。
- curl --location --request GET 'http://192.168.1.200:8080/generic-webhook-trigger/invoke?token=demo-pipeline-service' \
- --header 'header_name: jenkins' \
- --header 'header_id: 100'
Jenkins 配置Generic hook,獲取請求參數(shù)header_name 和 header_id 。
通過jenkinsfile讀取傳遞的參數(shù)
- println("${header_id}")
- println("${header_name}")
- println(header_id)
- println(header_name)
- String headerName = "${header_id}"
- println(headerName)
- //pipeline {
- //}
解析POST數(shù)據(jù)
客戶端發(fā)送POST請求, 參數(shù)存儲在body體中(參考POSTMAN中的樣例)
- curl --location --request POST 'http://192.168.1.200:8080/generic-webhook-trigger/invoke?token=demo-pipeline-service' \
- --header 'Content-Type: application/json' \
- --data-raw '{
- "name": "zhangsan",
- "id": "123",
- "group1": {
- "name": "jenkins",
- "id" : "001",
- "age": "40"
- }
- }'
Jenkins 配置觸發(fā)器來獲取Post參數(shù)。
獲取所有數(shù)據(jù)
獲取username字段
獲取group1Name字段
Jenkinsfile中使用參數(shù)
- println("所有body數(shù)據(jù) --> ${allData}")
- println('最外層name ---> $.name' + "${userName}")
- println('第二層name ---> $.group1.name' + "${group1Name}")
擴展流水線解析JSON數(shù)據(jù)
安裝插件:Pipeline Utility Steps
readJSON:處理json數(shù)據(jù)
- println("所有body數(shù)據(jù) --> ${allData}")
- def webHookData = readJSON text: "${allData}"
- String userName = webHookData["name"]
- String userName2 = webHookData.name
- String group1Name = webHookData["group1"]["name"]
- String group1Name2 = webHookData.group1.name
- println('最外層name ---> $.name' + "${userName}")
- println('最外層name ---> $.name' + "${userName2}")
- println('第二層name ---> $.group1.name' + "${group1Name}")
- println('第二層name ---> $.group1.name' + "${group1Name2}")
Rebuilder 插件使用
可以直接攜帶原觸發(fā)參數(shù)進行觸發(fā),不用重復(fù)觸發(fā)(不用在重復(fù)的提交代碼了)。
進入某一次構(gòu)建后,可以點擊rebuild。