浅谈持续集成

最近在看软件质量保障相关的一些资料,持续集成占据了其中很大一部分篇幅。这篇文章,主要内容是对持续集成相关知识的整理归纳,以及个人对持续集成的一些思索总结,介绍持续集成的起源、发展以及如何实践。

相关阅读推荐:

《持续集成:软件质量改建和风险降低之道》

《持续交付:发布可靠软件的系统方法》

一、起源与发展

1、起源

持续集成这个术语最早是在1994年由Grady Booch提出的,目前能看到的关于持续集成最多的描述,来源于Martin Flower发表的一系列论文。Martin Flower也对微服务架构的流行贡献了最大的力量,主要源于其2014年发表的论文《Microservice》。关于微服务架构,我之前整理了一篇文章,感兴趣的可以去看看,传送门:https://www.cnblogs.com/imyalost/p/6792724.html

Martin Flower为持续集成总结了以下一些原则:

①、维护一个统一的代码库;

②、每天都必须向主干提交代码;

③、每次提交都应立刻在集成环境进行构建;

④、自动化构建;

⑤、自动化测试;

⑥、自动化部署;

⑦、快速、持续构建;

⑧、构建环境务必于生产环境保持一致;

⑨、访问权限对团队成员保持公开透明;

2、定义

持续集成-CI(Continuous Integration):对软件项目进行持续的自动化的编译打包构建测试发布,来检查软件交付质量的一种行为。

3、组成

自动编译+自动代码检查+自动打包+自动化测试+自动部署

4、演进

模式:互联网机会窗口期的不断缩短,需要快速交付,快速发现问题解决问题

角色:功能测试→自动化测试、性能测试、安全测试→测试开发(对软件研发过程提供各种支持,包括工具,框架,方案,最佳实践)

岗位:开发、测试的岗位界限越来越模糊,由原来的DEV、TEST向质量保障靠拢(可参考《Google的软件测试之道》,这本书介绍了Google是如何做测试的)

5、工具

AnthillPro:商业的构建管理服务器,提供C功能

Bamboo:商业的CI服务器,对于开源项目免费

Build Forge:多功能商业构建管理工具,特点:高性能、分布式构建

Cruise Control:基于java实现的持续集成构建工具

CruiseControl.NET:基于C#实现的持续集成构建工具

Jenkins:基于java实现的开源持续集成构建工具,现在最流行和知名度最广泛的持续集成工具

Lunt build:开源的自动化构建工具

Para Build:商业的自动化软件构建管理服务器

二、为什么要做持续集成

1、项目中常见的问题

①、集成时发现系统无法运行;

②、不同分之之间合并代码经常出错;

③、加班加点改BUG;

④、重复进行手工的部署、调试、测试、发布,成本高,风险大;

⑤、其他。。。。。。

2、团队文化问题

①、对交付软件的质量意识不足

②、无法做到优先处理失败的构建

③、工程师文化不足

④、团队管理、流程的不足

3、持续集成的优点

持续集成能提升交付效率和交付软件的质量

①、及时反馈结果,尽早发现问题;

②、自动化代替手工,工程师将更多的时间精力放在设计、需求分析、风险预防等方面;

③、持续集成→持续交付→DevOps→基于容器的服务→提高自动化程度来提高效率;

三、从零开始构建持续集成

CI = 高效的构建+全面有效的测试+合理的流程规范+工程师文化+ROI

1、高效的构建

①、高效的构建:主干开发是快速推进CI的有力基础

核心:源代码、测试用例、配置和数据统一管理

优势:解决merge回主干困难,回归成本高的问题

解决随着项目增多,分支增多,管理越来越难的问题

修复BUG,可以达到修改主干,多出都可以fix的效果

解决QA只保证单独分支质量,忽视merge后主干质量的问题

②、高效的构建:需要工具支撑

版本控制:git&SVN

代码管理:gitlab私有部署

基础环境:虚拟机、docker、kubernetes

自动构建:jenkins

反馈机制:邮件&短信&微信&钉钉

具象方式:打造符合团队需要的pipeline

2、全面有效的测试:测试存在于项目周期各个阶段

①、需求与设计:PM/DEV/QA

需求评审

需求变更

设计评审

②、开发与测试:DEV/QA/PM

code review、单元测试

测试方案、测试用例、BUG管理、风险评估

功能测试:冒烟、集成、系统、验收

性能测试、安全测试、容灾测试

线上验证、探索性测试

③、上线与线上:OP/QA/DEV/PM

线上验证

业务监控

用户反馈

产品评测

PS:缺陷发现越早,修复成本越低,反之则越高

3、合理的流程规范

①、代码提交规范

本地开发

本地编译(自测,check out)

