本文首发于: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 上的模板引擎插件。