一、前言

公司一直要求各团队集成sonar检查,且之前也整理过如何通过Jenkins自动构建sonar任务,以及如何在eclipse等IDE本地提前分析sonar问题的文章,但终归需要有一定的管理成本来持续保障其效果。所以近期研究了一下王凯之前发布的几篇帖子,并使用本地化的一个项目实践了一下git-hooks中的pre-commit钩子,可以在提交代码时强制校验本地代码质量,若不符合指定规则则不允许提交,期望减少一些持续性且重复的管理成本,在这里给大家分享一下,供有需要的小伙伴参考。

二、正文

2.1、极简配置说明(不想看详细介绍的直接参考本段进行配置即可)

2.1.1、pom.xml配置

pom.xml中增加配置

	<properties>
		<maven.compiler.source>${java.version}</maven.compiler.source>
		<maven.compiler.target>${java.version}</maven.compiler.target>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<!-- MyBatis -->
		<spring-boot-starter-mybatis-mapper.version>1.1.5</spring-boot-starter-mybatis-mapper.version>

		<!-- git hook -->
		<disable.checks>false</disable.checks>
		<spotbugs-maven-plugin.version>3.1.11</spotbugs-maven-plugin.version>
		<githook-maven-plugin.version>1.0.4</githook-maven-plugin.version>

		<!--<editor-fold desc="PMD">-->
		<pmd-maven-plugin.version>3.8</pmd-maven-plugin.version>
		<p3c-pmd.version>1.3.6</p3c-pmd.version>
	</properties>

	...

	<build>
		<!-- 省略项目配置 -->
		<plugins>
			<!-- 省略项目配置 -->

			<!-- git-commit begin -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-pmd-plugin</artifactId>
				<version>${pmd-maven-plugin.version}</version>
				<configuration>
					<skip>${disable.checks}</skip>
					<sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
					<targetJdk>${java.version}</targetJdk>
					<printFailingErrors>true</printFailingErrors>
					<rulesets>
						<ruleset>rulesets/java/ali-comment.xml</ruleset>
						<ruleset>rulesets/java/ali-concurrent.xml</ruleset>
						<ruleset>rulesets/java/ali-constant.xml</ruleset>
						<ruleset>rulesets/java/ali-exception.xml</ruleset>
						<ruleset>rulesets/java/ali-flowcontrol.xml</ruleset>
						<ruleset>rulesets/java/ali-naming.xml</ruleset>
						<ruleset>rulesets/java/ali-oop.xml</ruleset>
						<ruleset>rulesets/java/ali-orm.xml</ruleset>
						<ruleset>rulesets/java/ali-other.xml</ruleset>
						<ruleset>rulesets/java/ali-set.xml</ruleset>
					</rulesets>
					<printFailingErrors>true</printFailingErrors>
					<!--扫描级别,小于等于这个级别的错误代码将不通过扫描。不配默认是5(这里不推荐使用默认的,否则任何一个规则校验不通过都不允许提交,推荐配置成1,否则可能会出现经常因不满足规则校验而无法提交的情况->当然也可以重新梳理一下规则配置,自定义本团队的规则级别)-->
					<minimumPriority>1</minimumPriority>
				</configuration>
				<executions>
					<execution>
						<id>pmd-check-verify</id>
						<phase>verify</phase>
						<goals>
							<goal>check</goal>
						</goals>
					</execution>
					<execution>
						<id>pmd-pmd-site</id>
						<phase>site</phase>
						<goals>
							<goal>pmd</goal>
						</goals>
					</execution>
				</executions>
				<dependencies>
					<dependency>
						<groupId>com.alibaba.p3c</groupId>
						<artifactId>p3c-pmd</artifactId>
						<version>${p3c-pmd.version}</version>
					</dependency>
				</dependencies>
			</plugin>
			<!-- 代码检查工具有很多,是否同时启用阿里巴巴的检查规范和spotbugs看各自需要 -->
			<!--
			<plugin>
				<groupId>com.github.spotbugs</groupId>
				<artifactId>spotbugs-maven-plugin</artifactId>
				<version>${spotbugs-maven-plugin.version}</version>
				<executions>
					<execution>
						<id>spotbugs-check-verify</id>
						<phase>verify</phase>
						<goals>
							<goal>check</goal>
						</goals>
					</execution>
					<execution>
						<id>spotbugs-spotbugs-site</id>
						<phase>site</phase>
						<goals>
							<goal>spotbugs</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<skip>${disable.checks}</skip>
				</configuration>
				<dependencies>
					<dependency>
						<groupId>com.github.spotbugs</groupId>
						<artifactId>spotbugs</artifactId>
						<version>4.0.0-beta1</version>
					</dependency>
				</dependencies>
			</plugin>
			-->
			<plugin>
				<groupId>io.github.phillipuniverse</groupId>
				<artifactId>githook-maven-plugin</artifactId>
				<version>1.0.4</version>
				<executions>
					<execution>
						<goals>
							<goal>install</goal>
						</goals>
						<configuration>
							<hooks>
								<!-- 注意这里是调用shell命令去执行mvn命令,默认生成的hook文件执行路径可能与项目的pom.xml文件不一致,所以我这里用`-f`重新指定了本项目的pom文件路径 -->
								<pre-commit>
									echo running validation build
									exec mvn clean install -f 40_source//你的项目文件夹//pom.xml
								</pre-commit>
							</hooks>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<!-- git-commit end -->
		</plugins>
	
	...

	<!-- 在pom的根节点project下面增加以下配置(用于友好的显示错误提示) -->
	<reporting>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jxr-plugin</artifactId>
				<version>3.0.0</version>
			</plugin>
		</plugins>
	</reporting>

