Jenkins Pipeline語法(下)

Jenkins Pipeline語法(上)
Jenkins Pipeline語法(中)
Jenkins Pipeline語法(下)

順序執(zhí)行的stage(Sequential Stages)

聲明性Pipeline中的stage可以按順序聲明待運行的stage列表茎芭。需要注意的是一個stage有且只能有一個 steps裹赴,parallel或者stages涤姊,stages是順序執(zhí)行的。stage內的stage無法進一步含有parallelstages ,但他們允許使用stage的所有其他功能,包括 agenttools缭保,when等等。

pipeline {
    agent none
    stages {
        stage('Non-Sequential Stage') {
            agent {
                label 'for-non-sequential'
            }
            steps {
                echo "On Non-Sequential Stage"
            }
        }
        stage('Sequential') {
            agent {
                label 'for-sequential'
            }
            environment {
                FOR_SEQUENTIAL = "some-value"
            }
            stages {
               stage('In Sequential 1') {
                   steps {
                       echo "In Sequential 1"
                   }
               }
               stage('In Sequential 2') {
                   steps {
                       echo "In Sequential 2"
                   }
               }
            }
        }
    }
}

并行的stage(Parallel)

聲明性Parallel中的stage可以在parallel塊中聲明多個嵌套stage蝙茶,這些stage將并行執(zhí)行艺骂。需要注意的是一個stage有且只能有一個stepsstagesparallel隆夯。嵌套的stages本身不能包含其他parallelstage钳恕,但在其他方面的行為與stage相同,包括順序執(zhí)行的stage列表stages吮廉。任何包含parallel的stage都不能包含agent或者tools苞尝,因為那些和steps沒有關系。

此外宦芦,您可以通過添加failFast true到包含parallelstage中宙址,使得其中一個失敗時中止所有parallel內的stage

pipeline {
    agent any
    stages {
        stage('Non-Parallel Stage') {
            steps {
                echo 'This stage will be executed first.'
            }
        }
        stage('Parallel Stage') {
            when {
                branch 'master'
            }
            failFast true
            parallel {
                stage('Branch A') {
                    agent {
                        label "for-branch-a"
                    }
                    steps {
                        echo "On Branch A"
                    }
                }
                stage('Branch B') {
                    agent {
                        label "for-branch-b"
                    }
                    steps {
                        echo "On Branch B"
                    }
                }
                stage('Branch C') {
                    agent {
                        label "for-branch-c"
                    }
                    stages {
                        stage('Nested 1') {
                            steps {
                                echo "In stage Nested 1 within Branch C"
                            }
                        }
                        stage('Nested 2') {
                            steps {
                                echo "In stage Nested 2 within Branch C"
                            }
                        }
                    }
                }
            }
        }
    }
}

步驟 Steps

聲明性Pipeline可以使用“ Pipeline步驟”引用中記錄的所有可用步驟 调卑,其中包含一個完整的步驟列表抡砂,并附加以下列出的步驟,僅在聲明性Pipeline中支持恬涧。

腳本 script

script步驟需要一個script Pipeline注益,并在聲明性Pipeline中執(zhí)行。對于大多數(shù)場景溯捆,聲明Pipeline中的script步驟不是必須的丑搔,但它可以提供一個有用的“escape hatch”。量大的或者復雜的script塊應該轉移到共享庫中提揍。

例如:
Jenkinsfile (Declarative Pipeline)
pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'

                script {
                    def browsers = ['chrome', 'firefox']
                    for (int i = 0; i < browsers.size(); ++i) {
                        echo "Testing the ${browsers[i]} browser"
                    }
                }
            }
        }
    }
}

Scripted Pipeline

Scripted Pipeline啤月,如聲明式Pipeline,構建在底層Pipeline子系統(tǒng)之上劳跃。不像聲明式Pipeline谎仲,Scripted Pipeline是一個基于Groovy構建的,通用刨仑、高效的DSL郑诺。由Groovy語言提供的大多數(shù)功能都提供給Scripted Pipeline的用戶,這意味著它是一個非常富有表現(xiàn)力和靈活性的工具杉武,可以通過這些工具來創(chuàng)建持續(xù)構建的Pipeline辙诞。

Flow Control

Scripted Pipeline從頂部順序執(zhí)行,與Jenkinsfile Groovy或其他語言中的大多數(shù)傳統(tǒng)Scripted一樣艺智。因此倘要,提供流量控制取決于Groovy表達式,例如 if/else條件,例如:

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

