編輯推薦:
本文來自于IT界大神部落格,自從
Jenkins 2.0 版本更新之後,支援了通過代碼(Groovy DSL)來描述一個建構流水線,而在2016
Jenkins World 大會上釋出了1.2版本,本文将對比這兩種定義流水線的方式以及特性。
自從 Jenkins 2.0 版本更新之後,支援了通過代碼(Groovy
DSL)來描述一個建構流水線,靈活友善地實作持續傳遞,大大提升 Jenkins Job 維護的效率,實作從
CI 到 CD 到轉變。而在2016 Jenkins World 大會上,Jenkins 釋出了1.0版本的聲明式流水線
- Declarative Pipeline,目前已經到釋出了1.2版本,它是一種新的結構化方式定義一個流水線。今天我們一起對比這兩種定義流水線的方式以及特性。
Pipeline 特性 - Pipeline As Code
Jenkins 從根本上講是一種支援多種自動化模式的自動化引擎。Pipeline 為其添加了一套強大的自動化工具,支援從簡單的持續內建到全面的持續傳遞。Jenkins
Pipeline 特性如下:
代碼:Pipeline 以代碼的形式描述,通常存儲于源代碼控制系統,如 Git,使團隊能夠編輯,審查和疊代其流程定義。
持久性:Pipeline 可以在計劃和計劃外重新啟動 Jenkins Master 管理時不被影響。
可暫停:Pipeline 可以選擇停止并等待人工輸入或準許,然後再繼續 Pipeline 運作。
多功能:Pipeline 支援複雜的項目持續傳遞要求,包括并行分支/連接配接,循環和執行 Job 的能力。
可擴充:Pipeline 插件支援其 DSL 的自定義擴充以及與其他插件內建。
基于 Jenkins Pipeline,使用者可以在一個 JenkinsFile 中快速實作一個項目的從建構、測試以到釋出的完整流程,并且可以儲存這個流水線的定義。
下面的流程圖是在 Jenkins Pipeline 中模組化的一個持續傳遞方案的示例:
Pipeline 基本概念
Node: 一個 Node 就是一個 Jenkins 節點,或者是 Master,或者是 Agent,是執行
Step 的具體運作環境,Pipeline 執行中的大部分工作都是在一個或多個聲明 Node 步驟的上下文中完成的。
Stage: 一個 Pipeline 可以從邏輯上劃分為若幹個 Stage,每個 Stage 代表一組操作,如:Build、Test、Deploy。注意,Stage
是一個邏輯分組的概念,可以跨多個 Node。
Step: Step 是最基本的操作單元,小到執行一個 Shell 腳本,大到建構一個 Docker
鏡像,由各類 Jenkins Plugin 提供,當插件擴充Pipeline DSL 時,通常意味着插件已經實作了一個新的步驟。
另外在 Jenkins Pipeline 中定義的 Stage(各個階段的邏輯劃分),Jenkins
提供了 Stage View 插件,按照 Stage 邏輯劃分任務,對使用者透明化、可視化展示流水線的執行,如下圖:
Scripted Pipeline
上圖通過 Jenkinsfile 定義了流水線的各個階段(不僅限這幾個階段):建構,測試以及釋出,在每個階段可以執行相應的任務,而在
Scripted Pipeline 中,使用者可以使用 Groovy 文法腳本來自定義流程控制,如下:
CurrentBuild 可以擷取檔次執行的結果,可以用于判讀後續流程走向,Jenkins 還提供了更多内置環境變量以及
DSL 對象,友善我們操作流水線任務,如:BUILD_ID、JOB_NAME、BRANCH_NAME、CHANGE_ID
等等,可參考Global Variable。這種方式受 Jenkins 的限制較少,我們可以靈活控制和定義一個流水線,甚至我們可以在
JenkinsFile 中定義多個 Groovy 函數來擴充 Jenkins Pipeline 的能力。
Declarative Pipeline
同樣的,上圖定義了流水線的各個階段,Declarative Pipeline 這種方式受 Jenkins
限制較多,需使用預定義的結構。Jenkins 已經預置了很多描述流水線的結構,可以在沒有 Groovy
基礎上快速建立流水線,當然在 Declarative Pipeline 同樣支援寫 Groovy 腳本,但官方不推薦把腳本直接寫在流水線中,應該把這些邏輯定義在
Shared Libraries 中。
如下:
Declarative Pipeline 文法
下面介紹幾個重點 Declarative Pipeline 文法:
定義執行環境
通過 Agent 來定義 Pipeline 的執行環境,在每個 Pipeline,Agent
是必需存在的。Agent 也可以用 Label 指定具體的 Jenkins Slave Node,并且每個
Stage 可以單獨指定 Agent,靈活排程資源以及運作環境。
環境變量
可以定義為全局的,也可以為 Stage 來定義。
已定義的環境變量,可以通過 Env 來通路,與 Scripted Pipeline
一樣,可以通路 Jenkins 預置的環境變量。
參數
可以通過 Params 對象來通路建構時的參數。如:
流程控制
可以通過 When 文法控制流程走向,判斷環境變量或自定義表達式,是否執行某一個
Stage,同時 Anyof, Allof 進行邏輯運算,Anyof 對應或運算,Allof 對應與運算。
逾時、重試機制
資源的清理工作 & 結束後操作
使用 Post 來完成一些資源的清理工作。其和 Stages 平級:
清理結束階段也可以執行一個郵件通知:
并發 Stages
Declarative Pipeline 1.2 版本對并發文法做了更新:
其中 FailFast 可以控制如果并發的任務的其中一個失敗,立即結束流水線,執行清理結束任務。
總結
Scripted Pipeline 和 Declarative Pipeline 兩種流水線定義的主要差別在于文法和靈活性上,
Declarative Pipeline 文法要求更嚴,需使用 Jenkins 預定義的DSL 結構,使用簡單;
Scripted Pipeline 受限很少,限制主要在 Groovy 的結構和文法,大家可以根據個人或企業的情況選擇兩種方式,比如如果公司沒有
Groovy 技術棧,可以考慮直接使用 Declarative Pipeline, 學習曲線低,可以快速上手,并且新的
Blue Ocean Editor 插件可以幫助我們可視化的建立一個流水線,如果對 Groovy 非常熟悉,那
Scripted Pipeline 是一個不錯的選擇。