遠程觸發Jenkins的Pipeline任務
- 2020 年 10 月 11 日
- 筆記
場景
- 雖然能配置提交程式碼時觸發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網站的地址是://192.168.133.149:32049 ,因此觸發任務的請求地址是://192.168.133.149:32049/generic-webhook-trigger/invoke?token=token-remote-test ,注意token參數的值和任務設置中的token值保持一致就能觸發任務;
12. 在Postman上的配置如下圖所示,請按照數字順序配置,repositoryURL參數的值為//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任務的並發問題處理》詳細討論吧。
//github.com/zq2599/blog_demos