場景
- 雖然能配置提交程式碼時觸發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