持续集成(
Continuous Integration
)
•
持续集成(
Continuous Integration
),缩写为
CI
p
是一项
软件开发实践
,其中团队的成员经常集成他们的工作,通常每个人每天至少集成一次
——
这导致每天会
集成多次
。每次集成是通过
自动化的构建
(包括测试)进行的,目的是尽快地检查
集成错误
。许多团队发现这样做能够减少大量的集成问题,让团队能够更快的开发一致的软件。
p
自动化的构建:
获取版本、编译、单元测试、静态检查、集成测试、系统测试、软件部署、信息反馈等全部自动化。
持续集成是没有任何争议的业界优秀实践
版本控制库、
CI(
持续集成
)
服务器、构建脚本、反馈机制
开发人员日常工作步骤:
①
开发人员基于最新版本开发
1
个新特性
②
从配置库上将更新过的文件同步到本地,确保本地代码和库文件是最新的
③
在本地完成编译、单元测试、代码静态检查
④
准备提交代码前再次从配置库上将更新过的文件同步到本地
⑤
再次在本地完成编译、单元测试、代码静态检查
⑥
成功后向配置库提交代码,自动触发
CI
集成服务器的一次构建,构建失败后要立即修复直到构建成功
⑦
推荐采用令牌方式提交代码
本地构建是开发人员自我质量保证、持续集成质量和版本质量的基础
•
微软
p
持续集成人员占开发人员的
1%
,如微软
2000
人的
windows
部门,有
20
人专职做持续集成
p
check in
是头等大事
,认为对
check in
都不认真,那么就没什么事能认真作了。
如果
check in
的代码
Build
(持续集成)不通过,
24
小时任何时间通知,必须回公司修正;
2
次
Build
不通过会导致责任人在项目组压力非常大,甚至呆不下去。
•
Ericsson
p
爱立信
CTO HAKAN
认为爱立信产品
交付周期缩短
50%
,效率不断提升的三个
法宝
是
Daily build
(持续集成)
,
Streamline
以及
One track
。
p
E
公司版本构建
3
次不通过开发经理将被转岗!
•
业界
持续集成招聘
岗位
是软件开发
岗位
的
0.7%
p
业界招聘信息看,持续集成岗位的发展速度是软件开发岗位的
5
倍,招聘岗位是软件开发的
0.7%
。
•
开发效率提升
30%
•
开发成本节约
30
%
•
错误减少
30%
•
构建速度提升
100%
•
配置效率提升
40%
•
发布频率提升
40%
•
大型项目的效率提升更大
全球
81.7%
的软件项目采用持续集成
•
每天生成可部署的软件,避免产品最终集成时爆发大量问题
p
缺陷的检测和修复变得更快
p
软件的健康程度可以度量
•
团队成员每天都看到自己的可工作的软件成果,增强自信心
•
持续集成可以
真实
的
反映产品
的
开发进度
p
可以工作的软件是衡量进度的唯一标准。
p
在传统的集成模式下,
“
最后
10%
的工作仍需要
90%
的时间完成
”
。
p
实施持续集成的团队,进度通过特性的完成率来表示,
90%
的完成率意味着
90%
的特性开发测试完毕。
•
持续集成是产品开发的
“
心跳
”
,是产品质量的
晴雨表
p
开发人员每天的工作都立刻合入版本,构建结果快速反馈给项目经理,项目过程质量一目了然,管理者可以度量真实的进度和质量,确定风险,并积极地进行风险控制。
•
增强开发人员
自信心
p
每次代码修改,团队成员都知道自己的软件遵守编码标准和设计标准,通过测试验证,往前迈进的每一步都非常坚实。
p
任务越小,工作越轻松。
持续集成!
=
持续编译
持续集成!
=
工具
+
技术
持续集成!只是开发人员的事情
•
任何一点集成方面的努力都是值得肯定的
,
哪怕即使只是持续编译,只要保证每天都能够编译通过,也已经具有很大的价值了。
•
持续集成关键是:
持续测试
。即持续集成在很大程度上依赖测试策略和自动化程度。
•
持续集成的内涵更多是软件开发理念,绝非只是工具和技术
p
持续集成的技术和工具能做的就是自动提供快速反馈
p
团队收到反馈之后的行为
,
才是降低风险
,
提高质量的关键
p
持续集成更多的是一种开发文化:
工作完成的唯一标准是构建成功
•
持续集成更多的是管理(需要管理者下决心),例如制定产品级别的集成策略,包括:
p
专用的持续集成硬件环境
p
导致主干版本构建失败的行为要严惩
p
修复失败的构建是最高优先级的事情
p
经常(每天多次)提交代码,提交代码前执行足够多的测试保证质量
p
编写自动化的测试用例(
UT
、
IT
、
ST
)
p
每次构建必须通过所有测试和审查
•
解决
版本构建失败的
问题是
团队
最高优先级任务
p
最近提交代码的开发者必须参与修复失败的构建
p
短期内不能修复的构建代码必须回滚
•
开发人员应
每天提交至少一次代码
p
每天至少向版本控制库提交一次代码。频繁的提交将促使开发人员把工作分解成更小的粒度,既降低工作难度,又有利于监控项目的进展。
•
自己提交
的
代码不能导致
其他成员的
代码构建失败
p
不要提交无法编译或不能通过测试的代码
p
开发人员提交代码前必须做本地构建,确保合入代码正确
•
开发人员
不仅开发代码
,
更要编写自动化测试用例
p
开发人员不仅开发代码,同时要编写自动化的
UT
、
IT
的测试用例来验证软件
p
开发人员要持续维护和更新自动化测试用例
•
开发人员须
先在本地构建成功,才可提交代码到配置库
p
代码提交到版本控制前;所有代码都必须遵守通用的编码和设计标准,包括编译、
PCLINT
检查,编程规范检查,常见错误检查,复杂度检查,重复代码检查、
UT
测试
100%
通过等。
•
始终保证主干版本的构建成功
p
保持所有人工作在主干版本上,并且始终保持其能构建成功
p
永远不要让主干版本长期处于
build
不通过的状态
•
不要在下班的时候留下失败的构建
•
不要在失败的构建上更新、提交代码
•
开发、测试及设计共同负责(参与测试场景讨论、测试策略制定、测试结果分析)
•
功能测试用例能够及时纳入持续集成环境
p
自动化测试设计和实现,与产品代码开发并行
p
自动化测试用例在本地调试通过后及时纳入持续集成环境,以便尽早的执行用例发现问题
•
持续集成环境中测试失败导致构建失败
p
构建成功标准包括自动化测试用例
100%
通过
p
导致构建失败的用例开发和测试要共同关注并及时修复
•
管理者重要职责是审视持续集成的结果
,出现问题促使尽快解决
p
从关注计划、文档到
关注持续集成结果
的转变,持续集成反映了产品真实的进度和质量。
•
保证持续集成人力投入,产品持续集成有
专人负责
,其职责:
p
负责制定产品分级分层分布式的产品持续集成策略
p
负责持续集成环境的搭建和维护
p
负责维护产品的模块依赖关系(如
Makerfile
、测试执行的顺序)
p
提供在各种不同环境下(如操作系统、硬件配置、软件配置)的工具配置和使用
p
及时定位和解决持续集成环境存在的问题
•
负责产品持续集成的专人应当是
资深员工
而
不是没有经验的员工
p
持续集成需要对产品架构、模块依赖关系、开发活动顺序、环境部署、配置库等都非常熟悉的人才可以制定出正确的产品持续集成策略。
p
持续集成是系统工程,涉及设计、开发、测试、工具、技术等之间协同,需要对产品有系统视野的人。
n
实践
1
:单一的代码源,所有软件资产集中管理;
n
实践
2
:经常提交代码,每天至少提交一次代码;
n
实践
3
:不要提交无法构建的代码,提交代码之前先执行本地构建;
n
实践
4
:构建过程完全自动化;
n
实践
5
:每次变更都要触发一次集成构建,在一台独立的构建机器上;
n
实践
6
:立即修复无法通过的构建;
n
实践
7
:使构建足够快,必要的话,采用分级构建策略;
n
实践
8
:将软件部署到接近真实的环境上进行测试;
n
实践
9
:任何人可随时取到最新的可执行程序;
n
实践
10
:所有人都知道最新的构建状态;
持续集成(Continuous Integration),