2.1.2、编译项目

在这里插入图片描述

直接在pom.xml所在路径执行mvn clean compile

2.1.3、确认git-hook脚本成功生成

确认项目根路径\.git\hooks\pre-commit脚本存在(注意文件没有后缀名,默认有一些.sample的文件是模板,默认是不生效的,只有去掉后缀才会生效)

在这里插入图片描述
确认脚本中的命令都可以正常执行

好了,可以开始使用你的git hook了

2.2、maven集成及使用

2.2.1、组件集成

参考2.1.1、pom.xml配置修改pom.xml文件即可

2.2.2、组件使用

在这里插入图片描述
在这里插入图片描述

首次配置完毕需要使用maven构建一下项目(可以执行mvn clean compile),生成git-hooks中的pre-commit命令
在这里插入图片描述
每次执行git的commit命令时都会先调用pre-commit这个文件的命令,配合我们的组件检查代码质量,如果检查不通过则会返回非0,提交不成功(注意各自项目的pom.xml文件路径,我这里写的是我自己项目的相对路径,如果不一样需要各项目组自行修改)

2.2.3、结果验证

在这里插入图片描述
保证项目中有不符合条件的代码,且符合不通过的级别校验,并尝试使用命令提交,可以看到代码校验失败了(其实直接使用mvn clean compile命令也可以看到相同的错误,但只有在git-hook中报错才会影响git命令,因为其退出码不是0,不符合git-hook的退出条件了)

在这里插入图片描述
可以使用git status确认,变更未提交成功

在这里插入图片描述
我们调整一下级别,只校验最严重级别的规则(需要确保本地没有级别为1的规则校验不通过代码,否则依然会失败)

在这里插入图片描述
成功提交

2.3、IDEA集成及使用

2.3.1、组件集成

在这里插入图片描述
在这里插入图片描述
在IDEA的File->Settings->Plugins->Marketplace中分别搜索并安装Alibaba Java Coding GuidelinesPMDPlugin(后者非必须,这两个可以单独校验代码质量,本文中用的是阿里的规则,所以第一个组件校验已经满足工作需要了)

2.3.2、组件使用

在这里插入图片描述
可以在上图位置中切换中英文

在这里插入图片描述
在项目上右键选择Alibaba Coding Guidelines Analyze中文是编码规约,快捷键为Ctrl+Alt+Shift+J

在这里插入图片描述
在窗口中查看检查结果,并逐个修复问题

在这里插入图片描述

可以自行调整规则生效策略

2.3.3、结果验证

在这里插入图片描述
确保项目存在不通过校验的代码,并尝试提交

在这里插入图片描述
这里可以看到提交失败,可以查看具体错误提示,我们修改校验级别为1后重试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改后再次尝试提交,从控制台及提交记录来看我们确实提交成功了

三、结语

工具毕竟是工具,能做的也只是辅助我们做一些工作,所以核心还是让大家识别到哪些代码不应该写或不能写,然后从编码之初就要规避。
因为增加了提交前的代码检查,所以提交周期会比原来要长,大项目提交前的代码检查可能都需要很久,所以大家应尽量保证提交前已经使用本地工具检查过且都符合规则了,否则反复尝试提交的时间损耗也是很可观的。至于效率和规范如何平衡则需要各团队自行控制了。

四、参考资料

扩展阿里巴巴Java开发规约插件 https://juejin.im/post/6844904114497781768

自定义-Git-Git-钩子 https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90

eclipse配置sonarLint https://blog.csdn.net/leandzgc/article/details/103036738

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