项目自动化
Gradle
build.gradle 它是 Gradle 的配置文件.
build.gradle 本质是是一个 Groovy 脚本, 其中配置就是 Groovy 代码
settings.gradle 也是一个 Gradle 配置文件,用来支持多模块。
整个项目只有一个 settings.gradle , 每个模块都可以有一个 build.gradle
项目地址zero
首先运行 ./gradlew idea
生成IDEA 工程,导入IDEA。
这里有两点需要说明一下。
第一,这里用的 gradlew,它是 Gradle 命令的一个封装,它会自动下载一个构建这个项目所需的 Gradle,重点是通过这个命令锁定了 Gradle 的版本,避免因为构建脚本的差异,造成“你成功我失败”的情况。
第二,IDE 的工程是由 Gradle 生成的。很多人会凭借直觉,用 IDE 直接打开。有一些团队的项目里有好多个构建文件,究竟用哪个打开,不去问人是根本不知道的,这对项目的新人是非常不友好的。生成的做法与前面 Gradle 封装是类似的,它可以避免因为本地安装不同版本 IDE 造成各种问题。另外,因为 IDE 的工程是生成的,如果项目里一旦增加了新的程序库依赖,你只需重新执行一次上面的命令就好了,现在的 IDE 都有很好的自动加载能力,当它检测到工程文件的变化,就会重新加载。
插件配置
Gradle 里,许多能力都是插件形式提供的,比如生成 IDEA 工程就是配置文件里的一句话。
apply plugin: 'idea'
官方插件文档Gradle Plugin Reference
模块配置
首先是分模块。处非代码库非常小,否则分模块是一种必然。一种恰当的方式是根据业务划分代码。比如,用户相关的内容放到一个模块里,把交易订单信息放到一个模块里,把物流信息放到另一个模块里。
如果未来做微服务,每一个模块就可以成为独立的服务。
模块信息都配置在 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 工程
- 编译
- 打包
- 运行测试
- 代码风格检查
- 测试覆盖率
- 数据库迁移
- 运行应用
这里的自动化是一个最基本的示例。实际上几乎所有重复或繁琐的工作,都应该自动化。
项目自动化是持续集成的基础,在持续集成服务上执行的命令,就应该是我们在构建脚本中写好的。
如果今天的内容你只能记住一件事,那请记住:将你的工作过程自动化。