本文来自:
杨周 极狐GitLab 高级解决方案架构师
代码越写越标准是优良开发者的成长之路,但很多人对老我的项目感到有心无力,因为太不标准了,所有人停下来一起修复也要花费很长时间,而且一次改变太多难以确保可靠性,怎么办?
有的语言能够借助 Git diff 把本次批改的代码挑出来,实现增量扫描,但 Java 很难这么做。
有的人在继续集成里配置了标准扫描工具,但报错之后须要在成千上万行 log 里查找,升高了研发效率。
Checkstyle 是业界出名的开源扫描工具,可扫描 Sun、Google 等代码标准,提供Maven、Gradle 插件。本文以 Java 我的项目配置 Checkstyle 扫描工具为例,分享毁灭这些问题的方法:
1. 将代码标准问题显示在「合并申请页面」,大幅度提高研发效率;
2. 增量代码标准报告。
下文别离介绍「Java Maven 我的项目」和「Java Gradle 我的项目」的配置办法。
通过极狐GitLab CI 平滑落地 Java 增量代码标准Checkstyle Maven
在我的项目中引入 Checkstyle 插件,并下载代码标准:
$ vi pom.xml<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-checkstyle-plugin</artifactId> <version>3.2.0</version> <configuration> <encoding>UTF-8</encoding> <consoleOutput>true</consoleOutput> <failsOnError>true</failsOnError> <violationSeverity>warning</violationSeverity> <configLocation>config/checkstyle/checkstyle.xml</configLocation> </configuration> </plugin>$ mkdir -p config/checkstyle/$ wget https://raw.githubusercontent.com/checkstyle/checkstyle/checkstyle-9.3/src/main/resources/google_checks.xml -O config/checkstyle/checkstyle.xml
执行全量扫描命令,查看成果:
$ ./mvnw checkstyle:check[WARN] Demo.java:6:1: 短少 Javadoc 。 [MissingJavadocType][WARN] Demo.java:9:1: 行内含有制表符 tab 。 [FileTabCharacter][WARN] Demo.java:9:9: 'method def modifier' 缩进了8个缩进符,应为2个。 [Indentation]
在极狐GitLab 继续集成中执行强制扫描:
$ vi .gitlab-ci.ymlcheckstyle: script: - ./mvnw checkstyle:check
当扫描工具报错,继续集成退出,想看代码标准问题,须要到 log 中查找。很多继续集成产品只做到了这一步,但这升高了开发效率,因而极狐GitLab 更进一步——采集「代码品质报告」。
在我的项目中引入 violations-maven-plugin,它会将 Checkstyle 报告转换成极狐GitLab 规范格局。
$ vi pom.xml<plugin> <groupId>se.bjurr.violations</groupId> <artifactId>violations-maven-plugin</artifactId> <version>1.50.4</version> <executions> <execution> <phase>validate</phase> <goals> <goal>violations</goal> </goals> <configuration> <!-- Optional config --> <!-- 0 is disabled --> <maxReporterColumnWidth>0</maxReporterColumnWidth> <maxRuleColumnWidth>0</maxRuleColumnWidth> <maxSeverityColumnWidth>0</maxSeverityColumnWidth> <maxLineColumnWidth>0</maxLineColumnWidth> <maxMessageColumnWidth>30</maxMessageColumnWidth> <!-- Will create a CodeClimate JSON report. --> <codeClimateFile>gl-code-quality-report.json</codeClimateFile> <!-- Global configuration, remove if you dont want to report violations for the entire repo. --> <!-- INFO, WARN or ERROR --> <minSeverity>INFO</minSeverity> <!-- PER_FILE_COMPACT, COMPACT or VERBOSE --> <detailLevel>VERBOSE</detailLevel> <!-- Will fail the build if total number of found violations is higher --> <maxViolations>99999999</maxViolations> <!-- Will print violations found in diff --> <printViolations>true</printViolations> <!-- Diff configuration, remove if you dont want to report violations for files changed between specific revisions. --> <!-- Can be empty (ignored), Git-commit or any Git-reference --> <diffFrom></diffFrom> <!-- Same as above --> <diffTo></diffTo> <!-- INFO, WARN or ERROR --> <diffMinSeverity>INFO</diffMinSeverity> <!-- PER_FILE_COMPACT, COMPACT or VERBOSE --> <diffDetailLevel>VERBOSE</diffDetailLevel> <!-- Will fail the build if number of violations, in the diff within from/to, is higher --> <diffMaxViolations>99</diffMaxViolations> <!-- Will print violations found in diff --> <diffPrintViolations>true</diffPrintViolations> <!-- Where to look for Git --> <gitRepo>.</gitRepo> <!-- This is mandatory regardless of if you want to report violations between revisions or the entire repo. --> <violations> <violation> <parser>CHECKSTYLE</parser> <reporter>Checkstyle</reporter> <folder>.</folder> <pattern>.*/target/checkstyle-result\.xml$</pattern> </violation> </violations> </configuration> </execution> </executions></plugin>
在极狐GitLab CI 中采集代码标准报告:
image: eclipse-temurin:8cache: paths: - /root/.m2stages: - lint - buildcheckstyle: allow_failure: true stage: lint script: - ./mvnw checkstyle:check artifacts: when: always untracked: truereport: stage: lint script: - ./mvnw validate needs: - job: checkstyle artifacts: true artifacts: reports: codequality: gl-code-quality-report.jsoncompile: stage: build script: - ./mvnw package -Dmaven.test.skip=true artifacts: untracked: true
能够看到在开发人员频繁应用的「合并申请」页面,间接显示了「代码标准问题」,供开发人员自助修复以及揭示评审的共事留神,这样能够无效进步研发效率。
老我的项目第一次配置代码标准可能会呈现很多谬误(比方上图有 7746 个),没关系,先将标准合并进入骨干,下次批改代码发动合并申请时,极狐GitLab 将展现「增量代码品质报告」,而无需任何简单设置。比方下图就只有 5 个新问题了:
通过极狐GitLab CI 平滑落地 Java 增量代码标准 Checkstyle Gradle
「Java Gradle 我的项目」和「Java Maven 我的项目」的配置办法统一:
在我的项目中引入 Checkstyle 插件,并下载代码标准:
$ vi build.gradleplugins { id 'checkstyle'}checkstyle { toolVersion = '9.3' maxWarnings = 0 maxErrors = 0}$ mkdir -p config/checkstyle/$ wget https://raw.githubusercontent.com/checkstyle/checkstyle/checkstyle-9.3/src/main/resources/google_checks.xml -O config/checkstyle/checkstyle.xml
执行全量扫描命令,查看成果:
$ ./gradlew check[WARN] Demo.java:6:1: 短少 Javadoc 。 [MissingJavadocType][WARN] Demo.java:9:1: 行内含有制表符 tab 。 [FileTabCharacter][WARN] Demo.java:9:9: 'method def modifier' 缩进了8个缩进符,应为2个。 [Indentation]
在极狐GitLab 继续集成中执行强制扫描:
$ vi .gitlab-ci.ymlcheckstyle: script: - ./gradlew check
同样,在我的项目中引入 violations-maven-plugin,它会将 Checkstyle 报告转换成极狐 GitLab 规范格局。
$ vi build.gradlebuildscript { repositories { maven { url 'https://plugins.gradle.org/m2/' } } dependencies { classpath "se.bjurr.violations:violations-gradle-plugin:1.52.2" }}task violations(type: se.bjurr.violations.gradle.plugin.ViolationsTask) { // // Optional config // maxReporterColumnWidth = 0 // 0 means "no limit" maxRuleColumnWidth = 60 maxSeverityColumnWidth = 0 maxLineColumnWidth = 0 maxMessageColumnWidth = 50 codeClimateFile = file('gl-code-quality-report.json') // Will create a CodeClimate JSON report. violationsFile = file('violations-file.json') // Will create a normalized JSON report. // // Global configuration, remove if you dont want to report violations for // the entire repo. // minSeverity = 'INFO' // INFO, WARN or ERROR detailLevel = 'VERBOSE' // PER_FILE_COMPACT, COMPACT or VERBOSE maxViolations = 99999999 // Will fail the build if total number of found violations is higher printViolations = true // Will print violations found in diff // // Diff configuration, remove if you dont want to report violations for // files changed between specific revisions. // // diff-properties can be supplied with something like: // // ./gradlew violations -PdiffFrom=e4de20e -PdiffTo=HEAD // // And in Travis, you could add: // // script: // - 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then bash ./gradlew check -PdiffFrom=$TRAVIS_PULL_REQUEST_BRANCH -PdiffTo=$TRAVIS_BRANCH ; fi' // diffFrom = project.properties.diffFrom // Can be empty (ignored), Git-commit or any Git-reference diffTo = project.properties.diffTo // Same as above diffMinSeverity = 'INFO' // INFO, WARN or ERROR diffDetailLevel = 'VERBOSE' // PER_FILE_COMPACT, COMPACT or VERBOSE diffMaxViolations = 99 // Will fail the build if number of violations, in the diff within from/to, is higher diffPrintViolations = true // Will print violations found in diff gitRepo = file('.') // Where to look for Git // // This is mandatory regardless of if you want to report violations between // revisions or the entire repo. // // Many more formats available, see: https://github.com/tomasbjerre/violations-lib violations = [ ["CHECKSTYLE", buildDir.path, ".*/checkstyle/.*\\.xml\$", "Checkstyle"] ]}
在极狐GitLab CI 中采集代码标准报告:
image: eclipse-temurin:8cache: paths: - /root/.m2stages: - lint - buildcheckstyle: allow_failure: true stage: lint script: - ./gradlew check artifacts: when: always untracked: truereport: stage: lint script: - ./gradlew violations needs: - job: checkstyle artifacts: true artifacts: reports: codequality: gl-code-quality-report.jsoncompile: stage: build script: - ./gradlew build -x check -x test artifacts: untracked: true
残余步骤与「Java Gradle 我的项目」统一:开发人员频繁应用的「合并申请」页面,间接显示了「代码标准问题」,供开发人员自助修复以及揭示评审的共事留神,无效进步研发效率。
老我的项目第一次配置代码标准可能会呈现很多谬误(比方上图有 7746 个),没关系,先将标准合并进入骨干,下次批改代码发动合并申请时,极狐GitLab 将展现「增量代码品质报告」,而无需任何简单设置,比方下图只有 5 个新问题:
这样,咱们就通过极狐GitLab 平滑落地了 Java 增量代码标准,让我的项目代码越来越优雅。