持續(xù)交付-Jenkinsfile 語(yǔ)法

實(shí)現(xiàn) Pipeline 功能的腳本語(yǔ)言叫做 Jenkinsfile,由 Groovy 語(yǔ)言實(shí)現(xiàn)询兴。Jenkinsfile 一般是放在項(xiàng)目根目錄捺球,隨項(xiàng)目一起受源代碼管理軟件控制滑潘,無(wú)需像創(chuàng)建"自由風(fēng)格"項(xiàng)目一樣,每次可能需要拷貝很多設(shè)置到新項(xiàng)目,提供了一些直接的好處:

  • Pipeline 上的代碼審查/迭代
  • Pipeline 的審計(jì)跟蹤
  • Pipeline 的唯一真實(shí)來源眉踱,可以由項(xiàng)目的多個(gè)成員查看和編輯
    Pipeline 支持:Declarative(在 Pipeline 2.5 中引入)和 Scripted Pipeline 兩種格式挤忙。兩者都支持建立 Pipeline,兩者都可以用于在 Web UI 中定義一個(gè)流水線 Jenkinsfile谈喳,將 Jenkinsfile 文件創(chuàng)建并檢查到源代碼控制庫(kù)中通常被認(rèn)為是最佳做法册烈。

Declared Pipeline

Declared Pipeline樹

Declared Pipeline 必須包含在固定格式 Pipeline {} 塊內(nèi),每個(gè)聲明語(yǔ)句必須獨(dú)立一行叁执,行尾無(wú)需使用分號(hào)茄厘。塊( blocks{} )只能包含章節(jié)(Sections),指令(Directives)谈宛,步驟(Steps)或賦值語(yǔ)句次哈。

塊 blocks{}

由大括號(hào)括起來的語(yǔ)句,如 Pipeline{}吆录,Section{}窑滞,parameters{},script{}

章節(jié)(Sections)

章節(jié)中通常包含一個(gè)或多個(gè)指令或步驟恢筝。如 agent 哀卫、post、stages撬槽、steps

指令(Directives)

environment此改、options、parameters侄柔、triggers(觸發(fā))共啃、stage、tools暂题、when

節(jié)點(diǎn)(agent)

必須存在移剪,agent 必須在 Pipeline 塊內(nèi)的頂層定義,但 stage 內(nèi)是否使用是可選的
參數(shù):any/none/label/node/docker/dockerfile
常用選項(xiàng) label/cuetomWorkspace/reuseNode
示例:

agent { label 'my-label' }

agent {
    node {
        label 'my-label'
        customWorkspace '/some/other/path'
    }
}

agent {
    docker {
        image 'nginx:1.12.2'
        label 'my-label'
        args '-v /tmp:/tmp'
    }
}

構(gòu)建后(post)

不是必須薪者,用于 Pipeline 的最外層或者 stage{} 中纵苛,主要用于表達(dá) Jenkins 完成構(gòu)建動(dòng)作之后需要做的事情。

示例:

pipeline {
    agent any
    stages {
        stage('Example'){
            steps {
                echo 'Hello world'
            }
        }
    }
    post {
        always {
            echo 'say goodbay'
        }
    }
}

階段集(stages)

必須存在言津,包括順序執(zhí)行的一個(gè)或多個(gè) stage 命令攻人,在 Pipeline 內(nèi)僅能使用一次,通常位于 agent/options 后面悬槽。

步驟(steps)

必須存在怀吻,steps 位于 stage 指令塊內(nèi)部,包括一個(gè)或多個(gè) step陷谱。僅有一個(gè) step 的情況下可以忽略關(guān)鍵字 step 及其{}烙博。

環(huán)境(environment)

不是必須瑟蜈,environment 定義了一組全局的環(huán)境變量鍵值對(duì),存在于 pipeline {} 或者 stage 指令內(nèi)渣窜。執(zhí)行特殊方法 credentials()可以獲取 Jenkins 中預(yù)定義的憑證明文內(nèi)容铺根。

示例:

environment {CC='clang'}
environment {AN_ACCESS_KEY = credentials('my-prefined-secret-text')}
steps {sh 'printenv'}

選項(xiàng)(options)

不是必須,預(yù)定義 Pipeline 專有的配置信息乔宿,僅可定義一次

示例:

pipeline {
    agent any
    options{
        timeout(time:1,unit: 'HOURS')
    }
}

參數(shù)(parameters)

不是必須位迂, 定義參數(shù)化構(gòu)建的參數(shù)可選參數(shù), 參數(shù)類型 booleanParam详瑞,choice掂林,file,text坝橡,password泻帮,run,string
示例:

parameters {
        string(name: 'PERSON', defaultValue: 'Jenkins', description: '輸入的文本參數(shù)')
        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
}

觸發(fā)器(rtiggers)

不是必須计寇,定義 Pipeline 被自動(dòng)觸發(fā)的方式選項(xiàng) cron锣杂、pollSCM、upstream

示例:

triggers {
       cron('0 8 * * 1-5')
}

Script Pipeline

Script Pipeline語(yǔ)句樹

一個(gè) Script Pipeline 可以劃分成若干個(gè) Stage番宁,每個(gè) Stage 代表一組操作元莫,例如 Build,Test蝶押;Node 代表 Jenkins 節(jié)點(diǎn)踱蠢,比如 Master, Slave 這樣的節(jié)點(diǎn);Step 是最基本的操作單元棋电,在對(duì)應(yīng) Node 節(jié)點(diǎn)上執(zhí)行的動(dòng)作語(yǔ)句直接寫在 node {} 中茎截。

image.png

流程控制語(yǔ)句

