Jenkins Pipeline語法(上)
Jenkins Pipeline語法(中)
Jenkins Pipeline語法(下)
順序執(zhí)行的stage(Sequential Stages)
聲明性Pipeline中的stage
可以按順序聲明待運行的stage
列表茎芭。需要注意的是一個stage
有且只能有一個 steps
裹赴,parallel
或者stages
涤姊,stages
是順序執(zhí)行的。stage
內的stage無法進一步含有parallel
或stages
,但他們允許使用stage
的所有其他功能,包括 agent
,tools
缭保,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有且只能有一個steps
,stages
或parallel
隆夯。嵌套的stages本身不能包含其他parallel
stage钳恕,但在其他方面的行為與stage
相同,包括順序執(zhí)行的stage列表stages
吮廉。任何包含parallel
的stage都不能包含agent
或者tools
苞尝,因為那些和steps
沒有關系。
此外宦芦,您可以通過添加failFast true
到包含parallel
的stage
中宙址,使得其中一個失敗時中止所有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-27421和 JENKINS-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遵循更命令性的編程模型酵镜。