乐趣区

关于后端:Aladdin编码规范Idea插件实践

  1. 背景

 

在软件开发过程中,不标准的代码和违规组件的引⼊经常会导致代码品质降落和给项⽬引⼊⻛险。⽽在继续集成业务中,现有代码标准扫描拦挡发⽣在代码 push 时候,违规组件拦挡发⽣在⽣成构建产物后,发现问题工夫点较晚,为了将品质卡点进⼀步左移、升高研发⼈员因代码准⼊失败造成的返⼯老本、提⾼代码编写品质,须要寻求上述问题场景的解决⽅案。

2. ⽅案

 

通过插件⽅案的调研与验证,咱们基于 intellij 平台开发了 Aladdin 研发插件,插件次要提供增量代码扫描,扫描规定基于 Alibaba 编码标准条款,和研发中⼼组件使⽤规约,提供多种扫描⽅式为:实时增量代码扫描、编译时增量代码扫描、提交前增量扫描、⼿动全局代码扫描、⼿动增量代码扫描。同时提供提交问题拦挡和扫描⽅式配置。

  1. 插件性能实现原理
    3.1 注册 Inspection

想要对代码进⾏扫描,咱们须要向 idea 注册⼀个 Inspection 查看器,当编辑器中代码发⽣变动或者保留代码时,都会调⽤这个查看器,扫描代码,注册渲染问题形容到对应代码中。

● 开发⼀个⾃定义 inspection , ⾸先要注册咱们的增量 inspection, 在插件项⽬中
\src\main\resources\META-INF\plugin.xml 插件配置⽂件中配置咱们的增量⾼危代码剖析 inspection

 
 XML
  
 1       
 <extensions defaultExtensionNs="com.intellij">
 2                           
 <localInspection language="JAVA"
 3                                                                      
 shortName="AladdinCodeStyleP1Incr"
 4                                                                      
 displayName="增量⾼危代码剖析"
 5                                                                      
 hasStaticDescription="true"
 6                                                                      
 enabledByDefault="true"
 7       
                                              implementationClass="com.example.PmdP1IncrInspect ion"
 8                                                                      
 groupName="Aladdin 编码标准"
 9                                                                      
 level="ERROR"
 10                                                                      
 runForWholeFile="true"
 11                    />
 12      </extensions>
 
 

● 注册好 Inspection 后,接下来实现咱们的增量代码剖析性能。当 idea 编辑器中⽂件发⽣变动或被动保留时候,都会触发 inspection 的扫描,⽽ Inspection 可能会有很多,每⼀个都会触发⼀次,因而实时检测对性能要求⽐较⾼。明确增量代码 Inspection 次要有以下⼏件事件要做:

1. 插件启动的时候初始化好 PMD 规定,并依照类型分类到不同的 Inspection 中
2. 只剖析⽬录 src/main/java 下的有代码变动的 Java ⽂件,缩⼩扫描⽂件范畴

3. 调⽤ PMD 实现增量⽂件的扫描, 获取代码存在的问题

4. 依据增量代码⾏来控制代码问题的注册和编辑器中的问题标注显示

初始化规定并进⾏等级分类

⾼危问题 Inspection

继承 PmdBaseInspection 重写 filterByPmdRulePriority()⽅法,将所有⾼危问题纳⼊ PmdP1IncrInspection 中

接下来就是实现 psiElementVisitor 来实现增量代码的扫描和问题注册渲染性能了,这个在下⽂具体介绍

3.2 增量代码实时扫描
3.2.1 增量代码实时扫描原理图

性能阐明:编写代码时,实时对增量 / 变动代码进⾏扫描,并对有问题的代码标红提醒,并提供疾速修复性能和问题解释阐明

⽬的:在存量代码不变动的状况下,心愿对增量的代码进⾏代码问题扫描,防⽌新增代码引⼊代码问题

● 原理图

3.2.2 增量代码实时扫描性能阐明及效果图

● 插件可配置开启实时⾼危增量代码扫描,并提供实时修复倡议。
● 插件代码实时扫描,实时提供问题提醒及示例。如图:

3.2.3 实时增量代码扫描原理

当初⼤局部代码扫描⼯具都是对全量代码进⾏扫描,但在⼀些状况下,如⽼项⽬的存量代码不敢轻易优化,只心愿对增量代码进⾏扫描,防⽌引⼊新的代码问题,对此咱们减少了增量代码扫描的性能,思考到不同的场景对获取增量代码⾏的性能和扫描范畴的要求不同,咱们进⾏了⼀些摸索,最终采⽤了以下两种获取增量代码⾏的⽅式:

这⾥有以下关键点:

1. 实时扫描是对以后⽂件的扫描,对实时性要求⾼,应最⼩老本的实现(采⽤读取 idea 已有的增量⾏数据)
2. 被动扫描,扫描范畴为整个 git 项⽬中增量⽂件和变更⽂件的增量代码⾏,须要咱们⾃⼰实现(这⾥加⼊扫描缓存来升高扫描增量代码⾏老本)