如同傳統(tǒng)的腳本語(yǔ)言一樣,Script Pipeline 是從上至下順序執(zhí)行离陶,可以使用 Groovy 表達(dá)式進(jìn)行流程控制稼虎,如 if/else 語(yǔ)句通過邏輯條件判斷來對(duì)流程進(jìn)行控制:

node {
    stage('Example') {
        if (env.BRANCH_NAME == 'master') {
            echo 'I only execute on the master branch'
        } else {
            echo 'I execute elsewhere'
        }
    }
}

異常處理語(yǔ)句

Script Pipeline 腳本流程控制的另一種方式是異常處理機(jī)制招刨。當(dāng)任何一個(gè)步驟因各種原因而出現(xiàn)異常時(shí),都必須在代碼中使用 try/catch/finally 語(yǔ)句塊進(jìn)行異常捕獲哀军,并通過預(yù)先設(shè)定代碼進(jìn)行處理沉眶,保證腳本能夠順利執(zhí)行:

stage('Error Handling') {
    node{
        echo "This is test demo for the error handling"

        try {

            echo "This is in the try block."

            sh 'exit 1'

        }catch (exc) {

            echo "Something failed, I'm in the catch block."

        }finally {

            echo "Finally, I'm in the finally block."

        }
    }
}

Jenkinsfile 中調(diào)用plugin功能

在 Jenkinsfile 中除了可以使用常規(guī)的邏輯、流程控制杉适,還可以調(diào)用 Jenkins 的插件功能谎倔。下面用如下實(shí)例進(jìn)行說明。

Email Extension插件

Email Extension 是 Jenkins 中的一個(gè)外部插件猿推,用來發(fā)送郵件片习,從 Jenkins 的 Plugin Manager 中進(jìn)行安裝捌肴。在 Pipeline 中通過代碼調(diào)用可以觸發(fā)該插件的運(yùn)行,實(shí)現(xiàn)發(fā)送郵件的功能藕咏。

基礎(chǔ)配置

在安裝好 Email Extension 插件之后状知,首先需要選擇一個(gè)準(zhǔn)備用來發(fā)送 Jenkins 通知郵件的郵箱,發(fā)件郵箱的具體參數(shù)要提前知曉(通常參數(shù)可以從郵箱的配置參數(shù)信息頁(yè)面上查到)孽查;之后要在 Manage Jenkins -> Configure System 中將對(duì)應(yīng)參數(shù)填寫該插件的對(duì)應(yīng)配置項(xiàng)中饥悴,必須配置的參數(shù)如下:

  • SMTP server:smtp 服務(wù)地址
  • SMTP port:smtp 端口號(hào)
  • Use SMTP Authentication:?jiǎn)⒂?smtp 安全校驗(yàn)
  • User Name:發(fā)件人用戶名
  • Password:發(fā)件人密碼
  • Default Recipients:默認(rèn)收件人
    其他的參數(shù)可以根據(jù)自己的需要進(jìn)行配置,Email Extension 配置參考截圖如下:
image.png

Pipeline代碼

pipeline{
    agent {
        label 'master'
    }
    stages{
        stage('發(fā)送郵件測(cè)試') {
            steps{
                echo 'Test Email'
            }
        }
    }
    post {
        always {
            emailext body: '$DEFAULT_CONTENT', recipientProviders: [[$class: 'RequesterRecipientProvider']], subject: '$DEFAULT_SUBJECT'
        }
    }
}

Declared Pipeline 的入門學(xué)習(xí)難度相對(duì)不高盲再,這種類似我們?cè)谧鲎詣?dòng)化測(cè)試時(shí)所接觸的關(guān)鍵字驅(qū)動(dòng)模式西设,只要理解其定義好的關(guān)鍵詞,按要求填充數(shù)據(jù)即可答朋。
雖然這種方式入門容易贷揽,但靈活性欠缺。相比之下 script Pipeline 的好處就是靈活梦碗,好封裝擒滑,易于大規(guī)模使用,但需要有一定的編程功底叉弦。

更多技術(shù)文章

喜歡軟件測(cè)試的小伙伴們丐一,如果我的博客對(duì)你有幫助、如果你喜歡我的博客內(nèi)容淹冰,請(qǐng) “點(diǎn)贊” “評(píng)論” “收藏” 一鍵三連哦库车!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市樱拴,隨后出現(xiàn)的幾起案子柠衍,更是在濱河造成了極大的恐慌,老刑警劉巖晶乔,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珍坊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡正罢,警方通過查閱死者的電腦和手機(jī)阵漏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翻具,“玉大人履怯,你說我怎么就攤上這事●捎荆” “怎么了叹洲?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)工禾。 經(jīng)常有香客問我运提,道長(zhǎng)蝗柔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任民泵,我火速辦了婚禮诫咱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘洪灯。我一直安慰自己坎缭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布签钩。 她就那樣靜靜地躺著掏呼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铅檩。 梳的紋絲不亂的頭發(fā)上憎夷,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音昧旨,去河邊找鬼拾给。 笑死,一個(gè)胖子當(dāng)著我的面吹牛兔沃,可吹牛的內(nèi)容都是我干的蒋得。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼乒疏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼额衙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起怕吴,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤窍侧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后转绷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伟件,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年议经,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斧账。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡爸业,死狀恐怖其骄,靈堂內(nèi)的尸體忽然破棺而出亏镰,到底是詐尸還是另有隱情扯旷,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布索抓,位于F島的核電站钧忽,受9級(jí)特大地震影響毯炮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耸黑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一桃煎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧大刊,春花似錦为迈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至伴郁,卻和暖如春耿战,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焊傅。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工剂陡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狐胎。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓鸭栖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親握巢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纤泵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容