代码质量管理之工具篇
有了项目规范之后,还需要借助好的工具来落地。
这篇文章主要讲解Git、IntelliJ IDEA、Jenkins在实践中的应用。
# Git
Git是一个分布式版本控制系统,主要来用它实现版本控制、团队协作和分支管理。
# 工作流
使用Git的第一步是先明确团队要使用的工作流,常见的工作流有:
- Centralized Workflow(中心化工作流):这种工作流类似于传统的集中式版本控制系统(如SVN),团队成员在一个中央仓库上工作。开发者从中央仓库克隆一个仓库副本,直接在master分支上进行开发,然后将更改推送回中央仓库。这种工作流适合小型团队,但可能导致合并冲突。
- Feature Branch Workflow(功能分支工作流):在这种工作流中,所有新的功能或bug修复都在单独的分支上进行开发。当功能完成时,通过发起Pull Request(PR)将功能分支合并回主分支。这种工作流有助于代码审查、避免合并冲突,保持master分支的稳定性。
- Gitflow Workflow(Git流工作流):Gitflow工作流是功能分支工作流的扩展,为项目发布引入了专门的分支。它定义了一个固定的分支模型,包括master分支、develop分支、feature分支、release分支和hotfix分支。这种工作流适用于具有多个并行开发和发布的项目。
- Forking Workflow(分叉工作流):在分叉工作流中,每个开发者都拥有自己的公共仓库副本。开发者在自己的仓库中进行开发,然后通过发起Pull Request将更改合并回上游的主仓库。这种工作流非常适合开源项目,因为它允许任何人为项目贡献代码,同时不会影响主仓库的稳定性。
个人开发者可以选择中心化工作流;
小团队可以选择功能分支工作流,实践操作中PR步骤也不是必须的,代码审查过后,也可以允许开发者自己合并到main分支;
大型团队可以选择Gitflow工作流或者是Forking工作流。
# 合并冲突
合并冲突是一件应该慎重对待的事情,一定要谨慎处理,稍有不慎会出现代码丢失的情况。
合并冲突的最佳实践如下:
- 理解差异:在合并冲突之前,需要充分理解差异,了解冲突的原因,最好找到冲突代码的编写者,一起讨论决定怎么合并
- 选择合并策略:在解决冲突时,有多种合并策略可供选择,例如使用本地分支的更改、使用远程分支的更改或手动合并等。大多数情况下请选择手动合并
- 了解工具:使用Git提供的工具进行冲突解决,例如使用git merge --no-ff或git cherry-pick命令,或者使用图形界面的Git客户端来解决冲突。个人最喜欢的是TortoiseGit客户端,不太喜欢IDEA内置的合并工具
# rebase和merge
对于git rebase和git merge两个命令,总是容易搞混。
规则是:
- 单人开发的分支,为了跟上main分支的进度,可以使用rebase
- 多人共同开发的分支不允许使用rebase
- PR合并的时候使用merge命令
# IntelliJ IDEA
IntelliJ IDEA是一款由JetBrains公司开发的,集成开发环境(IDE),是Java编程的最佳助手。
熟练的使用IDEA,可以让Java开发者的效率大大提升。如果原先用的是Eclipse,请参考这篇文章:从Eclipse到IDEA
# 检查
IDEA的检查(Inspection)功能非常强大,在规范中我们提到
IDEA中检查不允许关闭。【弹性:可以选择关闭某些检查,但要严格控制】
所谓的严格控制,就是创建一个公示列表。下面是一个允许禁止的检查列表:
- Spring Core--代码--非建议的field注入
- 原因:项目中使用了@Autowired,这是允许的
- Spring Core--代码--Spring Bean中自动装配不正确
- 原因:Dao接口或Mapper接口无实现类
- 校对--拼写错误
- 原因:拼写检查很难覆盖所有语句
- Ali-check--不允许任何魔法值
- 原因:允许一些简单魔法值
- Ali-check--除常用方法(如getXxx/isXxx)等外,不要在条件判断中执行复杂的语句,将复杂逻辑判断的结果赋值给一个有意义的布尔变量,以提高可读性。
- 原因:允许一些复杂判断
- Freemarker--未解析的引用
- 原因:ftl必须关联方法,目前还不好全面覆盖到
- HTML--可访问性--表单输出没有相关的label
- 原因:前端项目这条不能禁用;JSP老项目可以禁用
# 后缀补全
IDEA本身有很多后缀补全,比如if、nonnull、null等等。
当然,也可以自己扩展。比如开发中经常判断数字是否大于0:
这样当你输入的时候
就会快速的得到num != null && num > 0
# 插件
IDEA提供了插件市场,通过插件给编辑器提供了很高的扩展性。
常用的插件推荐:
google-java-formater
谷歌的代码格式化规则Alibaba Java Coding Guidelines
阿里的代码规则Maven Helper
Maven扩展支持Json Helper
Json文件阅读器GenerateAllSetter
快速生成Bean的Setter方法Easy Doc
快速生成JavaDoc文档注释Vo2Dto
Bean复制的辅助工具
如果公司内部有自己独有的基础框架,那么也可以通过开发自定义插件提供对基础框架的支持。
# Jenkins
Jenkins 是一个开源的自动化构建工具,可以用于持续、自动地构建、测试和部署软件。
Jenkins主要是配合插件来使用,常用的插件有:
SSL
帮助你在 Jenkins 上配置安全套接字层(SSL)来保护传输数据的安全。它允许你为 Jenkins 实例配置 HTTPS,以便在浏览器和服务器之间创建加密的连接。要使用此插件,你需要具有有效的 SSL 证书(可以是自签名的,也可以是从权威证书颁发机构获得的)。 安装插件后,进入 "Manage Jenkins" > "Configure Global Security",在 "Enable security" 选项下,你可以配置 HTTPS 的相关选项。Gitlab Hook
用于将 GitLab 仓库与 Jenkins 集成。这允许你在 GitLab 上的代码更改触发 Jenkins 构建。安装此插件后,你需要在 Jenkins 项目中配置 GitLab 触发器Generic Webhook Trigger
允许你使用任意来源的 Webhook 触发 Jenkins 构建。通过解析传入 Webhook 的数据,你可以根据需要自定义触发条件。当你的代码不是放在GitLab系统上的时候,需要使用到这个插件Role-based Authorization Strategy
允许你在 Jenkins 中基于角色来分配用户权限。这有助于细化权限管理和控制对 Jenkins 资源的访问
这些插件的需要配合使用,基本操作流程是:
- 使用
SSL
配置服务器的连接 - 使用
Role-based Authorization Strategy
配置用户权限,比如prod、sit环境有不同的账号 - 使用
Gitlab Hook
或Generic Webhook Trigger
来完成自动化任务执行。比如main分支push的时候,指定特定操作
# 总结
工欲善其事,必先利其器。
有了规范之后,执行和落实也是很重要的。
本篇文章从工具使用角度对代码质量管理做了补充,分别介绍了Git、IntelliJ IDEA、Jenkins在实践中的应用,希望对你所有帮助。
祝你变得更强!