本文首發於:Jenkins 中文社區html
譯者:linan607git
在企業範圍內實施 DevSecOps 實踐具備挑戰性。因爲組織內的不一樣應用程序正在使用多種編程語言、自動化測試框架和安全聽從性安全合規工具,所以每一個團隊構建和維護流水線變得很難。github
不管應用程序使用哪一個特定的技術棧,大多數流水線都將遵循相同的通用工做流。模板引擎插件(簡寫爲 JTE ,用於 Jenkins 模板引擎)容許您經過建立不依賴於工具的模板化工做流來獲取效率,每一個團隊均可以重用這些工做流。編程
做爲公共部門和私營部門客戶的技術顧問,咱們在 Booz Allen 發現,每一個新項目都要從頭開始建造 DevSecOps 流水線。經過開發 Jenkins 模板引擎,咱們已經看到流水線開發從幾個月減小到幾天,如今咱們能夠重用工具集成,同時爲 Jenkins 流水線帶來新的治理級別。安全
組織受益於讓應用程序開發人員專一於他們最擅長的工做:構建應用程序。支持這個,意味着創建一個集中式的 DevOps 團隊,負責維護平臺基礎設施,並建立開發團隊使用的 CI/CD 流水線。app
隨着基於微服務的體系結構的興起,一個集中的 DevOps 團隊能夠同時支持許多不一樣的開發團隊;全部這些團隊均可能利用不一樣的編程語言和自動化測試工具。框架
雖然開發團隊之間的工具可能不一樣,但工做流一般是相同的:單元測試、靜態代碼分析、構建和發佈製品、部署它,而後針對部署的應用程序執行不一樣類型的測試。maven
模板引擎插件容許您從每一個被團隊定義可繼承通用工做流的存儲庫中刪除 Jenkinsfile 。做爲替代每一個存儲庫需定義整個流水線,團隊提供一個使用工做流的工具配置文件。編程語言
讓咱們經過一個簡單的示例來演示模板的可重用性: 流水線模板例子: unit_test() build() static_code_analysis()
模板利用庫提供的步驟概述工做流團隊必須實現的步驟。雖然模板的執行方式與任何其餘 Jenkinsfile
都同樣(這意味着支持標準的腳本化和聲明性語法),但模板的目標應該是以純英語的方式閱讀,並避免任何技術實現。微服務
經過這種方式利用模板,您能夠將流水線的業務邏輯(應該在何時發生)與技術實現(實際將要發生什麼)分開。其結果是一個 CI/CD 管道,當同時支持多個團隊時,該流水線被證實很是容易管理。
此模板( unit_test
、 build
和 static_code_analysis
)概述的步驟是專門命名的。經過這種方式,團隊可使用的不一樣庫共享同一流水線。
使用模板引擎實現可共享流水線須要幾個關鍵組件:
流水線配置存儲庫用於存儲團隊繼承的常見配置和流水線模板。
這個示例流水線配置存儲庫稍後將被配置爲治理層的一部分:JTE 的機制中容許您構建表示組織的層次結構配置。
治理層包含三個方面:
pipeline_config.groovy
)治理層的流水線模板和配置文件存儲在流水線配置存儲庫中。
在 Jenkins 中配置治理層時,您將爲包含上述組件的存儲庫以及能夠找到這些製品的基本目錄提供源代碼管理位置。
接下來,咱們將爲治理層建立一個 Jenkinsfile
。在 JTE 中, Jenkinsfile
是執行將使用的默認流水線模板。
Jenkinsfile unit_test() build() static_code_analysis()
模板引擎插件實現了一個版本的 Jenkins 共享庫,以加強庫的可重用性。庫是源代碼存儲庫中的根目錄,而且該存儲庫已在治理層上配置爲庫源。
在咱們的示例中,流水線模板須要執行單元測試、打包製品和運行靜態代碼分析。
假設咱們有一些團隊使用 Gradle ,一些團隊使用 Maven 來構建和測試他們的應用程序,可是他們都將使用 SonarQube 來執行靜態代碼分析。
在這個場景中,咱們應該建立 gradle
、 maven
和 sonarqube
庫。
|- 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 }
接下來,咱們將建立另外兩個表示 Maven 和 Gradle 應用程序的存儲庫。在這些存儲庫中,咱們只須要一個特定的 pipeline_config.groovy
文件。
這些存儲庫都包含應用程序 pipeline_config.groovy
配置文件。
maven app: pipeline_config.groovy libraries{ maven }
gradle app: pipeline_config.groovy libraries{ gradle }
既然咱們有了流水線配置存儲庫和庫源存儲庫,那麼就能夠在 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 上的模板引擎插件。