這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)專注于烏拉特前企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城網(wǎng)站開發(fā)。烏拉特前網(wǎng)站建設(shè)公司,為烏拉特前等地區(qū)提供建站服務(wù)。全流程按需定制,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
時間觸發(fā)是指定義一個時間,時間到了就觸發(fā)pipeline執(zhí)行。在Jenkins pipeline中使用trigger指令來定義時間觸發(fā)。
trigger指令只能被定義在pipeline塊下,Jenkins內(nèi)置支持cron、pollSCM,upstream三種方式。其他方式可以通過插件來實(shí)現(xiàn)。
定時執(zhí)行就像cronjob,一到時間點(diǎn)就執(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 個半夜零點(diǎn)(0 0 * * *
)執(zhí)行的任務(wù)。這樣會產(chǎn)生負(fù)載不均衡。在Jenkins trigger cron語法中使用“H”字符來解決這一問題,H代表hash。對于沒必要準(zhǔn)確到零點(diǎn)0分執(zhí)行的任務(wù),cron可以這樣寫:H 0 * * *
,代表在零點(diǎn)0分至,H代表hash。代表在零點(diǎn)0分至零點(diǎn)59分之間任何一個時間點(diǎn)執(zhí)行。
需要注意的是,H應(yīng)用在DOM(一個月的某一天)字段時會有不準(zhǔn)確的情況,因?yàn)?0月有31天,而2月卻是28天。
Jenkins trigger cron還設(shè)計了一些人性化的別名:@yearly
、@annually
、@monthly
、@weekly
、@daily
、@midnight
和@hourly
。例如,@hourly
與H * * * *
相同,代表一小時內(nèi)的任何時間;@midnight
實(shí)際上代表在半夜12:00到凌晨2:59之間的某個時間。其他別名很少有應(yīng)用場景。
輪詢代碼倉庫是指定期到代碼倉庫詢問代碼是否有變化,如果有變化就執(zhí)行。
pipeline { agent any triggers { // 每分鐘判斷一次代碼是否有變化 pollSCM("H/1 * * * *") } }
事實(shí)上,如果代碼有變化,最好的方式是代碼倉庫主動通知Jenkins,而不是Jenkins頻繁去代碼倉庫檢查。那這種方式存在的意義是什么?
在一些特殊情況下,比如外網(wǎng)的代碼倉庫無法調(diào)用內(nèi)網(wǎng)的Jenkins,或者反過來,則會采用這種方式。
事件觸發(fā)就是發(fā)生了某個事件就觸發(fā)pipeline執(zhí)行。這個事件可以是你能想到的任何事件。比如手動在界面上觸發(fā)、其他Job主動觸發(fā)、HTTP API Webhook觸發(fā)等。
當(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指令才會生效。
GitLab通知觸發(fā)是指當(dāng)GitLab發(fā)現(xiàn)源代碼有變化時,觸發(fā)Jenkins執(zhí)行構(gòu)建。
由GitLab主動通知進(jìn)行構(gòu)建的好處是顯而易見的,這樣很容易就解決了我們之前提到的輪詢代碼倉庫時“多久輪詢一次”的問題,實(shí)現(xiàn)每一次代碼的變化都對應(yīng)一次構(gòu)建。
GitLab插件上實(shí)現(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使用隨機(jī)字符串生成器生成即可。如果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ā)。必選,否則無法實(shí)現(xiàn)觸發(fā)。可以設(shè)置的值有:
NameBasedFilter
:基于分支名進(jìn)行過濾,多個分支名使用逗號分隔。
RegexBasedFilter
:基于正則表達(dá)對分支名進(jìn)行過濾。
All:所有分支都會被觸發(fā)。
includeBranchesSpec
:基于branchFilterType值,輸入期望包括的分支的規(guī)則。
excludeBranchesSpec
:基于branchFilterType值,輸入期望排除的分支的規(guī)則。
安裝 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
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ù)進(jìn)行提取。
genericVariables:提取POST body中的參數(shù)。
genericVariables: [ [key: 'ref', value: '$.ref'], [key: 'before', value: '$.before', expressionType: 'JSONPath', regexpFilter: '', defaultValue: '' ] ]
value
:JSONPath表達(dá)式,或者XPath表達(dá)式,取決于expressionType
參數(shù)值,用于從POST body中提取值。
key
:從POST body中提取出的值的新變量名,可用于pipeline其他步驟。
expressionType
:可選,value
的表達(dá)式類型,默認(rèn)為JSONPath
。當(dāng)請求為XML內(nèi)容時,必須指定XPath值。
defaultValue
:可選,當(dāng)提取不到值,且defaultValue
不為空時,則使用defaultValue
作為返回值。
regexpFilter
:可選,過濾表達(dá)式,對提取出來的值進(jìn)行過濾。regexpFilter
做的事情其實(shí)就是string.replaceAll(regexpFilter,"")
;。string
是從HTTP請求中提取出來的值。
genericRequestVariables
:從URL參數(shù)中提取值。
genericRequestVariables: [ [key: 'requestWithNumber', regexpFilter: '[^0-9]'], [key: 'requestWithString', regexpFilter: ''] ]
key
:提取出的值的新變量名,可用于pipeline其他步驟。
regexpFilter
:對提取出的值進(jìn)行過濾。
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ù)我們提取出的值進(jìn)行判斷。示例如下:
GenericTrigger( genericVariables: [ [key: 'refValue', value: '$.ref'], ], token: env.JOB_NAME, regexpFilterText: '$refValue', regexpFilterExpression: 'refs/heads/(master|dev)' )
regexpFilterText
:需要進(jìn)行匹配的key。例子中,我們使用從POST body中提取出的refValue
變量值。
regexpFilterExpression
:正則表達(dá)式。
如果regexpFilterText
參數(shù)的值符合regexpFilterExpression
參數(shù)的正則表達(dá)式,則觸發(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é)果。
GitLab
Git
新建gitlab項目
新建jenkins項目
gltlab設(shè)置集成webhook
webhook測試報錯
以上報錯需要進(jìn)行jenkins安裝設(shè)置,取消勾選“CSRF Protection”
jenkins構(gòu)建項目后,可以將構(gòu)建的狀態(tài)信息推送到gitlab的pipeline中,并且點(diǎn)擊pipeline會自動跳轉(zhuǎn)到j(luò)enkins的構(gòu)建頁面下。
首先gitlab倉庫的管理帳戶下生成個人訪問token。
然后在jenkins內(nèi),進(jìn)入"Manage Jenkins" → "Configure System",頁面中找到“Gitlab”,并添加gitlab和token憑證信息。
修改Jenkinsfile
,如果jenkins中未觸發(fā)過任務(wù),第一次需要手動觸發(fā),以后gitlab內(nèi)代碼的修改會自動觸發(fā),并將運(yùn)行結(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") } }
gitlab倉庫的pipeline中可查看到構(gòu)建信息。
上述就是小編為大家分享的Jenkins 2.x中如何觸發(fā)Pipeline執(zhí)行了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
當(dāng)前文章:Jenkins2.x中如何觸發(fā)Pipeline執(zhí)行
標(biāo)題路徑:http://bm7419.com/article42/jdephc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計公司、全網(wǎng)營銷推廣、網(wǎng)站策劃、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)