Jenkins是DevOps 技術(shù)棧的核心之一,CI/CD離不開編寫 Pipeline 腳本,Jenkins pipeline 分聲明式(Declarative)和腳本式(imperative)。在這里我會對二者的區(qū)別進行詳細講解!因為關(guān)于pipeline語法的詳細內(nèi)容,官網(wǎng)已經(jīng)做了詳盡地描述,所以在這里我就不在針對基礎(chǔ)語法知識進行介紹了,大家可以參考:
https://www.jenkins.io/doc/book/pipeline/syntax/
聲明式Pipline script
聲明式pipeline是官方主推的腳本,Pipline script Hello world語法如下:
pipeline {
???agent any
???stages {
???????stage('Hello') {
???????????steps {
??????????????? echo 'Hello World'
???????????}
???????}
??? }
}
關(guān)于聲明式Pipeline,結(jié)合上述實例,概要介紹如下:
在聲明式Pipeline中的基本語句和表達式遵循Groovy的語法;
流水線頂層必須pipeline{};
agent any可以在任何可用的節(jié)點上執(zhí)行pipeline;
stages包含一系列一個或多個stage 指令, 建議 stages 至少包含一個 stage 指令用于連續(xù)交付過程的每個離散部分,比如構(gòu)建, 測試, 和部署;
steps是每個階段中要執(zhí)行的每個步驟。
腳本化Pipeline script
腳本化流水線, 與聲明式一樣的是, 是建立在底層流水線的子系統(tǒng)上的。與聲明式不同的是, 腳本化流水線實際上是由 Groovy構(gòu)建的通用 DSL 。 Groovy 語言提供的大部分功能都可以用于腳本化流水線的用戶。
node {
???stage('Hello') {
???????????echo 'Hello World!'
??? }
}
腳本化pipeline 頂層是node{};
支持stage;
可以直接使用groovy語言進行編碼
二者的選擇
那么為什么兩種實現(xiàn)pipeline的方式呢?我們可以簡單的了解一下其發(fā)展的歷史。Jenkins是使用Java實現(xiàn)的,所以在很早的時候就引入了groovy作為DSL,管理員可以使用groovy來實現(xiàn)一些自動化和高級的管理功能。因為groovy引擎已經(jīng)集成到Jenkins,所以在pipeline一開始很自然就使用groovy來編寫Jenkinsfile。但是groovy畢竟是一種語言,對于沒有太多編程經(jīng)驗的小白學(xué)習(xí)成本有些高,這個時候聲明式的pipeline就出現(xiàn)了,主要是為了降低入門的難度,二者主要區(qū)別如下:
聲明式pipeline,官方鼓勵聲明式編程模型,比較適合沒有編程經(jīng)驗的初學(xué)者。
腳本式pipeline,是基于groovy的DSL語言實現(xiàn)的,為Jenkins用戶提供了大量的靈活性性和可擴展性,如果腳本中有大量的邏輯處理則推薦使用。
個人總結(jié)二者的主要區(qū)別有兩點:
1. 腳本式pipeline只支持stage,像stages 、steps更細致的階段劃分則不支持;
2.當我們需要在腳本中寫復(fù)雜邏輯的時候,通過腳本式pipeline可以方便的編寫腳本,例如需要加入循環(huán)的邏輯,使用腳本式pipeline,簡單實現(xiàn)如下:
node {
???stage('Hello') {
??????for(int i=0;i<3;i++){
????????????println i
????????????println 'Hello World!'
??????}
??? }
}
聲明式pipeline 使用循環(huán)則需要使用script { for()},代碼如下:
pipeline {
???agent any
???stages {
???????stage('Hello') {
??????????????? steps {
??????????????????? script {????????????
??????????????????? for (int i = 0; i < 3;i++) {
??????????????????????? println i?????
??????????????????????? println 'Hello World'
????????????????????? }
???????????????????}
???????}
????}
? }
}