溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

發(fā)布時間:2021-09-26 16:50:29 來源:億速云 閱讀:219 作者:柒染 欄目:系統(tǒng)運維

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1. 時間觸發(fā)

時間觸發(fā)是指定義一個時間,時間到了就觸發(fā)pipeline執(zhí)行。在Jenkins pipeline中使用trigger指令來定義時間觸發(fā)。

trigger指令只能被定義在pipeline塊下,Jenkins內(nèi)置支持cron、pollSCM,upstream三種方式。其他方式可以通過插件來實現(xiàn)。

1.1 定時執(zhí)行:cron

定時執(zhí)行就像cronjob,一到時間點就執(zhí)行。它的使用場景通常是執(zhí)行一些周期性的job,如每夜構(gòu)建。

pipeline {
    agent any
    triggers {
        cron('0 0 * * *')
    }
    stages {
        stage('Nightly build') {
            steps {
                echo "這是一個耗時的構(gòu)建,每天凌晨執(zhí)行"
            }
        }
     }
}

Jenkins trigger cron語法采用的是UNIX cron語法(有些細(xì)微的區(qū)別)。一條cron包含5個字段,使用空格或Tab分隔,格式為:MINUTE HOUR DOM MONTH DOW。每個字段的含義為:

  • MINUTE:一小時內(nèi)的分鐘,取值范圍為0~59。

  • HOUR:一天內(nèi)的小時,取值范圍為0~23。

  • DOM:一個月的某一天,取值范圍為1~31。

  • MONTH:月份,取值范圍為1~12。

  • DOW:星期幾,取值范圍為0~7。0和7代表星期天。
    還可以使用以下特殊字符,一次性指定多個值。

  • *:匹配所有的值

  • M-N:匹配M 到N 之間的值。

  • M-N/X or*/X:指定在M 到N 范圍內(nèi),以X值為步長。

  • A,B,· · ·,Z:使用逗號枚舉多個值。

在一些大型組織中,會同時存在大量的同一時刻執(zhí)行的定時任務(wù),比如N 個半夜零點(0 0 * * *)執(zhí)行的任務(wù)。這樣會產(chǎn)生負(fù)載不均衡。在Jenkins trigger cron語法中使用“H”字符來解決這一問題,H代表hash。對于沒必要準(zhǔn)確到零點0分執(zhí)行的任務(wù),cron可以這樣寫:H 0 * * *,代表在零點0分至,H代表hash。代表在零點0分至零點59分之間任何一個時間點執(zhí)行。

需要注意的是,H應(yīng)用在DOM(一個月的某一天)字段時會有不準(zhǔn)確的情況,因為10月有31天,而2月卻是28天。

Jenkins trigger cron還設(shè)計了一些人性化的別名:@yearly、@annually@monthly、@weekly@daily、@midnight@hourly。例如,@hourlyH * * * *相同,代表一小時內(nèi)的任何時間;@midnight實際上代表在半夜12:00到凌晨2:59之間的某個時間。其他別名很少有應(yīng)用場景。

1.2 輪詢代碼倉庫:pollSCM

輪詢代碼倉庫是指定期到代碼倉庫詢問代碼是否有變化,如果有變化就執(zhí)行。

pipeline {
    agent any
    triggers {
        // 每分鐘判斷一次代碼是否有變化
        pollSCM("H/1 * * * *")
    }
}

事實上,如果代碼有變化,最好的方式是代碼倉庫主動通知Jenkins,而不是Jenkins頻繁去代碼倉庫檢查。那這種方式存在的意義是什么?
在一些特殊情況下,比如外網(wǎng)的代碼倉庫無法調(diào)用內(nèi)網(wǎng)的Jenkins,或者反過來,則會采用這種方式。

2. 事件觸發(fā)

事件觸發(fā)就是發(fā)生了某個事件就觸發(fā)pipeline執(zhí)行。這個事件可以是你能想到的任何事件。比如手動在界面上觸發(fā)、其他Job主動觸發(fā)、HTTP API Webhook觸發(fā)等。

2.1 由上游任務(wù)觸發(fā):upstream

當(dāng)B任務(wù)的執(zhí)行依賴A任務(wù)的執(zhí)行結(jié)果時,A就被稱為B的上游任務(wù)。在Jenkins 2.22及以上版本中,trigger指令開始支持upstream類型的觸發(fā)條件。upstream的作用就是能讓B pipeline自行決定依賴哪些上游任務(wù)。

// job1和job2都是任務(wù)名
triggers {
    upstream(upstreamProjects: "job1,job2", threshold: hudson.model.Result.SUCCESS)
}

