Tech 导读 本文介绍了作者对CICD的理解以及在项目中开展CICD的几种场景,总结了每种场景实践的关键节点、带来的收益,以及结合具体项目开展的实际应用。读者可以借鉴本文中描述的场景,或借鉴文中提到的实践方式,在项目中开展CICD,为项目在持续集成部署上做具体的支撑。
01
前言
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
本文将基于京东研Bamboo、EOS、以及自搭建的SonarQube平台,在项目中开展CICD持续集成与部署。文章的主要内容包括介绍CICD开展的场景,项目中的实际应用,以及后续规划等。
02
CICD基础概念
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
CICD 是持续集成(Continuous Integration)和持续部署(Continuous Deployment)简称。指在研发过程中自动执行一系列脚本来降低开发引入 bug 的概率,在新代码从开发到部署的过程中,尽量减少人工的介入。
CICD 核心:持续集成、持续部署、持续交付。
图1 CI与CD过程的流转
CI:Continuous Integration,表示持续集成。
指在向远程仓库 push 代码后,在这次提交合并入主分支前进行一系列测试,构建等流程。
假设现在有个应用的代码存储在 仓库上,每天开发都会 push 很多次提交,针对每次 push,你可以创建一系列脚本进行自动测试,降低往应用里引入错误的概率。它可以应用在包括开发分支在内的多个分支上。
持续集成过程中很重视自动化测试验证结果,以保障所有的提交在合并主线之后的质量问题,对可能出现的一些问题进行预警。
CD:Continuous Delivery,表示持续交付。
指在完成CI后可自动将已验证的代码发布到仓库。
持续交付的目标是拥有一个可随时部署到生产环境的代码库。
CD:Continuous Deployment,表示持续部署。
指在持续集成的基础上更进一步,指将推送指仓库默认分支代码部署到特定环境。
通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队工程化的程度,任何修改通过了所有已有的工作流就会直接和客户见面,只有当一个修改在工作流中构建失败才能阻止它部署到产品线。
03
CICD的开展场景
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
3.1 编译部署
实现代码提交之后的自动编译-部署过程,取代j-one上构建-部署手动操作。
图2 编译部署流程关键节点
内容:代码提交后的自动构建、自动部署、构建部署结果通知;
收益:去除编译构建中间的等待时间。目前的编译部署步骤是两个非连续步骤,彼此分开,中间依赖于人工完成触发部署。通过流水线,可以实现编译部署中的无缝对接,去除中间等待时间,并且推送实时消息。
3.2 单元测试
开展基于Junit的单元测试:
图3 单元流程关键节点图
内容:针对后端代码,基于Junit编写单元测试脚本,开展单测,获取单测报告、jacoco代码覆盖率报告;
收益:通过单元测试,在项目中开展单测,可快速提升测试覆盖率。(测试覆盖率被定义为一种测试技术指标,它表明我们的测试用例是否真正完全覆盖了应用程序代码中的各种可能以及在运行这些测试用例时执行了多少代码。测试覆盖可以分为:语句覆盖、分支覆盖、路径覆盖、条件覆盖、边界值覆盖;通过jacoco插件,可以衡量单测的代码覆盖率,得到测试覆盖率结果。
3.3 代码扫描
实现基于SonarQube的代码质量检测:
图4 基于SonarQube的代码扫描关键节点
实现基于EOS的代码质量检测
图5 基于EOS的代码扫描的关键节点
内容:
1. 实现基于SonarQube、或公司平台EOS的代码扫描检测;
2. 代码提交自动触发代码扫描,最终生成报告、结果通知;
3. 扫描结果计入项目质量,记录跟踪问题,直至问题闭环解决。
收益:
1. 代码质量检测的手段丰富;
2. 多层次的自动化测试,提升代码质量;
3. 自动触发测试执行,缩减测试等待时间,提高效率,实现无人值守;
3.4 自动化测试
实现基于Python、EasyOne、DeepTest、Jmeter 的自动化测试。
图6 自动化流程关键节点节点
内容:
1. 实现基于SonarQube的代码质量检测;
2. 实现全链路各环节的自动化测试;
3. 代码提交自动触发测试执行、生成报告、报告通知;
收益:
1. 多层次的自动化测试,提升代码质量;
2. 自动触发测试执行,缩减测试等待时间,提高效率,实现无人值守;
3.5 全链路测试
将上述单个场景进行组合形成全链路测试场景;
代码提交触发链路自动运行,以及报告生成、邮件发送。
图7 全链路测试实践探索
以代码提交作为触发点,在编译阶段,完成代码扫描、单元测试,并进行自动部署,完成部署之后,触发单元测试执行、下发测试报告。过程中实时消息推送通知。
以上形成一个较为全面的全链路测试。
04
项目实践
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目
4.1 公司内部平台
4.1.1 Bamboo
Bamboo是京东自研的一套CI/CD流水线解决方案,覆盖软件开发的完整生命周期。
图8 平台系统结构
平台化+原子化设计,平台提供基础服务,能力可以通过原子化形式无限扩展,既兼顾了平台的稳定性,又大大减低了现有工具平台的接入成本。
图9 垂直业务平台对接
现有的其他工具平台可独立对用户提供服务,也可以通过标准化方式输出插件化原子能力,作为持续交付平台的一环,纳入软件交付流程中。
4.2 项目实际应用
4.2.1 编译-部署
对Jone上高频构建部署分支进行在Bamboo上搭建流水线,实现:
代码提交-调用Jone的构建-调用Jone的部署-结果通知
图10 编译部署流水线运行过程
触发编译构建的几种方式:
1. 手动执行;
2. 代码提交触发执行;
3. 定时任务触发执行;
4. 级联其他流水线触发执行;
应用情况:
1. 组内所测试所覆盖都已部署相关流水线;
2. 支撑测试人员在所测项目中部署自动构建流水线,调用次数达数万次。
4.2.2 单元测试
对后端项目开展单元测试,实现:
代码提交-maven构建-获取单测报告-结果通知
图11 Jacoco代码覆盖率统计
应用效果:
1. 极大简化了获取单测报告的过程,通过简单的过程即可针对项目开展单测、执行单测、并获取单测结果;
2. 支撑多个项目部署单测流水线,系统单测有效提升率:60%
项目开展接入单测的基本步骤:
后端工程配置 -> 代码仓库设置 -> Bamboo流水线编排 -> 流水线触发设置 -> 其他可选项配置。
其中后端工程配置为较为重要部分,以下做重点介绍:
(1)工程配置文件pom.xml文件中配置surefire插件,多模块工程可将此插件配置在模块的pom.xml文件中
【JAVA】
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
</plugin>
</plugins>
(2)项目目录中的pom.xml中是否配置跳过单元测试标签<skipTests>置为false,或删除此标签(false表示不跳过单元测试,做单元测试需要执行单测脚本,故需设置为false或删除此标签)
【JAVA】
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skipTests>false</skipTests>
</configuration>
</plugin>
(3)本地执行mvn test命令可生成*/target/surefire-reports/TEST-.xml
【Bash】
mvn clean test -Dmaven.test.failure.ignore=true
(4)生成代码覆盖率需要在pom.xml文件中配置jacoco插件
【JAVA】<!-- 配置jacoco覆盖率的插件 --><plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.2</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<!-- attached to Maven test phase -->
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
4.2.3自动化测试
项目部署之后,开展自动化回归测试,用于项目上线前的回归测试,实现:
自动化测试-测试报告-测试结果通知
图12 自动化测试覆盖率统计
目前基于Python语言,依托Py第三方模块,实现脚本编写,集成到Bamboo平台,执行流水线,获取报告。
应用效果:
在项目中开展上线前的预发环境的自动回归测试;
4.2.4 代码扫描
基于公司搭建的SonarQube、EOS平台,开展代码扫描,实现:
代码提交-代码扫描-扫描报告-问题手工记录缺陷平台
图13 代码扫描的关键节点
05
后续规划
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
(1)使用公司平台DeepTest开展更多项目的自动化测试,并与BamBoo平台做深度集成,提高自动化覆盖率。
(2)项目开展代码扫描,并在代码扫描过程中设置质量门禁节点,实现准入准出流水线的自动卡控。