序
对于开发者而言,编译代码和提交代码是必不可少的流程,同一个需求反复提交的情况也时常出现,那么怎么避免这种情况,且保证代码的质量,这就是Verify CI的目标。Verify表示认证验证的意思,结合到我们软件开发者的身上就是对代码的认证。何谓对代码的认证,可以理解为对代码的功能,可维护性,复杂度等质量指标的验证,如果不达标就得不到认证。那么怎么将Verify集合到实际的开发流程中呢?
对于一般的开发模式,如敏捷开发模式下,对实际的开发在来说,大概的流程是:接收需求,开发需求,需求自验证,提交代码。从实际的开发流程不能看出,只要保证了代码提交环节,就可以保证共享代码的质量,所以在代码提交环节做Verify,从而达到高质量的保证。
结合一些开源的工具,我们可以实现如下流程,在代码提交的时候,触发认证流程,认证通过以后,代码入库。代码一般保存在git仓库中,开源代码管理工具gitlab就可以实现,触发认证的流程可以使用开源工具Jenkins,然后由Jenkins触发各种质量认证流程,综合得出一个结论,返回给gitlab,最后gitlab根据结果决定是否入库。
代码质量Verify的流程
代码质量认证的维度很多,如编译,静态检查,单元测试,复杂度,冒烟测试,集成测试等环节,本文主要关注的维度如下图所示:
- 代码编译:代码能不能正常编译成功,这是代码能不能入库的基本条件
- 复杂度检查:复杂度的一种度量方式是圈复杂度,简单的理解就是一个函数中有多少个if语句,函数的圈复杂度就是多少,圈复杂度越高说明代码的逻辑越复杂,可维护性就越低,质量越差。
- 静态检查:静态检查一般要借助专业的检查工具,检查的规则一般是由专家编辑,难度非常大。静态检查的主要目标是,在代码基本功能正常的前提下,找出代码中容易出问题的地方,提前暴露问题。如:数组越界,拷贝越界,资源泄漏,死循环等。几种代码静态检查工具:klocwork、coverity等。
- 单元测试:对于实际物理验证环境非常复杂的代码,单元测试将是一个神奇。它可以让你直接在代码的编辑环境中,模拟真实的物理环境运行代码,快速的对代码进行调试。
- 覆盖率:代码的覆盖率一般是在单元测试后进行检查,因为覆盖率的计算需要依赖单元测试的可以执行文件的运行结果。覆盖率 = 单元测试运行的代码行数 / 总的代码行数。代码覆盖率达不到一定指标,就算覆盖率检查不通过。
体会
在实际的开发过程中,搭建Verify的环境非常容易,难的是坚持入库的标准不动摇。一般情况下,代码就算Verify不过,也可以强制入库,导致破窗。唯一的方法就是坚持底线不突破,大家一起维护。