本文来自:YangZhoujihuGitLab高级解决方案架构师代码写得越多,越规范是优秀开发者的成长之路,但是很多人对老项目感到力不从心,因为太不规则,大家都会停下来还需要很长时间一起固定,一次性改动太多很难保证可靠性,怎么办?有些语言可以使用Gitdiff挑出修改后的代码进行增量扫描,但是Java很难做到。有人在持续集成中配置了规范扫描工具,但报错后需要在上千行日志中查找,降低了研发效率。Checkstyle是业界知名的开源扫描工具,可以扫描Sun、Google等代码规范,并提供Maven和Gradle插件。本文以Java项目配置Checkstyle扫描工具为例,分享排除这些问题的方法:1、在“合并请求页面”显示代码规范问题,大大提高研发效率;2.增量代码规范报告。下面分别介绍“JavaMaven项目”和“JavaGradle项目”的配置方法。通过极虎GitLabCI顺利实现Java增量代码规范CheckstyleMaven在项目中引入Checkstyle插件并下载代码规范:$vipom.xmlorg.apache.maven.pluginsmaven-checkstyle-plugin3.2.0UTF-8truetrue警告config/checkstyle/checkstyle.xml$mkdir-pconfig/checkstyle/$wgethttps://raw.githubusercontent。com/checkstyle/checkstyle/checkstyle-9.3/src/main/resources/google_checks.xml-Oconfig/checkstyle/checkstyle.xml执行全量扫描命令查看效果:$./mvnwcheckstyle:check[WARN]Demo。java:6:1:缺少Javadoc。[MissingJavadocType][WARN]Demo.java:9:1:该行包含制表符tab。[FileTabCharacter][WARN]Demo.java:9:9:'methoddefmodifier'indented8indentationcharacters,shouldbe2.[Indentation]在GitLab持续集成中执行强制扫描:$vi.gitlab-ci.ymlcheckstyle:script:-./mvnwcheckstyle:check当扫描工具报错时,持续集成退出。如果要查看代码规范问题,需要到日志中搜索。很多持续集成产品只做这一步,但这降低了开发效率,所以极虎GitLab更进一步——收集“代码质量报告”。在项目中引入violations-maven-plugin,它将Checkstyle报告转换成GitLab标准格式。$vipom.xmlse.bjurr.violationsviolations-maven-plugin1.50.4validateviolations000030gl-code-quality-report.jsonINFOVERBOSE99999999trueINFOVERBOSE99true.CHECKSTYLECheckstyle.<模式>.*/target/checkstyle-result\.xml$在极狐GitLabCI中采集代码规范报告:image:eclipse-temurin:8cache:paths:-/root/.m2stages:-lint-buildcheckstyle:allow_failure:truestage:lintscript:-./mvnwcheckstyle:checkartifacts:when:alwaysuntracked:truereport:stage:lintscript:-./mvnwvalidateneeds:-job:checkstyle工件:真实工件:报告:代码质量:gl-code-quality-report.jsoncompile:stage:buildscript:-./mvnwpackage-Dmaven.test.skip=trueartifacts:untracked:true可以看到开发者经常使用的“合并请求”页面直接显示了“代码规范”problem”,让开发者自行修复并提醒review的同事注意,可以有效提高研发效率。老项目的第一个配置代码规范可能有很多错误(比如上图中有7746),没关系,先将规范合并到Trunk中,下次修改代码发起合并请求时,GitLab会显示“增量代码质量报告”,不需要任何复杂的设置。例如只有5个新的下图问题:通过极虎GitLabCICheckstyleGradle顺利实现Java增量代码规范“JavaGradle项目”和“JavaMaven项目”配置方法相同:在项目中引入Checkstyle插件,下载代码规范:$vibuild.gradleplugins{id'checkstyle'}checkstyle{toolVersion='9.3'maxWarnings=0maxErrors=0}$mkdir-pconfig/checkstyle/$wgethttps://raw.githubusercontent.com/checkstyle/checkstyle/checkstyle-9.3/src/main/resources/google_checks.xml-Oconfig/checkstyle/checkstyle.xml执行全盘扫描命令,查看效果:$./gradlewcheck[WARN]Demo.java:6:1:MissingJavadoc.[MissingJavadocType][WARN]Demo.java:9:1:该行包含制表符tab。[FileTabCharacter][WARN]Demo.java:9:9:'methoddefmodifier'缩进了8个缩进字符,应该是2个。[Indentation]在JifoxGitLab持续集成中执行强制扫描:$vi.gitlab-ci.ymlcheckstyle:script:-./gradlewcheck同样在项目中引入violations-maven-plugin,将Checkstyle报告转换成极FoxGitLab标准格式。$vibuild.gradlebuildscript{repositories{maven{url'https://plugins.gradle.org/m2/'}}dependencies{classpath"se.bjurr.violations:violations-gradle-plugin:1.52.2"}}taskviolations(type:se.bjurr.violations.gradle.plugin.ViolationsTask){////可选配置//maxReporterColumnWidth=0//0表示“无限制”maxRuleColumnWidth=60maxSeverityColumnWidth=0maxLineColumnWidth=0maxMessageColumnWidth=50codeClimateFile=file('gl-code-quality-report.json')//将创建一个CodeClimateJSON报告。violationsFile=file('violations-file.json')//将创建规范化的JSON报告。////全局配置,如果你不想报告整个repo的违规行为,请删除。//minSeverity='INFO'//INFO、WARN或ERRORdetailLevel='VERBOSE'//PER_FILE_COMPACT、COMPACT或VERBOSEmaxViolations=99999999//如果发现的违规总数高于pr,构建将失败intViolations=true//将打印在diff中找到的违规////Diff配置,如果您不想报告在特定修订之间更改的//文件的违规,请将其删除。////diff-properties可以提供如下内容:////./gradlewviolations-PdiffFrom=e4de20e-PdiffTo=HEAD////在Travis中,您可以添加:////脚本://-'if["$TRAVIS_PULL_REQUEST"!="false"];然后bash./gradlew检查-PdiffFrom=$TRAVIS_PULL_REQUEST_BRANCH-PdiffTo=$TRAVIS_BRANCH;fi'//diffFrom=project.properties.diffFrom//可以为空(忽略)、Git-commit或任何Git-referencediffTo=project.properties.diffTo//同上diffMinSeverity='INFO'//INFO,WARNorERRORdiffDetailLevel='VERBOSE'//PER_FILE_COMPACT,COMPACTorVERBOSEdiffMaxViolations=99//如果从/到之间的差异中的违规数量更高,则构建将失败diffPrintViolations=true//将打印violationsfoundindiffgitRepo=file('.')//在哪里寻找Git////无论你想报告版本之间的违规行为还是整个repo,这都是强制性的。////更多可用格式,请参阅:https://github.com/tomasbjerre/violations-libviolations=[["CHECKSTYLE",buildDir.path,".*/checkstyle/.*\\.xml\$","Checkstyle"]]}在GitLabCI中收集代码规范报告:image:eclipse-temurin:8cache:paths:-/root/.m2stages:-lint-buildcheckstyle:allow_failure:truestage:lintscript:-./gradlew检查工件:何时:始终未跟踪:truereport:阶段:lint脚本:-./gradlew违规需求:-工作:checkstyle工件:真实工件:报告:codequality:gl-code-quality-report.jsoncompile:阶段:构建脚本:-./gradlewbuild-xcheck-xtestartifacts:untracked:true其余步骤与《JavaGradle项目》一致:开发者经常使用的“mergerequest”页面直接显示“codespecificationissues”供开发者自查-修复并提醒审稿人相同注意,为了有效提高研发效率,老项目的第一个配置代码规范可能会有很多错误(比如上图中有7746)。不需要任何复杂的设置,就会显示“增量代码质量报告”。比如下图中只有5个新问题:就这样,我们通过极虎GitLab顺利实现了Java增量代码规范,让项目代码越来越优雅。