可以管理Scripted Pipeline流控制的另一種方式是使用Groovy的異常處理支持封拧。當步驟由于任何原因而導致異常時志鹃。處理錯誤行為必須使用Groovy 中的try/catch/finally塊,例如:

Jenkinsfile (Scripted Pipeline)
node {
    stage('Example') {
        try {
            sh 'exit 1'
        }
        catch (exc) {
            echo 'Something failed, I should sound the klaxons!'
            throw
        }
    }
}

Steps

如“ 入門指南 ”所述泽西,Pipeline最基本的部分是“步驟”曹铃。從根本上說,步驟告訴Jenkins 要做什么捧杉,并且作為Declarative和Scripted Pipeline語法的基本構建塊陕见。

Scripted Pipeline并沒有介紹這是專門針對它的語法的任何步驟; Pipeline步驟參考 ,其中包含Pipeline和插件提供的完整步驟列表味抖。

與Groovy的區(qū)別

為了提供持久性(運行中的Pipeline可以在重新啟動Jenkins主站后保留)评甜,Scripted Pipeline必須將數(shù)據(jù)序列化到master節(jié)點。由于這個設計要求仔涩,一些Groovy語法如collection.each { item -> /* perform operation */ }沒有完全支持忍坷。有關 更多信息,請參見 JENKINS-27421JENKINS-26481熔脂。

語法比較

當Jenkins Pipeline首次創(chuàng)建時佩研,Groovy被選為執(zhí)行引擎。Jenkins已經使用嵌入式Groovy引擎很長時間霞揉,為管理員和用戶提供高級腳本功能旬薯。此外,Jenkins Pipeline的實現(xiàn)者發(fā)現(xiàn)Groovy是建立“Scripted Pipeline”DSL的堅實基礎适秩。

由于它是一個功能齊全的編程環(huán)境绊序,Scripted Pipeline為Jenkins用戶提供了極大的靈活性和可擴展性。Groovy學習曲線通常不適用于給定團隊的所有成員秽荞,因此政模,創(chuàng)建聲明性Pipeline是為了創(chuàng)作Jenkins Pipeline提供一個更簡單和更有見解的語法。

兩者基本上是底層相同的Pipeline 子系統(tǒng)蚂会。它們都是“Pipeline代碼”的持久實現(xiàn)。他們都能夠使用Pipeline內置的插件或插件提供的步驟耗式。兩者都可以利用共享庫

不同之處在于語法和靈活性胁住。聲明性限制了用戶具有更嚴格和預定義結構的可用性,使其成為更簡單連續(xù)輸送Pipeline的理想選擇刊咳。腳本化提供了極少的限制彪见,因為Groovy本身只能對結構和語法進行限制,而不是任何Pipeline專用系統(tǒng)娱挨,使其成為高級用戶和具有更復雜要求的用戶的理想選擇余指。顧名思義,Declarative Pipeline鼓勵聲明式編程模型。 盡管Scripted Pipeline遵循更命令性的編程模型酵镜。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末碉碉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子淮韭,更是在濱河造成了極大的恐慌垢粮,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靠粪,死亡現(xiàn)場離奇詭異蜡吧,居然都是意外死亡,警方通過查閱死者的電腦和手機占键,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門昔善,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人畔乙,你說我怎么就攤上這事君仆。” “怎么了啸澡?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵袖订,是天一觀的道長。 經常有香客問我嗅虏,道長洛姑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任皮服,我火速辦了婚禮楞艾,結果婚禮上,老公的妹妹穿的比我還像新娘龄广。我一直安慰自己硫眯,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布择同。 她就那樣靜靜地躺著两入,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敲才。 梳的紋絲不亂的頭發(fā)上裹纳,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音紧武,去河邊找鬼剃氧。 笑死,一個胖子當著我的面吹牛阻星,可吹牛的內容都是我干的朋鞍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滥酥!你這毒婦竟也來了更舞?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤恨狈,失蹤者是張志新(化名)和其女友劉穎疏哗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禾怠,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡返奉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吗氏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芽偏。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖弦讽,靈堂內的尸體忽然破棺而出污尉,到底是詐尸還是另有隱情,我是刑警寧澤往产,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布被碗,位于F島的核電站,受9級特大地震影響仿村,放射性物質發(fā)生泄漏锐朴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一蔼囊、第九天 我趴在偏房一處隱蔽的房頂上張望焚志。 院中可真熱鬧,春花似錦畏鼓、人聲如沸酱酬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膳沽。三九已至,卻和暖如春让禀,著一層夾襖步出監(jiān)牢的瞬間贵少,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工堆缘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人普碎。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓吼肥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缀皱,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容