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 - 參考信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章