DevOps之代码检查

简介: 提高代码入库质量的终极武器

什么是代码预检查


代码预检查就是在代码提交到代码库之前对代码进行检查,包括静态检查、Code Review、测试、编译等多种方式。主要目的就是保证提交到代码库的代码的质量。


目前版本控制系统都是采用分布式版本控制系统,如 Git。根据 Git 的架构设计,可以在下图中 ①②③④ 进行代码预检查。如下图所示,这几个检查点是:


①本地检查, 一般是在开发人员本地开发空间进行检查,比如 IDE 的插件检查,本地编译时检查;


②本地提交, 一般当代码提交到本地仓库时进行检查,可以使用 Git 的客户端 Hook,如 pre-commit、pre-merge 进行检查;


③远程提交, 一般当代码提交到远程仓库时进行检查,这时会先提交到临时分支,当评审人同意后再合入代码库,比如 Gerrit;


④分支合并, 一般当代码从一个分支合并到另一个分支时进行检查,评审人进行 Code Review,同意之后再合入另一个分支,常见的分支合并方式有 MR(Merge Request)和 PR(Pull Request)两种。


image.png

为什么要做代码检查

代码预检查的主要目的就是保证提交到代码库的代码的质量。在当今快速发展的数字经济中,没有一个企业不是通过软件来支撑业务的。**软件是业务发展的核心,**因此软件的整体质量非常重要。高质量的软件可以带来客户满意度、用户量和收入,而更好的设计可以使组织更轻松的赢得市场。


因此,当我们面临稍纵即逝的市场机会而对软件交付充满时间压力的时候,可以临时适当降低对软件质量的标准。但是,从长远考虑,我们绝对要重视软件质量。软件是由代码编写而成的,代码的质量是软件质量的决定性因素,因此,重视软件质量,其中的核心就是要重视代码的质量。总结一下,代码的质量的重要性主要有三个原因。


  • 可读性:代码不只是给机器理解的,也是给人看的。要能够使团队中的每个人都能容易的阅读和理解代码。


  • 可维护性:当维护和测试高质量的代码时更加容易、安全和省时,且不易出问题。


  • 减低技术债务:高质量的代码设计良好,技术债少,开发人员无须花费大量的时间修复代码的问题和重构,因此,可以加快软件开发的进度。新团队成员容易理解代码,更容易加入项目。


高质量的代码是高质量软件的基础,不管是什么业务,高质量的软件都可以使你免去生产问题带来的烦恼。


代码检查实践方法

《丰田套路:转变我们对领导力与管理的认知》一书中介绍过“改善套路”:以循环的方式不断改进。我们也可以利用循环、培养等手段,将提高代码质量的活动融入每个迭代中,形成一种习惯。下面介绍几种能够提高代码质量的预检查的工具和实践。

本地检查

本地检查是指在开发人员本地执行的检查,比如 IDE 或命令行的方式。本地检查有优点也有缺点。


优点

  • 按照检查前置的原则,本地检查的时机是最合适的,发现问题和修复问题的成本是最低的;
  • 因为是在本地执行,执行检查的效率最快。


缺点

  • 需要开发人员具有很高的自觉性。


本地检查常用的检查工具和实践

  • IDE 插件:SonarLint、FindBugs、CheckStyle、PMD、阿里规范插件等,可以检查代码的编码风格,坏味道,漏洞等。
  • 本地构建:maven 编译、gradle 编译,可以检查代码语法问题,是否能够编译过。
  • 本地测试:单元测试,可以检查代码的逻辑问题。


下图是 IDEA 中 SonarLint 实时检查单个文件的结果。开发人员一边写代码,一边做检查,实时检查增强了反馈的时效性,是一种不错的实践。

image.png




本地提交检查

本地提交检查是指在本地执行git commit的时候进行的检查,这种检查方式同样有优点和缺点。


优点

  • 检查的时机适中;
  • 检查的效率较高;
  • 基于 Git 的 Hook 机制,在每次提交时运行 Hook,自动识别代码中的简单问题,代码审阅者只专注于代码逻辑和系统结构,避免因为琐碎的样式问题而浪费时间。


