介紹 Jenkins 模板引擎

本文首發於:Jenkins 中文社區html

譯者:linan607git

在企業範圍內實施 DevSecOps 實踐具備挑戰性。因爲組織內的不一樣應用程序正在使用多種編程語言、自動化測試框架和安全聽從性安全合規工具,所以每一個團隊構建和維護流水線變得很難。github

不管應用程序使用哪一個特定的技術棧,大多數流水線都將遵循相同的通用工做流。模板引擎插件(簡寫爲 JTE ,用於 Jenkins 模板引擎)容許您經過建立不依賴於工具的模板化工做流來獲取效率,每一個團隊均可以重用這些工做流。編程

做爲公共部門和私營部門客戶的技術顧問,咱們在 Booz Allen 發現,每一個新項目都要從頭開始建造 DevSecOps 流水線。經過開發 Jenkins 模板引擎,咱們已經看到流水線開發從幾個月減小到幾天,如今咱們能夠重用工具集成,同時爲 Jenkins 流水線帶來新的治理級別。安全

流水線模板

組織受益於讓應用程序開發人員專一於他們最擅長的工做:構建應用程序。支持這個,意味着創建一個集中式的 DevOps 團隊,負責維護平臺基礎設施,並建立開發團隊使用的 CI/CD 流水線。app

隨着基於微服務的體系結構的興起,一個集中的 DevOps 團隊能夠同時支持許多不一樣的開發團隊;全部這些團隊均可能利用不一樣的編程語言和自動化測試工具。框架

雖然開發團隊之間的工具可能不一樣,但工做流一般是相同的:單元測試、靜態代碼分析、構建和發佈製品、部署它,而後針對部署的應用程序執行不一樣類型的測試。maven

模板引擎插件容許您從每一個被團隊定義可繼承通用工做流的存儲庫中刪除 Jenkinsfile 。做爲替代每一個存儲庫需定義整個流水線,團隊提供一個使用工做流的工具配置文件。編程語言

JTE 實戰

讓咱們經過一個簡單的示例來演示模板的可重用性: 流水線模板例子: unit_test() build() static_code_analysis() 模板利用庫提供的步驟概述工做流團隊必須實現的步驟。雖然模板的執行方式與任何其餘 Jenkinsfile 都同樣(這意味着支持標準的腳本化和聲明性語法),但模板的目標應該是以純英語的方式閱讀,並避免任何技術實現。微服務

經過這種方式利用模板,您能夠將流水線的業務邏輯(應該在何時發生)與技術實現(實際將要發生什麼)分開。其結果是一個 CI/CD 管道,當同時支持多個團隊時,該流水線被證實很是容易管理。

此模板( unit_testbuildstatic_code_analysis )概述的步驟是專門命名的。經過這種方式,團隊可使用的不一樣庫共享同一流水線。

實現模板

使用模板引擎實現可共享流水線須要幾個關鍵組件:

  1. 流水線模板:概述要執行的工做流
  2. :提供工做流步驟的技術實現
  3. 配置文件:指定要使用的庫及其配置

步驟一、建立流水線配置存儲庫

流水線配置存儲庫用於存儲團隊繼承的常見配置和流水線模板。

這個示例流水線配置存儲庫稍後將被配置爲治理層的一部分:JTE 的機制中容許您構建表示組織的層次結構配置。

治理層包含三個方面:

  1. 流水線模板
  2. 庫資源清單
  3. 層的配置文件( pipeline_config.groovy )

治理層的流水線模板和配置文件存儲在流水線配置存儲庫中。

在 Jenkins 中配置治理層時,您將爲包含上述組件的存儲庫以及能夠找到這些製品的基本目錄提供源代碼管理位置。

步驟二、建立流水線模板

接下來,咱們將爲治理層建立一個 Jenkinsfile 。在 JTE 中, Jenkinsfile 是執行將使用的默認流水線模板。

Jenkinsfile
unit_test()
build()
static_code_analysis()

步驟三、 建立庫

模板引擎插件實現了一個版本的 Jenkins 共享庫,以加強庫的可重用性。庫是源代碼存儲庫中的根目錄,而且該存儲庫已在治理層上配置爲庫源。

在咱們的示例中,流水線模板須要執行單元測試、打包製品和運行靜態代碼分析。

假設咱們有一些團隊使用 Gradle ,一些團隊使用 Maven 來構建和測試他們的應用程序,可是他們都將使用 SonarQube 來執行靜態代碼分析。

在這個場景中,咱們應該建立 gradlemavensonarqube 庫。

|- gradle/
  \-- build.groovy
  \-- unit_test.groovy
|- maven/
  \-- build.groovy
  \-- unit_test.groovy
|- sonarqube/
  \-- static_code_analysis.groovy

步驟四、實施步驟

實現庫步驟與將常規全局變量做爲默認 Jenkins 共享庫的一部分寫入徹底相同。

爲了這個演示的目的,咱們將讓每一個步驟打印出步驟名稱和貢獻庫。

