1. 程式人生 > 實用技巧 >Jenkins - 共享庫(Shared Libraries)

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。

5 - 參考資訊