缺点

  • 本地提交对提交速度要求很高,只能进行省时的静态检查,如代码风格等;
  • 客户端的 Hook,因为是在开发人员本地,并未实现完全“强制”检查;
  • 同样依赖开发人员的自觉性。


远程提交检查

远程提交检查是指在本地执行git push提交到远程仓库时执行的检查,远程提交检查同样有优点和缺点。


优点

  • 能够进行较为深层次的动态检查,比如漏洞、Bug,检查的效果较好;
  • 能够做到强制检查,保证任何人提交的代码都是高质量的;
  • 代码提交后并未直接提交到代码库中,可以加入人工评审环节,可以检查代码的业务逻辑和架构设计等较复杂问题;
  • 可以控制每次提交的代码质量。


缺点

  • 检查的时机靠后,反馈周期较长;
  • 需要搭建代码检查服务器;
  • 维护成本较高;
  • 每次提交都检查,会拖慢团队的开发节奏。


分支合并检查

分支合并检查是指在远程仓库里执行分支合并的时候进行的检查,分支合并检查的优点和缺点如下。


优点

  • 每次在分支合入时进行检查,既能控制合入其他分支的代码质量,又不会对开发节奏造成影响;
  • 分支合并时一般表示一个功能和问题开发完成,可以有相对充足的时间执行较为深层次的动态检查,比如漏洞,Bug 等;
  • 可以设置强制检查,保证合入分支的代码是高质量的;

  • 可以做 Code Review,评审人一次性评审完整的功能代码(不推荐长期分支,大功能开发);
  • 代码托管平台支持,如 GitHub、GitLab。


缺点

  • 检查的时机靠后,反馈周期较长。


常用的检查工具和实践

代码检查

需要搭建代码检查服务器,比如 SonarQube。当代码提交后,自动触发代码检查并根据检查结果决定是否合入代码库。为了避免历史债务对问题修复的影响,可以考虑使用增量检查,只检查本次提交修改的文件,这样就不会因为问题太多打消提交者解决问题的积极性。在之前的实践中,我们每次提交时进行增量检查,控制新增代码的质量。在发版时,对全量代码进行检查,作为系统发版的质量关卡。质量分值每月递增,从而达到持续提升代码质量的目的。


人工评审

是指当代码提交后,由团队中高级别人员对代码进行评审。评审人会检查本次变更是否符合编码规范以及是否采用了最佳的技术解决方案,并在评审页面以行间评论的方式发表评审意见,提交人根据评审意见进行修改,直到满足评审人的要求。目前常用的代码评审工具如 Gerrit,通过与Jenkins 集成可以实现机器检查和人工评审的同时审核,这也是目前企业里用得最多的实践。下图是查看本次变更内容的 Gerrit 评审页面。


自动化测试

上面两个检查具有一定的局限性。代码检查能够发现代码问题,但不能发现功能性问题。人工检查对评审人的要求较高。比较有效的做法是使用 JaCoCo 检测单元测试覆盖率,或者执行一定范围的集成测试。建议选择系统的核心场景、10 分钟以内能够执行完成的测试用例。


总结

质量是一种习惯,是要融入每个开发人员的日常工作中,在开发的过程中就关注代码的质量。因此,对于软件从业人员来说,我特别推荐使用 “本地检查” 的方法随时随地的提示、指导我们开发高质量的代码。

