天天看點

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

編輯推薦:

本文來自于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 中模組化的一個持續傳遞方案的示例:

jenkins pipeline腳本_用代碼描述流水線-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 邏輯劃分任務,對使用者透明化、可視化展示流水線的執行,如下圖:

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

Scripted Pipeline

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

上圖通過 Jenkinsfile 定義了流水線的各個階段(不僅限這幾個階段):建構,測試以及釋出,在每個階段可以執行相應的任務,而在

Scripted Pipeline 中,使用者可以使用 Groovy 文法腳本來自定義流程控制,如下:

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

CurrentBuild 可以擷取檔次執行的結果,可以用于判讀後續流程走向,Jenkins 還提供了更多内置環境變量以及

DSL 對象,友善我們操作流水線任務,如:BUILD_ID、JOB_NAME、BRANCH_NAME、CHANGE_ID

等等,可參考Global Variable。這種方式受 Jenkins 的限制較少,我們可以靈活控制和定義一個流水線,甚至我們可以在

JenkinsFile 中定義多個 Groovy 函數來擴充 Jenkins Pipeline 的能力。

Declarative Pipeline

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

同樣的,上圖定義了流水線的各個階段,Declarative Pipeline 這種方式受 Jenkins

限制較多,需使用預定義的結構。Jenkins 已經預置了很多描述流水線的結構,可以在沒有 Groovy

基礎上快速建立流水線,當然在 Declarative Pipeline 同樣支援寫 Groovy 腳本,但官方不推薦把腳本直接寫在流水線中,應該把這些邏輯定義在

Shared Libraries 中。

如下:

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

Declarative Pipeline 文法

下面介紹幾個重點 Declarative Pipeline 文法:

定義執行環境

通過 Agent 來定義 Pipeline 的執行環境,在每個 Pipeline,Agent

是必需存在的。Agent 也可以用 Label 指定具體的 Jenkins Slave Node,并且每個

Stage 可以單獨指定 Agent,靈活排程資源以及運作環境。

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

環境變量

可以定義為全局的,也可以為 Stage 來定義。

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

已定義的環境變量,可以通過 Env 來通路,與 Scripted Pipeline

一樣,可以通路 Jenkins 預置的環境變量。

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

參數

可以通過 Params 對象來通路建構時的參數。如:

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

流程控制

可以通過 When 文法控制流程走向,判斷環境變量或自定義表達式,是否執行某一個

Stage,同時 Anyof, Allof 進行邏輯運算,Anyof 對應或運算,Allof 對應與運算。

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

逾時、重試機制

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

資源的清理工作 & 結束後操作

使用 Post 來完成一些資源的清理工作。其和 Stages 平級:

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

清理結束階段也可以執行一個郵件通知:

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

并發 Stages

Declarative Pipeline 1.2 版本對并發文法做了更新:

jenkins pipeline腳本_用代碼描述流水線-Jenkins Pipeline 詳解-內建建構

其中 FailFast 可以控制如果并發的任務的其中一個失敗,立即結束流水線,執行清理結束任務。

總結

Scripted Pipeline 和 Declarative Pipeline 兩種流水線定義的主要差別在于文法和靈活性上,

Declarative Pipeline 文法要求更嚴,需使用 Jenkins 預定義的DSL 結構,使用簡單;

Scripted Pipeline 受限很少,限制主要在 Groovy 的結構和文法,大家可以根據個人或企業的情況選擇兩種方式,比如如果公司沒有

Groovy 技術棧,可以考慮直接使用 Declarative Pipeline, 學習曲線低,可以快速上手,并且新的

Blue Ocean Editor 插件可以幫助我們可視化的建立一個流水線,如果對 Groovy 非常熟悉,那

Scripted Pipeline 是一個不錯的選擇。