git-hooks之pre-commit maven应用

一、前言

公司一直要求各团队集成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-8project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
		<java.version>1.8java.version>
		
		<spring-boot-starter-mybatis-mapper.version>1.1.5spring-boot-starter-mybatis-mapper.version>

		
		<disable.checks>falsedisable.checks>
		<spotbugs-maven-plugin.version>3.1.11spotbugs-maven-plugin.version>
		<githook-maven-plugin.version>1.0.4githook-maven-plugin.version>

		
		<pmd-maven-plugin.version>3.8pmd-maven-plugin.version>
		<p3c-pmd.version>1.3.6p3c-pmd.version>
	properties>

	...

	<build>
		
		<plugins>
			

			
			<plugin>
				<groupId>org.apache.maven.pluginsgroupId>
				<artifactId>maven-pmd-pluginartifactId>
				<version>${pmd-maven-plugin.version}version>
				<configuration>
					<skip>${disable.checks}skip>
					<sourceEncoding>${project.build.sourceEncoding}sourceEncoding>
					<targetJdk>${java.version}targetJdk>
					<printFailingErrors>trueprintFailingErrors>
					<rulesets>
						<ruleset>rulesets/java/ali-comment.xmlruleset>
						<ruleset>rulesets/java/ali-concurrent.xmlruleset>
						<ruleset>rulesets/java/ali-constant.xmlruleset>
						<ruleset>rulesets/java/ali-exception.xmlruleset>
						<ruleset>rulesets/java/ali-flowcontrol.xmlruleset>
						<ruleset>rulesets/java/ali-naming.xmlruleset>
						<ruleset>rulesets/java/ali-oop.xmlruleset>
						<ruleset>rulesets/java/ali-orm.xmlruleset>
						<ruleset>rulesets/java/ali-other.xmlruleset>
						<ruleset>rulesets/java/ali-set.xmlruleset>
					rulesets>
					<printFailingErrors>trueprintFailingErrors>
					
					<minimumPriority>1minimumPriority>
				configuration>
				<executions>
					<execution>
						<id>pmd-check-verifyid>
						<phase>verifyphase>
						<goals>
							<goal>checkgoal>
						goals>
					execution>
					<execution>
						<id>pmd-pmd-siteid>
						<phase>sitephase>
						<goals>
							<goal>pmdgoal>
						goals>
					execution>
				executions>
				<dependencies>
					<dependency>
						<groupId>com.alibaba.p3cgroupId>
						<artifactId>p3c-pmdartifactId>
						<version>${p3c-pmd.version}version>
					dependency>
				dependencies>
			plugin>
			
			
			<plugin>
				<groupId>io.github.phillipuniversegroupId>
				<artifactId>githook-maven-pluginartifactId>
				<version>1.0.4version>
				<executions>
					<execution>
						<goals>
							<goal>installgoal>
						goals>
						<configuration>
							<hooks>
								
								<pre-commit>
									echo running validation build
									exec mvn clean install -f 40_source//你的项目文件夹//pom.xml
								pre-commit>
							hooks>
						configuration>
					execution>
				executions>
			plugin>
			
		plugins>
	
	...

	
	<reporting>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.pluginsgroupId>
				<artifactId>maven-jxr-pluginartifactId>
				<version>3.0.0version>
			plugin>
		plugins>
	reporting>

2.1.2、编译项目

在这里插入图片描述

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

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

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

git-hooks之pre-commit maven应用_第1张图片
确认脚本中的命令都可以正常执行

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

2.2、maven集成及使用

2.2.1、组件集成

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

2.2.2、组件使用

在这里插入图片描述
git-hooks之pre-commit maven应用_第2张图片

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

2.2.3、结果验证

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

git-hooks之pre-commit maven应用_第5张图片
可以使用git status确认,变更未提交成功

git-hooks之pre-commit maven应用_第6张图片
我们调整一下级别,只校验最严重级别的规则(需要确保本地没有级别为1的规则校验不通过代码,否则依然会失败)

git-hooks之pre-commit maven应用_第7张图片
成功提交

2.3、IDEA集成及使用

2.3.1、组件集成

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

2.3.2、组件使用

git-hooks之pre-commit maven应用_第10张图片
可以在上图位置中切换中英文

git-hooks之pre-commit maven应用_第11张图片
在项目上右键选择Alibaba Coding Guidelines Analyze中文是编码规约,快捷键为Ctrl+Alt+Shift+J

git-hooks之pre-commit maven应用_第12张图片
在窗口中查看检查结果,并逐个修复问题

git-hooks之pre-commit maven应用_第13张图片

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

2.3.3、结果验证

git-hooks之pre-commit maven应用_第14张图片
确保项目存在不通过校验的代码,并尝试提交

git-hooks之pre-commit maven应用_第15张图片
这里可以看到提交失败,可以查看具体错误提示,我们修改校验级别为1后重试

git-hooks之pre-commit maven应用_第16张图片
git-hooks之pre-commit maven应用_第17张图片
在这里插入图片描述
修改后再次尝试提交,从控制台及提交记录来看我们确实提交成功了

三、结语

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

四、参考资料

扩展阿里巴巴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

你可能感兴趣的:(经验分享,技术)