JenkinsFile可以通過兩種語法來聲明流水線結構,一種是聲明式語法,另一種是腳本式語法。
腳本式語法以Groovy語言為基礎,語法結構同Groovy相同。
由于Groovy學習不適合所有初學者,所以Jenkins團隊為編寫Jenkins流水線提供一種更簡單、更有主見的語法-聲明式。
兩者本質上是相同的流水線子系統。即他們都是 “流水線即代碼” 的持久實現,都能夠使用構建到流水線中或插件提供的步驟,都能夠使用 共享庫
但是它們的區別在于語法和靈活性。聲明式限制了用戶使用更嚴格和預定義的結構, 但是略顯繁瑣。腳本化提供了很少的限制, 以至于對腳本和語法的唯一限制往往是由Groovy子集本身定義的,而不是任何特定于流水線的系統, 這也使得腳本式語法成為高級用戶和那些有更復雜需求的人的理想選擇。
腳本式語法
流水線腳本結構
node{
stage('Build'){
checkout scm
echo 'start build'
}
stage('Test'){
echo 'start test'
}
stage('Deploy'){
echo 'start deploy'
}
}
Node(節點): 一個 Node 就是一個 Jenkins 節點,或者是 Master,或者是 Agent,是執行 Step 的具體運行環境,Pipeline 執行中的大部分工作都是在一個或多個聲明 Node 步驟的上下文中完成的。如果不指定參數,則默認在master節點運行job
Stage(環節): 一個 Pipeline 可以從邏輯上劃分為若干個 Stage,每個 Stage 代表一組操作,如:Build、Test、Deploy。注意,Stage 是一個邏輯分組的概念,可以跨多個 Node。即,一個stage語句塊可以包含node,表示不同的節點執行響應的任務步驟。
Step(步驟): Step 是最基本的操作單元,小到執行一個 Shell 腳本,大到構建一個 Docker 鏡像,由各類 Jenkins 插件提供,當插件擴展Pipeline DSL 時,通常意味著插件已經實現了一個新的步驟。
另外在 Jenkins Pipeline 中定義的 Stage(各個階段的邏輯劃分),Jenkins 提供了 Stage View 插件,按照 Stage 邏輯劃分任務,對用戶透明化、可視化展示流水線的執行,如下圖:
基本語法
腳本式語法遵從Groovy腳本語言設計,常見的Groovy語法都可以用到流水線腳本中
內置函數
有很多特殊的Step用于pipeline腳本中,如前面提到的node或stage。下面列出一些在你當前插件集合中所有可以用到的step。其他插件提供的pipeline集成功能可以通過更新插件做到。
通常Step 的參數是以鍵值對形式傳遞的,但是如果此步驟只有一個必填參數,那么可以省略參數名,如:
readFile 'build.properties'
是下面這種方式的簡寫
readFile file: 'build.properties'
但是如果有多個必填參數,那么參數名必須指定:
readFile file: 'build.properties', encoding: 'ISO-8859-1'
參數直接用逗號隔開
許多步驟的參數會用到復雜的嵌套配置(一些嵌套配置對象反過來有對象類型的參數),下面列出三種方式指定嵌套對象,按照優先級排列。
1.一些配置對象定義自定義符號。這些用于表示步進調用的符號,或者使用命名參數映射的其他函數調用:
splitTests count(3)
或拼出強制性參數名稱:
splitTests parallelism: count(size: 3)
與使用舊的第二語法選項的等效項比較:
splitTests parallelism: [$class: 'CountDrivenParallelism', size: 3]
委托給單個對象的某些Pipeline步驟允許在明確的情況下省略實際的步驟名稱,因此您可以簡單地編寫:
archiveArtifacts '**.txt'
而不是:
step([$class: 'ArtifactArchiver', artifacts: '**.txt'])
嵌套配置是一個實際值,可以保存到變量等中:
def parallelism(deterministic) {
deterministic ? count(3) : time(15)
}
splitTests parallelism(true)
2.使用參數的鍵值對。可以省略默認值。(注意,這[1, 2, 3]是Groovy中的列表,而是[a: 1, b: 2, c: 3]字典。)
特殊映射鍵 c l a s s 用于表示所請求對象的簡單或(必要時)完全限定類名。如果包含的參數只允許一種嵌套對象(或列表),則 class用于表示所請求對象的簡單或(必要時)完全限定類名。如果包含的參數只允許一種嵌套對象(或列表),則 class用于表示所請求對象的簡單或(必要時)完全限定類名。如果包含的參數只允許一種嵌套對象(或列表),則class可以省略:
checkout([$class: 'GitSCM', userRemoteConfigs: [[url: 'git://…'], extensions: [[$class: 'CleanBeforeCheckout']]])
在這個例子中,GitSCM必須指定來區分的種類SCM所使用的delegate的checkout (單強制參數名稱delegate可省略);
并且CleanBeforeCheckout必須被指定來區分不同類別的GitSCMExtension由所使用extensions的GitSCM-a“異質”列表;
但$class: 'UserRemoteConfig’由于可以省略userRemoteConfigs的GitSCM被定義為只包含UserRemoteConfigS-它是一個“均勻的”列表。(在第一種語法中,同類列表不允許有這樣的遺漏。)
請注意,如果給出單個參數,省略名稱,并且該參數是映射,則必須將其括在括號中以避免語法歧義。
3使用Java對象:
import hudson.plugins.git。*
import hudson.plugins.git.extensions.impl。*
checkout(new GitSCM([new UserRemoteConfig('git:// ...',null,null,null)],null,false,[],null,null,[new CleanBeforeCheckout()]))
除了細節程度更深入Groovy語法,這些腳本如果沒有簽名批準通過則無法在Groovy沙箱中運行,這使得此模式在典型的安全Jenkins中無法運行。
代碼生成器
在流水線任務的主頁面有一個pipeline語法菜單,點擊進入可以生成常用的語法
選擇下拉框里面的示例步驟,可以選擇你需要的step,如讀取文件,填入相關參數點擊生成流水線腳本,再把生成的流水腳本復制到你的pipeline腳本中即可。
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
這些資料,對于【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴上萬個測試工程師們走過最艱難的路程,希望也能幫助到你!?