當(dāng)upstreamProjects參數(shù)接收多個任務(wù)時,使用,分隔。threshold參數(shù)是指上游任務(wù)的執(zhí)行結(jié)果是什么值時觸發(fā)。hudson.model.Result是一個枚舉,包括以下值:

  • ABORTED:任務(wù)被手動中止。

  • FAILURE:構(gòu)建失敗。

  • SUCCESS:構(gòu)建成功。

  • UNSTABLE:存在一些錯誤,但不至于構(gòu)建失敗。

  • NOT_BUILT:在多階段構(gòu)建時,前面階段的問題導(dǎo)致后面階段無法執(zhí)行。

注意:需要手動觸發(fā)一次任務(wù),讓Jenkins加載pipeline后,trigger指令才會生效。

2.2 GitLab通知觸發(fā)

GitLab通知觸發(fā)是指當(dāng)GitLab發(fā)現(xiàn)源代碼有變化時,觸發(fā)Jenkins執(zhí)行構(gòu)建。

由GitLab主動通知進行構(gòu)建的好處是顯而易見的,這樣很容易就解決了我們之前提到的輪詢代碼倉庫時“多久輪詢一次”的問題,實現(xiàn)每一次代碼的變化都對應(yīng)一次構(gòu)建。

2.2.1 在pipeline中實現(xiàn)GitLab trigger

GitLab插件上實現(xiàn)了基于GitLab的trigger。以下是具體使用方法。

pipeline {
    agent any
    triggers {
        gitlab(triggerOnPush: true,
            triggerOnMergeRequest: true,
            branchFilterType: "All",
            secretToken: "t8vcxwuza023ehzcftzr5a74vkpto6xr")
    }
    stages {
        stage('build') {
            steps {
                echo 'Hello World from gitlab trigger'
            }
        }
    }
}

secretToken使用隨機字符串生成器生成即可。如果Jenkins在內(nèi)網(wǎng)使用,并且安全性有一定的保障,我們可以將secretToken定義為一個Jenkins全局變量,供所有的項目使用。這樣做就不用為每個項目重新生成token了。
GitLab trigger方法有很多參數(shù)可配置,下面簡單介紹一些常用的參數(shù)。

  • triggerOnPush:當(dāng)GitLab觸發(fā)push事件時,是否執(zhí)行構(gòu)建。

  • triggerOnMergeRequest:當(dāng)GitLab觸發(fā)mergeRequest事件時,是否執(zhí)行構(gòu)建。

  • branchFilterType:只有符合條件的分支才會被觸發(fā)。必選,否則無法實現(xiàn)觸發(fā)??梢栽O(shè)置的值有:

    • NameBasedFilter:基于分支名進行過濾,多個分支名使用逗號分隔。

    • RegexBasedFilter:基于正則表達對分支名進行過濾。

    • All:所有分支都會被觸發(fā)。

  • includeBranchesSpec:基于branchFilterType值,輸入期望包括的分支的規(guī)則。

  • excludeBranchesSpec:基于branchFilterType值,輸入期望排除的分支的規(guī)則。

2.2.2 使用Generic Webhook Trigger插件實現(xiàn)觸發(fā)

安裝 Generic Webhook Trigger 插件(下文使用 GWT 簡稱)后,Jenkins 會暴露一個 API:
<JENKINS URL>/generic-webhook-trigger/invoke,即由GWT插件來處理此API的請求。

以下為使用token示例:

pipeline {
    agent any
    triggers {
        GenericTrigger(
            genericVariables: [
                [
                    key: 'ref', 
                    value: '$.ref'
                ]
            ],

            token: 'secret',

            causeString: 'Triggered on $ref',
            printContributedVariables: true,
            printPostContent: true
        )
    }
    stages {
        stage("Some step") {
            steps {
                sh "echo $ref"
                sh "printenv"
            }
        }
    }
}

curl -X POST -H "Content-Type: application/json" -d '{"ref": "ref/heads/master"}' -s https://jenkins.utcook.com/generic-webhook-trigger/invoke?token=secret

Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

GenericTrigger觸發(fā)條件由GWT插件提供。此觸發(fā)條件可以說是GWT的所有內(nèi)容。
可以將GenericTrigger觸發(fā)條件分為5部分,這樣更易于理解各參數(shù)的作用。

  • 從HTTP POST請求中提取參數(shù)值。

  • token,GWT插件用于標(biāo)識Jenkins項目的唯一性。

  • 根據(jù)請求參數(shù)值判斷是否觸發(fā)Jenkins項目的執(zhí)行。

  • 日志打印控制。

  • Webhook響應(yīng)控制。

