项目自动化

Gradle

  • build.gradle 它是 Gradle 的配置文件.

    build.gradle 本质是是一个 Groovy 脚本, 其中配置就是 Groovy 代码

  • settings.gradle 也是一个 Gradle 配置文件,用来支持多模块。

    整个项目只有一个 settings.gradle , 每个模块都可以有一个 build.gradle

项目地址zeroopen in new window

首先运行 ./gradlew idea 生成IDEA 工程,导入IDEA。

这里有两点需要说明一下。

第一,这里用的 gradlew,它是 Gradle 命令的一个封装,它会自动下载一个构建这个项目所需的 Gradle,重点是通过这个命令锁定了 Gradle 的版本,避免因为构建脚本的差异,造成“你成功我失败”的情况。

第二,IDE 的工程是由 Gradle 生成的。很多人会凭借直觉,用 IDE 直接打开。有一些团队的项目里有好多个构建文件,究竟用哪个打开,不去问人是根本不知道的,这对项目的新人是非常不友好的。生成的做法与前面 Gradle 封装是类似的,它可以避免因为本地安装不同版本 IDE 造成各种问题。另外,因为 IDE 的工程是生成的,如果项目里一旦增加了新的程序库依赖,你只需重新执行一次上面的命令就好了,现在的 IDE 都有很好的自动加载能力,当它检测到工程文件的变化,就会重新加载。

插件配置

Gradle 里,许多能力都是插件形式提供的,比如生成 IDEA 工程就是配置文件里的一句话。

apply plugin: 'idea'

官方插件文档Gradle Plugin Referenceopen in new window

模块配置

首先是分模块。处非代码库非常小,否则分模块是一种必然。一种恰当的方式是根据业务划分代码。比如,用户相关的内容放到一个模块里,把交易订单信息放到一个模块里,把物流信息放到另一个模块里。

如果未来做微服务,每一个模块就可以成为独立的服务。

模块信息都配置在 settings.gradle 中。

rootProject.name = 'geektime-zero'

include 'zero-bootstrap'
include 'zero-identity'

项目依赖配置

例如 zero-bootstrap 依赖 zero-identity

可以在 zero-bootstrap 目录下的 build.gradle加入

project.dependencies {
    implementation(project(':zero-identity'))
}

或者在项目根目录下 build.gradle 加入

configure(subprojects - project(':zero-bootstrap')) {
    project(':zero-bootstrap').dependencies {
        implementation(project)
    }

版本配置

版本配置信息放在 gradle.properties

guavaVersion=31.1-jre
springBootVersion=2.6.4
lombokVersion=1.18.22
mysqlVersion=8.0.27
junitVersion=5.8.2
assertJVersion=3.22.0
mockitoVersion=4.4.0
flywayVersion=8.5.4
jacocoVersion=0.8.7
checkstyleVersion=9.3

目录结构

代码目录结构,在 Java 世界里已经是一件约定俗成的事情了。

src/main/java 下放源代码,src/main/resources 下放配置文件,src/test/java 放测试代码。

这是约定优于配置(Convention over Configuration)思想的体现。

检查

./gradlew check

这个检查会检查什么呢?这取决于配置。在这个项目里,我们应用了 Java 插件,它就可以编译 Java 文件,检查代码是否可以正常编译,运行测试,检查代码是否功能正常等等。但我要求更多。

代码风格检查

最基本的代码风格检查要放在构建脚本里,这里用 CheckStyle 来做这件事。缺省情况下,你只要应用 Checkstyle 插件即可。

apply plugin: 'checkstyle'

代码覆盖率检查

代码覆盖率检查也要放到构建脚本里,这里用 JaCoCo.

apply plugin: 'jacoco'

特别的地方,测试覆盖率固定在100%.

数据库迁移插件

使用 flyway.(仅在本地或开发环境使用)

plugins {
    id "org.flywaydb.flyway" version "5.2.4"
}

下面先要做一些基本的配置,保证可以连接到数据库。


flyway {
    url = 'jdbc:mysql://localhost:3306/zero_test?useUnicode=true&characterEncoding=utf-8&useSSL=false'
    user = 'zero'
    password = 'zero_test'
    locations = ["filesystem:$rootDir/gradle/config/migration"]
}

那么如何修改数据库呢?先添加一个数据库迁移文件,在示例项目中,我创建一个迁移文件(gradle/config/migration/V2022.06.22.16.28__Create_user_table.sql),在其中创建了一个 User 表。

CREATE TABLE zero_users(
    id bigint(20) not null AUTO_INCREMENT,
    name varchar(100) not null unique,
    password varchar(100) not null,
    primary key(id)
);

这里的迁移文件版本,我选择了以时间戳的方式进行命名,还有一种方式是以版本号的方式,比如 V1、V2。时间戳命名方式的好处是,不同的人可以同时开发,命名冲突的几率很小,而采用版本号命名的方式,命名冲突的概率会大一些。

添加好数据库迁移文件之后,只要执行下面这个命令就好:

./gradlew flywayMigrate

这样,对数据库的修改就在数据库里了,你可以打开数据库查看一下。

构建应用

./gradlew build

会在 zero-bootstrap/build/libs 下生成可执行JAR包。此外build 依赖 check 任务,构建前会先对代码进行检查。

打包完成,运行应用

java -jar zero-bootstrap/build/libs/zero-bootstrap-*-boot.jar

开发过程中可以用Gradle 命令运行,

IDEA 中可以找到 Bootstrap 这个类,直接运行。

总结时刻

  • 生成IDEA 工程
  • 编译
  • 打包
  • 运行测试
  • 代码风格检查
  • 测试覆盖率
  • 数据库迁移
  • 运行应用

这里的自动化是一个最基本的示例。实际上几乎所有重复或繁琐的工作,都应该自动化。

项目自动化是持续集成的基础,在持续集成服务上执行的命令,就应该是我们在构建脚本中写好的。

如果今天的内容你只能记住一件事,那请记住:将你的工作过程自动化

Last Updated:
Contributors: mcs