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

Jenkins作業配置觸發器
啟動Generic Webhook觸發器后, 相當于給Jenkins加了一個新的接口(http://JENKINS_URL/generic-webhook-trigger/invoke)。
調用的時候:這里要把 JENKINS_URL 換成自己真實的Jenkins 服務器地址,有端口就加上端口,是域名就寫域名。下面是一個參考的URL:
- http://192.168.1.200:8080/generic-webhook-trigger/invoke
Post content parameters:獲取調用接口傳進來的數據
JsonPath語法文檔:https://github.com/json-path/JsonPath
Header parameters:獲取Header中的參數
Request parameters:獲取URL中的請求參數
- curl http://192.168.1.200:8080/generic-webhook-trigger/invoke?runopts=gitlab
Token: 給URL添加一個觸發的認證
- curl http://192.168.1.200:8080/generic-webhook-trigger/invoke?token=devops-service
打印調試信息到日志中
觸發條件過濾:僅滿足條件才能觸發此作業
實踐:demo
解析GET/POST請求數據
傳參注意,第一個參數使用?號連接, 后面的參數使用&符號連接。
- ?token=demo-pipeline-service&user=jenkins&a=1&b=2
演示將postman中的請求轉換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數據
客戶端發送Get請求, 帶有兩個參數 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,獲取請求參數version 和 username (參數名稱要一致)
驗證測試(Jenkins日志中能夠打印出獲取的值,則正常)
通過jenkinsfile讀取傳遞的參數
- println("${username}")
- println("${version}")
解析HEADER參數數據
客戶端發送請求(什么請求都可以,這里的header與請求類型無關), 帶有兩個參數 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,獲取請求參數header_name 和 header_id 。
通過jenkinsfile讀取傳遞的參數
- println("${header_id}")
- println("${header_name}")
- println(header_id)
- println(header_name)
- String headerName = "${header_id}"
- println(headerName)
- //pipeline {
- //}
解析POST數據
客戶端發送POST請求, 參數存儲在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 配置觸發器來獲取Post參數。
獲取所有數據
獲取username字段
獲取group1Name字段
Jenkinsfile中使用參數
- println("所有body數據 --> ${allData}")
- println('最外層name ---> $.name' + "${userName}")
- println('第二層name ---> $.group1.name' + "${group1Name}")
擴展流水線解析JSON數據
安裝插件:Pipeline Utility Steps
readJSON:處理json數據
- println("所有body數據 --> ${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 插件使用
可以直接攜帶原觸發參數進行觸發,不用重復觸發(不用在重復的提交代碼了)。
進入某一次構建后,可以點擊rebuild。