提交至当前主干(change log简洁明确)

主干编译(测试,check out)

②、注意事项

提交至主干前做好本地编译、自测

提交前解决代码冲突

提交时及时关联和添加描述

提交后关注代码扫码结果

提交后关注主干集成构建结果

构建没问题后及时合并

③、遵循原则

主干构建失败停止提交代码,直至构建成功

优先修复失败的构建,修复问题

如果构建不能快速修复,执行回滚

4、工程师文化

①、提高对交付软件质量保障的意识(测试是核心)

②、树立优先处理失败的构建的意识(优先程度最高)

③、培养团队工程师文化(流程、质量、沟通、职业素养)

④、优化团队管理、流程各方面,做到精简,避免过分强调流程、避免面子工程、做好资源协调

5、ROI(投资回报率

①、从0到1,可接受的投入的资源成本

入门阶段可以考虑持续编译打包,及时反馈代码版本库的编译问题冲突问题(快速正向的反馈);

②、从1到2,选择对整体交付质量,速率提升最高的选项

可以选择性价比较高的持续部署和代码检查,定时code review,减少手工部署和代码级别的BUG造成的风险;

③、从2到3,面临的问题越来越多

挑战:

构建任务的不断增加,执行速度的下降,整体效率的降低,成功率低于期望值;

自动化测试脚本维护量大,依赖于基础测试环境和测试数据的稳定性;

解决方案:

增加任务构建执行机,减少排队现象(多任务分布式构建);

拆分耗时较长的任务,减少单个任务执行时间,解耦;

将自动化测试放在稍后的阶段实施,分层设计,轻量的UI和重点API层automation,是目前业内较好的自动化测试实践结果;

④、从3到N,不断扩展带来的挑战和期望收益提升

不同团队项目类型、技术栈构成、关注点、工作习惯不同,要求CI具备高度灵活性和定制化;

需要持续不断的资源投入;

团队自发适应、不断调整和优化方案以及流程;

以上内容就是我对持续集成相关资料的整理以及个人的一些思考总结,还存在很多不完善或者不对的地方,如有更好的建议,希望看到的各位不吝指教。。。

本文分享自微信公众号 - 工程师的自我修养之路(Engineer_Way),作者:老张

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 混沌工程-初识

    公司新成立了一个稳定性团队,20年的重要目标之一就是开展混沌工程。为了后续更好的开展工作,记录关于“混沌工程”相关的知识以及工程实践。

    写博客的老张
  • 解析《中国互联网软件测试行业2018年度调研报告》

    之前收到了一份TesterHome的调查问卷邀请:2018年度中国测试行业问卷调研。最近问卷的汇总结果出来了,有2000+的测试童鞋参与了问卷调查。从幸存者偏差...

    写博客的老张
  • 认知成长:聊聊专业性和职业性

    最近在忙双十一全链路压测的事情,由于岗位职责和团队定位等原因,和很多部门以及不同角色的同事都有接触。上周和某个团队的Leader开完会,简短的聊了下工作的推动和...

    写博客的老张
  • 互联网中小型企业的持续集成

    互联网研发的世界里唯快不破、迭代速度往往很快。在快速的发展迭代中,如何让项目产品平稳的落地,就需要有完善可靠的持续集成 CICD 和 DevOps 方案。

    DevOps时代
  • 基于 Jenkins 快速搭建持续集成环境

    什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(...

    张善友
  • 互联网中小型企业的持续集成CICD

    本文来自作者 SoftwareLuke 在 GitChat 上分享 「互联网中小型企业的持续集成CICD」 互联网研发的世界里唯快不破、迭代速度往往很快。在快速...

    CSDN技术头条
  • 新年新气象,腾讯云开发者平台推出持续集成(beta)功能

    在这万物更新的时节里,腾讯云开发者平台正式推出持续集成(beta)功能,帮助开发者提高项目的交付效率和质量。

    CODING研发管理系统
  • 基于云计算的数据集成工具

    选择基于云计算的集成工具时有几个关键考虑因素。重点关注工具提供的连接器集、服务的可扩展性、解决方案的运行速度,以及提供的安全级别。还需要考虑许多关键的管理功能。

    静一
  • 评估数据集成平台的8个技巧

    随着各个组织机构越来越多地将其数据和操作转移到Microsoft Azure云中,它们必须从存储在内部的旧系统中迁移数据。不幸的是,通过编写定制代码和遗留集成技...

    程序你好
  • 高级信管 | 软件测试

    软件测试可分为单元测试、集成测试、确认测试、系统测试、配置测试、回归测试等类别。_______主要用于检测软件的功能、性能、和其它特性是否与用户需求一致。

    小团子

扫码关注云+社区

领取腾讯云代金券