一個HTTP POST請求可以從三個維度提取參數(shù),即POST body、URL參數(shù)和header
GWT插件提供了三個參數(shù)分別對這三個維度的數(shù)據(jù)進行提取。

  1. genericVariables:提取POST body中的參數(shù)。

            genericVariables: [
                [key: 'ref', value: '$.ref'],
                [key: 'before',
                 value: '$.before',
                 expressionType: 'JSONPath',
                 regexpFilter: '',
                 defaultValue: ''
                ]
            ]
  • value:JSONPath表達式,或者XPath表達式,取決于expressionType參數(shù)值,用于從POST body中提取值。

  • key:從POST body中提取出的值的新變量名,可用于pipeline其他步驟。

  • expressionType:可選,value的表達式類型,默認(rèn)為JSONPath。當(dāng)請求為XML內(nèi)容時,必須指定XPath值。

  • defaultValue:可選,當(dāng)提取不到值,且defaultValue不為空時,則使用defaultValue作為返回值。

  • regexpFilter:可選,過濾表達式,對提取出來的值進行過濾。regexpFilter做的事情其實就是string.replaceAll(regexpFilter,"");。string是從HTTP請求中提取出來的值。

  1. genericRequestVariables:從URL參數(shù)中提取值。

            genericRequestVariables: [
                [key: 'requestWithNumber', regexpFilter: '[^0-9]'],
                [key: 'requestWithString', regexpFilter: '']
            ]
  • key:提取出的值的新變量名,可用于pipeline其他步驟。

  • regexpFilter:對提取出的值進行過濾。

  1. genericHeaderVariables:從HTTP header中提取值。

            genericHeaderVariables: [
                [key: 'headerWithNumber', regexpFilter: '[^0-9]'],
                [key: 'headerWithString', regexpFilter: '']
            ]

genericHeaderVariables的用法與genericRequestVariables一樣,區(qū)別是它是從HTTP header中提取值的。

根據(jù)請求參數(shù)值判斷是否觸發(fā)Jenkins項目執(zhí)行

GWT并不只是根據(jù)token值來判斷是否觸發(fā),還可以根據(jù)我們提取出的值進行判斷。示例如下:

        GenericTrigger(
            genericVariables: [
                [key: 'refValue', value: '$.ref'],
            ],

            token: env.JOB_NAME,

            regexpFilterText: '$refValue',
            regexpFilterExpression: 'refs/heads/(master|dev)'
        )
  • regexpFilterText:需要進行匹配的key。例子中,我們使用從POST body中提取出的refValue變量值。

  • regexpFilterExpression:正則表達式。
    如果regexpFilterText參數(shù)的值符合regexpFilterExpression參數(shù)的正則表達式,則觸發(fā)執(zhí)行。

控制打印內(nèi)容

打印日志有助于調(diào)試。GWT插件提供了三個參數(shù)。

  • printPostContent:布爾值,將Webhook請求信息打印到日志上。

  • printContributedVariables:布爾值,將提取后的變量名及變量值打印出來。

  • causeString:字符串類型,觸發(fā)原因,可以直接引用提取后的變量,如 causeString:'Triggered on $msg'

控制響應(yīng)

  • silentResponse:布爾類型,在正常情況下,當(dāng)Webhook請求成功后,GWT插件會返回HTTP 200狀態(tài)碼和觸發(fā)結(jié)果給調(diào)用方。但是當(dāng)silentResponse設(shè)置為true時,就只返回HTTP 200狀態(tài)碼,不返回觸發(fā)結(jié)果。

3. 開發(fā)推送代碼觸發(fā)jenkins構(gòu)建實戰(zhàn)

3.1 安裝Jenkins插件

  • GitLab

  • Git

3.2 創(chuàng)建項目

新建gitlab項目

Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

新建jenkins項目

Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

gltlab設(shè)置集成webhook
Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

webhook測試報錯
Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

以上報錯需要進行jenkins安裝設(shè)置,取消勾選“CSRF Protection”
Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

3.3 將構(gòu)建狀態(tài)信息推送到Gitlab

jenkins構(gòu)建項目后,可以將構(gòu)建的狀態(tài)信息推送到gitlab的pipeline中,并且點擊pipeline會自動跳轉(zhuǎn)到j(luò)enkins的構(gòu)建頁面下。

首先gitlab倉庫的管理帳戶下生成個人訪問token。

Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

然后在jenkins內(nèi),進入"Manage Jenkins" → "Configure System",頁面中找到“Gitlab”,并添加gitlab和token憑證信息。

Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

修改Jenkinsfile,如果jenkins中未觸發(fā)過任務(wù),第一次需要手動觸發(fā),以后gitlab內(nèi)代碼的修改會自動觸發(fā),并將運行結(jié)果提交到gitlab pipeline中。

完整的Jenkinsfile

pipeline {
    agent any
    triggers {
        gitlab(triggerOnPush: true,
            triggerOnMergeRequest: true,
            branchFilterType: "All",
            secretToken: "t8vcxwuza023ehzcftzr5a74vkpto6xr")
    }
    stages {
        stage('build') {
            steps {
                echo 'Hello World from gitlab trigger'
            }
        }
    }
    post {
        failure {
            updateGitlabCommitStatus name: "build", state: "failed"
        }
        success {
            updateGitlabCommitStatus name: "build", state: "success"
        }
    }
    options {
        gitLabConnection("gitlab")
    }
}

Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

gitlab倉庫的pipeline中可查看到構(gòu)建信息。
Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行

上述就是小編為大家分享的Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI