1. 程式人生 > >遠端觸發Jenkins的Pipeline任務

遠端觸發Jenkins的Pipeline任務

### 場景 - 雖然能配置提交程式碼時觸發Jenkins任務,但有時並不需要每次提交程式碼都觸發,而是僅在有需要時才執行。 - 除了在Jenkins頁面上手動執行任務,還可以向Jenkins網站發起HTTP請求,觸發指定任務的執行,本文就來實戰通過Http請求同時觸發多個Jenkins任務執行。 ### 概述 對於pipeline型別的Jenkins任務,一般是通過外掛 Generic Webhook Trigger來支援遠端觸發的,在使用過程中以下三點需要注意: 1. 遠端觸發Jenk任務,請求的URL怎麼寫; 2. Http請求的引數,如何作為pipeline指令碼的引數; 3. 假設有Jenkins任務A,某時刻有10個觸發該任務的請求同時到達,Jenkins如何處理?(後面會重點討論此問題) 針對上述問題,我們來做一次實戰:向Jenkins服務發起http請求,請求引數是一個Github程式碼倉庫的地址和分支名,Jenkins收到這個請求後,執行一個pipeline任務,該任務是下載指定的Github倉庫的程式碼,流程如下圖所示; ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110253074-112645935.png) ### 環境資訊 1. 作業系統:CentOS 7.7 2. Jenkins:2.190.3 3. Generic Webhook Trigger外掛:1.66 關於Jenkins的部署,請參考文章《》 ### 實戰 1. 先來安裝外掛Generic Webhook Trigger,如下圖,進入外掛管理頁面: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110254037-269107960.png) 2. 安裝外掛的操作步驟如下圖所示,請按照紅框數字的順序操作: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110254794-625249424.png) 3. 稍等片刻,外掛線上安裝成功,如下圖,接下來建立個pipeline任務試試: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110255338-452310394.png) 4. 新建名為remote-test的pipeline任務: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110256116-366293180.png) 5. 如下圖紅框所示,出現了Generic Webhook Trigger選項: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110256837-1511366095.png) 6. 勾選了Generic Webhook Trigger之後頁面會發生變化,如下圖,在紅框位置,先設定token的值為token-remote-test,這樣http請求中的token引數的值如果等於token-remote-test,就會觸發當前任務: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110257677-325322406.png) 7. 接下來設定請求引數,如下圖紅框所示,先輸入固定的ref引數,然後再把repositoryURL和branch也設定好,即Github程式碼倉庫地址和分支名,這樣http請求中repositoryURL和branch引數就能傳遞到後面的pipeline指令碼中去了: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110258948-271918435.png) 8. 接下來可以寫pipeline指令碼了: ```shell 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"按鈕儲存: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110259888-1658899196.png) 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工程,可以正常下載: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110300536-766585505.png) 13. 配置完成後點選Send按鈕傳送請求,正常情況下收到的返回碼是200,如下圖紅框,如果非200(例如404),請檢查引數和Jenkins任務的引數設定(例如token不一致): ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110301352-1229902575.png) 14. 回到Jenkins頁面檢視日誌,如下圖紅框,請求引數都被打印出來了: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110302304-1996732554.png) 15. 繼續往下看,可見Github原始碼成功下載: ![在這裡插入圖片描述](https://img2020.cnblogs.com/other/485422/202010/485422-20201011110303156-862482595.png) - 至此,通過Http觸發Jenkins的pipeline實戰就完成了,我們可以通過程式、指令碼等各種手段,按照不同的需求來觸發Jenkins任務,並傳給任務不同的引數。 ### 併發問題 - 遠端觸發Jenkins任務雖然靈活方便,但是在處理併發請求時會有問題:10個請求同時到達,只有一個會執行,這個問題的破解方法留在下一篇文章《遠端觸發Jenkins的Pipeline任務的併發問題處理》詳細討論吧。 [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blo