目录
相关文章
|
运维 监控 安全
DevOps 测试实践指南
软件开发公司一直在采用 DevOps,因为它有助于自动化和简化应用程序的开发生命周期。不仅如此,DevOps 还通过规划、沟通、流程和工具,更好地协调了开发团队和运维团队,从而提高了项目的交付质量和速度。但是测试 DevOps 的最佳策略是什么呢?本文将讨论 DevOps 的基本概念、生命周期、最佳实践以及我们应该使用的工具。
646 0
DevOps 测试实践指南
|
2月前
|
运维 Devops jenkins
DevOps实践:自动化部署与持续集成的实现之旅
本文旨在通过一个实际案例,向读者展示如何将DevOps理念融入日常工作中,实现自动化部署和持续集成。我们将从DevOps的基础概念出发,逐步深入到工具的选择、环境的搭建,以及流程的优化,最终实现一个简单而高效的自动化部署流程。文章不仅提供代码示例,更注重于实践中的思考和问题解决,帮助团队提高软件开发和运维的效率。
|
3月前
|
运维 安全 Devops
DevOps实践:自动化部署的脚本编写技巧
【9月更文挑战第24天】在DevOps文化中,自动化部署是提升效率、减少人为错误的关键。本文将引导读者了解自动化部署脚本的编写方法,从基础命令到复杂逻辑,逐步深入。你将学会如何用代码简化日常任务,让重复工作变得轻松愉快。让我们一起探索自动化的世界,释放你的创造力!
|
4月前
|
运维 Devops jenkins
DevOps实践:自动化部署与持续集成
【8月更文挑战第29天】本文深入探讨了DevOps文化中的两大核心实践——自动化部署和持续集成。通过介绍这两个概念,解释了它们如何相互促进并提升软件开发的效率和质量。文章将展示具体的代码示例,指导读者如何在实际项目中实现这些实践,以及如何从中受益。
|
2月前
|
运维 监控 Devops
DevOps实践:持续集成与部署的自动化之旅
【10月更文挑战第7天】在软件开发领域,DevOps已成为提升效率、加速交付和确保质量的关键策略。本文将深入探讨如何通过实施持续集成(CI)和持续部署(CD)来自动化开发流程,从而优化运维工作。我们将从基础概念入手,逐步过渡到实际操作,包括工具选择、流程设计以及监控和反馈机制的建立。最终,我们不仅会展示如何实现这一自动化流程,还会讨论如何克服常见的挑战,以确保成功实施。
73 9
|
1月前
|
运维 Devops jenkins
DevOps实践之持续集成与持续交付
【10月更文挑战第32天】在软件开发的快节奏世界中,DevOps已经成为提升效率和质量的关键策略。通过将开发(Development)和运维(Operations)紧密结合,DevOps促进了更快速的软件发布和更高的可靠性。本文将深入探讨DevOps的核心组成部分——持续集成(CI)和持续交付(CD),并展示如何通过实际代码示例实现它们,以帮助团队构建更加高效和稳定的软件发布流程。
|
2月前
|
运维 Devops jenkins
DevOps实践:自动化部署与持续集成的实现
【9月更文挑战第36天】本文通过深入浅出的方式,向读者展示了在现代软件开发中,DevOps如何通过自动化部署和持续集成提高开发效率和软件质量。文章不仅介绍了相关概念,还提供了实用的代码示例,帮助读者理解如何在实际工作中应用这些技术。
|
2月前
|
监控 Devops 测试技术
DevOps实践:持续集成与部署的自动化之路
【9月更文挑战第30天】在软件工程的世界中,DevOps已成为提升开发效率、确保软件质量和加快交付速度的关键策略。本文将深入探讨如何通过自动化工具和流程实现持续集成(CI)与持续部署(CD),从而优化软件开发周期。我们将从基础概念出发,逐步深入到实际操作,最终展示如何构建一个高效的自动化流水线,以支持快速迭代和高质量发布。
63 7
|
3月前
|
Devops jenkins Java
DevOps实践:持续集成和部署的自动化之旅
【9月更文挑战第20天】在软件开发的世界里,速度和质量是至关重要的。本文将带领读者踏上一场自动化之旅,深入探索DevOps文化中的两大支柱——持续集成(CI)和持续部署(CD)。我们将通过一个实际的案例,展示如何利用现代工具和技术实现代码从编写到部署的无缝转换,确保软件交付的高效性和可靠性。准备好让你的开发流程变得更加流畅和高效了吗?让我们开始吧!
|
2月前
|
运维 Devops 测试技术
DevOps实践之路:从持续集成到自动化部署
【9月更文挑战第33天】在软件开发的海洋中,DevOps如同一艘航船,承载着敏捷开发与运维之间的桥梁。本文将带你领略DevOps的魅力,从持续集成的理念出发,穿越自动化测试的浪潮,直至自动化部署的港湾。我们将通过实际案例,探索如何构建一个高效、可靠的DevOps流程,让软件交付不再是梦魇,而是流畅的艺术。