gradle/build.groovy
void call(){
    println "gradle: build()"
}

讀更多關於 JTE 開發庫

步驟五、建立配置文件

JTE 的配置文件名爲 pipeline_config.groovy

在治理層,咱們將創建一個配置文件,具體說明應用程序之間的共同配置。在此狀況下,兩種應用都是使用 sonarqube 庫。

pipeline_config.groovy
libraries{
  merge = true // allow individual apps to contribute additional libraries
  sonarqube
}

接下來,咱們將建立另外兩個表示 MavenGradle 應用程序的存儲庫。在這些存儲庫中,咱們只須要一個特定的 pipeline_config.groovy 文件。

這些存儲庫都包含應用程序 pipeline_config.groovy 配置文件。

maven app: pipeline_config.groovy
libraries{
    maven
}
gradle app: pipeline_config.groovy
libraries{
    gradle
}

步驟六、在 Jenkins 中配置治理層

既然咱們有了流水線配置存儲庫庫源存儲庫,那麼就能夠在 Jenkins 中配置治理層

上圖中顯示的配置能夠在如下找到 Manage Jenkins >> Configure System

經過模板引擎,您能夠經過 Jenkins 中的文件夾表示此結構,從而建立與組織分類相匹配的流水線治理層次結構。

步驟七、爲兩個應用程序建立多分支流水線

當爲每一個應用程序建立多分支流水線項目時,模板引擎插件提供一個名爲 Jenkins 模板引擎的新 Project Recognizer 。項目設置爲在存儲庫中的全部分支使用模板引擎框架。。

您還能夠爲 GitHub 組織項目設置 Jenkins 模板引擎項目識別器,使您可以輕鬆地在整個 GitHub 組織中共享相同的流水線!

步驟八、運行流水線

就這樣!如今,這兩個應用程序將利用徹底相同的流水線模板,同時具備選擇工做流每一個階段應使用哪些工具的靈活性。

下面是兩個應用程序運行流水線的控制檯日誌的示例輸出:

Gradle:
[JTE] Obtained Template Configuration File pipeline_config.groovy from git https://github.com/steven-terrana/example-jte-configuration
[JTE] Obtained Template Configuration File pipeline_config.groovy from git https://github.com/steven-terrana/example-jte-app-gradle.git
[JTE] Loading Library sonarqube from git https://github.com/steven-terrana/example-jte-libraries.git
[JTE] Loading Library gradle from git https://github.com/steven-terrana/example-jte-libraries.git
...
[JTE] Obtained Template Jenkinsfile from git https://github.com/steven-terrana/example-jte-configuration
[JTE][Step - gradle/unit_test]
[Pipeline] echo
gradle: unit_test()
[JTE][Step - gradle/build]
[Pipeline] echo
gradle: build()
[JTE][Step - sonarqube/static_code_analysis]
[Pipeline] echo
sonarqube: static_code_analysis()
[Pipeline] End of Pipeline
Maven:
[JTE] Obtained Template Configuration File pipeline_config.groovy from git https://github.com/steven-terrana/example-jte-configuration
[JTE] Obtained Template Configuration File pipeline_config.groovy from git https://github.com/steven-terrana/example-jte-app-maven.git
[JTE] Loading Library sonarqube from git https://github.com/steven-terrana/example-jte-libraries.git
[JTE] Loading Library maven from git https://github.com/steven-terrana/example-jte-libraries.git
...
[JTE] Obtained Template Jenkinsfile from git https://github.com/steven-terrana/example-jte-configuration
[JTE][Step - maven/unit_test]
[Pipeline] echo
maven: unit_test()
[JTE][Step - maven/build]
[Pipeline] echo
maven: build()
[JTE][Step - sonarqube/static_code_analysis]
[Pipeline] echo
sonarqube: static_code_analysis()
[Pipeline] End of Pipeline

模板引擎的好處

應用組織治理

利用模板引擎插件,您能夠定義企業級的、通過批准的工做流,不管使用什麼工具,團隊均可以使用這些工做流。這種自上而下的方法使得在組織中擴展和執行 DevSecOps 原則變得很是容易。

優化代碼重用

實際上,組織中的每一個團隊都不須要反覆思考如何作相同的事情。在 Booz Allen ,咱們已經看到流水線開發時間從幾個月減小到幾天,由於咱們不斷地重複使用和擴展模板引擎庫組合,做爲解決方案交付平臺的一部分。

簡化流水線可維護性

一般,DevOps 工程師會發現本身同時爲多個開發團隊構建和支持流水線。經過將工做流與技術實現分離,並將流水線定義合併到一個集中的位置,模板引擎插件容許 DevOps 工程師更快地擴展。

參與進來!

模板引擎插件是開源的,並在 Jenkins 更新中心提供。

咱們老是感謝反饋和貢獻!若是你有一個有趣的用例或者想問一些問題,能夠試試 Gitter 上的模板引擎插件

高級功能

更多資源

對於這個演示

其餘資源

相關文章
相關標籤/搜索