Jenkins - 共享庫(Shared Libraries)
1 - 由來與演進
在Jenkins 1.x中,對於job的配置大多是基於圖形介面的,也就是說,要在GUI頁面手動設定相關的job引數。
隨著不同型別和用途的job越來越多,引數越來越複雜,難以有效地管理數量龐大的圖形介面配置資訊,也無法有效追蹤和記錄配置的更改。
在Jenkins 2.0中,基於Pipeline,使用者可以在一個 JenkinsFile 中快速實現一個專案的從構建、測試以到釋出的完整流程,靈活方便地實現持續交付。
並且通過“pipeline script from SCM”方式,可以儲存這個流水線的定義,進行版本化管理。
在實際使用中,一開始大都會製作一個儘可能通用的pipeline指令碼樣例,讓搭建者只需要修改幾個賦值引數就可以在專案中應用。
但不可避免的是,不同的專案往往有不同的需求,隨著定製化需求越來越多,加入了不同的功能實現程式碼,導致pipeline也會越來越複雜,可讀性差,也不利於維護。
而且隨著pipeline數目不斷的增多,將會發現同一型別和用途的pipeline,它們的很多功能其實是相同的,這時如果對某個功能做改動,往往需要更新數量眾多的JenkinsFile。
針對pipeline的擴充套件和管理問題,共享庫功能(Shared Libraries)應運而生。
共享庫可以將整個pipeline指令碼的實現和複雜度就被封裝到Shared Library中,在各種專案之間共享pipeline核心實現,減少冗餘程式碼,
也就是說,Shared Libraries的方式抽象了各種專案之間共享的程式碼(甚至整條完整的pipeline),有效降低了使用pipeline的複雜度。
而且通過外部原始碼控制(SCM)的方式,保證所有job在構建的時候會呼叫最新的共享庫程式碼。
2 - 目錄結構
共享庫中儲存的每個檔案都是一個groovy的類,每個檔案(類)中包含一個或多個方法,每個方法包含groovy語句塊。
Shared Library遵循固定的程式碼目錄結構:
+- src # Groovy source files | +- org | +- foo | +- Bar.groovy # for org.foo.Bar class +- vars | +- foo.groovy # for global 'foo' variable | +- foo.txt # help for 'foo' variable +- resources # resource files (external libraries only) | +- org | +- foo | +- bar.json # static helper data for org.foo.Bar
src目錄:
- 標準的Java源目錄結構,存放編寫的groovy類,執行流水線時,此目錄將新增到類路徑
- 存放一些特定的功能實現,檔案格式為
.groovy
vars目錄:
- 存放可從Pipeline訪問的全域性指令碼(標準化指令碼),這些指令碼檔案在流水線中作為變數公開
- 使用駝峰(camelCased)命名方式,檔案格式為
.groovy
- 在
.groovy
檔案中,可以通過import的方式,引入src目錄的類庫
resources目錄:
- 從外部庫中使用步驟來載入相關聯的非Groovy檔案
doc目錄:
- 存放pipeline的相關文件說明
- 一般包含ReadMe.md檔案
3 - 使用共享庫
3.1 全域性共享庫
Manage Jenkins >> Configure System >> Global Pipeline Libraries
- 可以新增一個或多個全域性可用的共享庫,也就是說任何Pipeline都可以利用這些庫中實現的功能。
- 通過配置SCM,可以保證在每次構建時都能獲取到指定Shared Library的最新程式碼
新增圖 - 需要為共享庫設定一個名稱,便於在Jenkinsfile中引用,並且設定一個預設版本
3.2 非全域性共享庫
- 可以為資料夾和任務的配置中單獨指定Pipeline Libraries
- 如果在多個級別的資料夾或目錄都配置了Pipeline Libraries,最終生效的是最小級別的配置
新增圖
4 - 載入與引用
- 標記為
Load implicitly
的共享庫允許流水線立即使用任何此庫定義的類或全域性變數。 - 為了訪問其他共享庫, Jenkinsfile 需要使用 @Library 註解, 指定庫的名字。
- 通過import 語句引用類庫時 (在 src/ 目錄下)
- 對於只定義了全域性變數 (vars/)的共享庫, 或者只需要一個全域性變數的 Jenkinsfile 檔案, 註解模式
@Library('my-shared-library') _
有助於保持程式碼簡潔。 - 不建議 import 一個全域性變數/函式, 由於這將強制編譯器 將欄位和方法解釋為 static。