Spring Boot 计算Gradle缓存指纹时忽略文件

8ljdwjyq  于 2023-02-04  发布在  Spring
关注(0)|答案(1)|浏览(117)

在我的项目中,我在运行时访问由gradle springboot插件buildInfo()任务生成的build-info.properties,以将我的项目版本包含在日志元数据中。
我的问题是,该文件包含在Gradle任务(例如通过类路径指纹进行测试)的指纹计算中,但该文件中的版本会随着我的管道中的每个构建而变化,因此我永远无法重用该缓存。
我看到this问题是关于如何从运行时中排除该文件,但如果我遵循该建议,
文件在运行时自然就不可用了。
文件/BOOT-INF/class/META-INF/www.example.com是空的。2因此我的应用程序在启动时失败。build-info.properties is empty. Therefore my application fails on startup.
我能以某种方式将其排除在缓存指纹计算之外吗?
编辑:
我目前使用的是Gradle 6.8.1和Spring Bot 2.2.2。
下面是我生成文件的方法:

springBoot {
    buildInfo()
}

这就是我如何添加规范化:

normalization {
    runtimeClasspath {
        ignore "**/build-info.properties"
    }
}
2hh7jdfx

2hh7jdfx1#

Gradle输入规范化应该是一个解决方案。

normalization {
    runtimeClasspath {
        ignore '**/build-info.properties'
    }
}

不知道你为什么说“如果我按照建议,文件在运行时不可用了”。
此配置的效果是,对www.example.com的更改build-info.properties将被忽略,以进行最新检查和构建缓存键计算。注意,这不会更改测试任务的运行时行为-即,任何测试仍然能够加载build-info.properties,并且运行时类路径仍然与以前相同。
下面是一些证明上述内容的测试

第一次运行生成

./gradlew build  -Pversion=0.0.1 --console=plain
> Task :bootBuildInfo
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes
> Task :resolveMainClassName
> Task :bootJar
> Task :jar
> Task :assemble
> Task :compileTestJava UP-TO-DATE
> Task :processTestResources UP-TO-DATE
> Task :testClasses UP-TO-DATE
> Task :test
> Task :check
> Task :build

test任务已执行,因为没有生成缓存。

使用不同版本第二次运行构建

./gradlew build  -Pversion=0.0.2 --console=plain
> Task :bootBuildInfo
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes
> Task :resolveMainClassName UP-TO-DATE
> Task :bootJar
> Task :jar
> Task :assemble
> Task :compileTestJava UP-TO-DATE
> Task :processTestResources UP-TO-DATE
> Task :testClasses UP-TO-DATE
> Task :test UP-TO-DATE
> Task :check UP-TO-DATE
> Task :build

正如您所看到的,只执行了构建任务,但test任务仍然是UP-TO-DATE
build-info.propertiesbuild/resources/main/META-INF/下仍然可用

build.artifact=demo
build.group=com.example
build.name=demo
build.time=2023-02-01T18\:32\:03.871040Z
build.version=0.0.2

如果启用,可使用Sping Boot 执行器端点/actuator/info进行访问

{
    "build": {
        "artifact": "demo",
        "name": "demo",
        "version": "0.0.2",
        "group": "com.example"
    }
}

考虑排除构建时间通过从构建信息中排除时间,可以进行更多优化。

springBoot {
    buildInfo {
        excludes = ['time']
    }
}

通常优化本地构建是一个好主意。否则build任务将总是被执行。通过排除时间,所有任务将被缓存

./gradlew build --console=plain
> Task :bootBuildInfo UP-TO-DATE
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :resolveMainClassName UP-TO-DATE
> Task :bootJar UP-TO-DATE
> Task :jar UP-TO-DATE
> Task :assemble UP-TO-DATE
> Task :compileTestJava UP-TO-DATE
> Task :processTestResources UP-TO-DATE
> Task :testClasses UP-TO-DATE
> Task :test UP-TO-DATE
> Task :check UP-TO-DATE
> Task :build UP-TO-DATE

build.time将不是build-info.properties的一部分

build.artifact=demo
build.group=com.example
build.name=demo
build.version=0.0.1-SNAPSHOT

相关问题