遠端觸發Jenkins的Pipeline任務

程式設計師欣宸 發表於 2022-11-25
Jenkins

場景

  • 雖然能配置提交程式碼時觸發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倉庫的程式碼,流程如下圖所示;
在這裡插入圖片描述

環境資訊

  1. 作業系統:CentOS 7.7
  2. Jenkins:2.190.3
  3. Generic Webhook Trigger外掛:1.66

關於Jenkins的部署,請參考文章《》

實戰

  1. 先來安裝外掛Generic Webhook Trigger,如下圖,進入外掛管理頁面:
    在這裡插入圖片描述
  2. 安裝外掛的操作步驟如下圖所示,請按照紅框數字的順序操作:
    在這裡插入圖片描述
  3. 稍等片刻,外掛線上安裝成功,如下圖,接下來建立個pipeline任務試試:
    在這裡插入圖片描述
  4. 新建名為remote-test的pipeline任務:
    在這裡插入圖片描述
  5. 如下圖紅框所示,出現了Generic Webhook Trigger選項:
    在這裡插入圖片描述
  6. 勾選了Generic Webhook Trigger之後頁面會發生變化,如下圖,在紅框位置,先設定token的值為token-remote-test,這樣http請求中的token引數的值如果等於token-remote-test,就會觸發當前任務:
    在這裡插入圖片描述
  7. 接下來設定請求引數,如下圖紅框所示,先輸入固定的ref引數,然後再把repositoryURL和branch也設定好,即Github程式碼倉庫地址和分支名,這樣http請求中repositoryURL和branch引數就能傳遞到後面的pipeline指令碼中去了:
    在這裡插入圖片描述
  8. 接下來可以寫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