場景
- 雖然能配置提交代碼時觸發Jenkins任務,但有時并不需要每次提交代碼都觸發,而是僅在有需要時才執行,
- 除了在Jenkins頁面上手動執行任務,還可以向Jenkins網站發起HTTP請求,觸發指定任務的執行,本文就來實戰通過Http請求同時觸發多個Jenkins任務執行,
概述
對于pipeline型別的Jenkins任務,一般是通過插件
Generic Webhook Trigger來支持遠程觸發的,在使用程序中以下三點需要注意:
- 遠程觸發Jenk任務,請求的URL怎么寫;
- Http請求的引數,如何作為pipeline腳本的引數;
- 假設有Jenkins任務A,某時刻有10個觸發該任務的請求同時到達,Jenkins如何處理?(后面會重點討論此問題)
針對上述問題,我們來做一次實戰:向Jenkins服務發起http請求,請求引數是一個Github代碼倉庫的地址和分支名,Jenkins收到這個請求后,執行一個pipeline任務,該任務是下載指定的Github倉庫的代碼,流程如下圖所示;

環境資訊
- 作業系統:CentOS 7.7
- Jenkins:2.190.3
- Generic Webhook Trigger插件:1.66
關于Jenkins的部署,請參考文章《》
實戰
- 先來安裝插件Generic Webhook Trigger,如下圖,進入插件管理頁面:

- 安裝插件的操作步驟如下圖所示,請按照紅框數字的順序操作:

- 稍等片刻,插件在線安裝成功,如下圖,接下來創建個pipeline任務試試:

- 新建名為remote-test的pipeline任務:

- 如下圖紅框所示,出現了Generic Webhook Trigger選項:

- 勾選了Generic Webhook Trigger之后頁面會發生變化,如下圖,在紅框位置,先設定token的值為token-remote-test,這樣http請求中的token引數的值如果等于token-remote-test,就會觸發當前任務:

- 接下來設定請求引數,如下圖紅框所示,先輸入固定的ref引數,然后再把repositoryURL和branch也設定好,即Github代碼倉庫地址和分支名,這樣http請求中repositoryURL和branch引數就能傳遞到后面的pipeline腳本中去了:

- 接下來可以寫pipeline腳本了:
pipeline {
agent any
triggers {
GenericTrigger(
genericVariables: [
[key: 'ref', value: '$.ref'],
[key: 'repositoryURL', value: '$.repositoryURL'],
[key: 'branch', value: '$.branch']
],
token: 'token-remote-test' ,
causeString: '$ref' ,
printContributedVariables: true,
printPostContent: true
)
}
stages {
stage('show-param') {
steps {
echo 'token引數:$token'
echo '代碼倉庫:$repositoryURL'
echo '代碼分支:$branch'
}
}
stage('down-sourcecode') {
steps {
echo '開始下載原始碼'
checkout([$class: 'GitSCM',
branches: [[name: '*/$branch']],
doGenerateSubmoduleConfigurations: false,
extensions: [],
submoduleCfg: [],
userRemoteConfigs: [[url: '$repositoryURL']]])
}
}
}
}
上述腳本有以下幾個關鍵點:
a. triggers 、GenericTrigger、genericVariables這幾個引數是固定的,按上述示例去寫即可;
b. printContributedVariables、printPostContent為true,會在執行任務時列印出請求引數的內容來;
c. 這里一共有兩個stage,在show-param執行的時候,會將http請求引數全部列印出來;
d. checkout是pipeline提供的API,用于下載Github倉庫的代碼,其branches引數的值用上了http的請求引數branch,userRemoteConfigs.url引數的值用上了http的請求引數branchrepositoryURL
9. 上述pipeline腳本寫在下圖紅框位置,然后點擊底部的"Save"按鈕保存:

10. 任務配置完成,接下來用postman發起http請求;
11. 我這邊jenkins網站的地址是:http://192.168.133.149:32049 ,因此觸發任務的請求地址是:http://192.168.133.149:32049/generic-webhook-trigger/invoke?token=token-remote-test ,注意token引數的值和任務設定中的token值保持一致就能觸發任務;
12. 在Postman上的配置如下圖所示,請按照數字順序配置,repositoryURL引數的值為https://github.com/zq2599/jenkinsdemo.git,這是我放在Github上的一個java工程,可以正常下載:

13. 配置完成后點擊Send按鈕發送請求,正常情況下收到的回傳碼是200,如下圖紅框,如果非200(例如404),請檢查引數和Jenkins任務的引數設定(例如token不一致):

14. 回到Jenkins頁面查看日志,如下圖紅框,請求引數都被列印出來了:

15. 繼續往下看,可見Github原始碼成功下載:

- 至此,通過Http觸發Jenkins的pipeline實戰就完成了,我們可以通程序式、腳本等各種手段,按照不同的需求來觸發Jenkins任務,并傳給任務不同的引數,
并發問題
- 遠程觸發Jenkins任務雖然靈活方便,但是在處理并發請求時會有問題:10個請求同時到達,只有一個會執行,這個問題的破解方法留在下一篇文章《遠程觸發Jenkins的Pipeline任務的并發問題處理》詳細討論吧,
https://github.com/zq2599/blog_demos
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/167648.html
標籤:Java
上一篇:2-Java面試-面向物件