获取以后⽂件代码增量⾏:

⾸先,咱们观测到 idea 自身就帮忙咱们计算了增量⾏数据,编辑器⻚⾯就有体现,间接试⽤ idea 的 api:
project.getLineStatusManager().getLineStatusTracker
获取使⽤即可,如下图所示:

核⼼代码:
1.idea 提供了 PsiElementVisitor 抽象类扩大点 visitFile()可实现代码扫描性能
2. 咱们实现⾃⼰的 PsiElementVisitor,来实现代码问题扫描、注册、渲染的逻辑

3.3 ⾼危组件实时扫描
3.3.1 ⾼危组件实时扫描原理图

性能阐明:对新引⼊或者已批改组件进⾏依赖扫描(依据 Aladdin 已配置的违规组件),包含新引⼊组件的间接或者间接依赖组件。

⽬的:以后阶段,线上在跑带有⾼危组件的应⽤已全副实现治理,为了防⽌新的⾼危组件引⼊,减少了增量组件扫描性能。

● 原理图:

3.3.2 ⾼危组件实时扫描性能阐明及效果图

● ⾼危组件实时扫描并提供修复倡议,仅针对新增加或批改组件
● ⾼危组件配置与 Aladdin 继续集成系统放弃⼀致,且可实时配置⽣效

3.3.3 增量组件扫描原理

实现增量组件扫描有以下关键点:

1. 获取增量组件(git show ⽐对 pom ⽂件变动)
2. 获取增量组件和其依赖组件的依赖关系(idea 曾经帮咱们剖析好了,咱们间接读取 idea 依赖树上的依赖关系)
3. 将增量组件信息传给 Aladdin 继续化集成平台进⾏组件标准扫描并缓存扫描后果

计算增量组件

获取增量组件及其间接依赖 ⻛险剖析 缓存剖析后果

IDEA 曾经将 maven 项⽬的 maven 依赖树解析结束,通过上述过程获取到增量依赖后,可间接从 maven 依赖树中获取增量依赖包下边所有间接依赖。

实现⻛险组件后果⻚⾯渲染 Inspection

3.4 代码提交⾃动扫描

3.4.1 代码提交拦挡扫描原理图

性能阐明:代码 push 时若增量⽂件存在 Block 等级问题将被拦挡揭示,并提醒编译 / 组件依赖 / 代码规约等问题数量,可查看详情
⽬的:心愿对增量代码进⾏编译问题 / 组件依赖问题 / 代码问题扫描拦挡阐明,防⽌⾼危问题脱漏

● 原理图:

3.4.2 代码提交拦挡核⼼性能阐明及效果图

● 代码提交前,插件会进⾏⼀次增量代码扫描,根据 Aladdin 中站点设置的开关进⾏揭示拦挡,以代替体验较差、⽂案不清晰的 Aladdin 拦挡
● 如果存在违规代码,插件会提醒问题类型和个数,其中包含:语法错误问题,P3C ⾼危问题,⾼⻛险组件问题,点击查看详情成果,可在问题列表中查看具体问题,对应类,代码⾏,以及修复倡议

  1. 插件⽤户装置综合使⽤状况

⾃插件上线以来,研发中⼼整体无效⽤户装置量笼罩达到 100%

代码问题拦挡:Gitlab 代码准⼊拦挡向插件拦挡转换状况如下
按周统计,随着插件⽤户使⽤⼈数增多,插件拦挡问题数逐渐增⻓,Gitlab 代码准⼊拦挡问题数逐渐升高,这表明代码问题拦挡逐渐转移到代码开发阶段。

5. 总结 & 瞻望

Aladdin 研发插件提供了⼀系列编码标准和最佳实际,可能⾃动检测代码中潜在问题并给出正告或谬误提醒。使⽤插件有以下益处 :

● 统⼀代码标准:基于 Alibaba 编码标准条款,和研发中⼼组件使⽤规约提供⼀套认可的编码标准。

● 前置发现潜在问题:插件可检测代码中潜在问题,有助于提⾼代码品质和稳定性,将品质问题拦挡左移,升高拦挡打回的老本。

● 标准编码习惯:插件提供很多实⽤的代码提醒和倡议,从⽽写出更强壮的代码。

● 通过扫描新引⼊依赖包:拦挡⻛险组件,防⽌引⼊新的⻛险组件。

 在将来的布局中,咱们将持续对插件进⾏迭代降级

 

1. 开发定制化代码标准,如定制化⽇志标准等,逐渐优化欠缺出适宜咱们⾃⼰的⼀套标准

2. 减少本地的增量单元测试覆盖率性能,实现增量代码覆盖率剖析等

作者介绍

● swj,信也科技后端研发专家,次要负责基⽯

● zhx,信也科技后端研发专家,次要负责 aladdin、rubik、tcm

退出移动版