From b911c78f98f7784a930d56de8e1fccf1ba28b2e4 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Mon, 14 Apr 2025 14:07:21 -0500 Subject: [PATCH] Throw `VerificationException` for build verification failures Verification failures are generally failures which verify correctness, e.g., failures caused by test, compilation, linting, etc. Non-verification failures are generally failures related to the build toolchain, e.g., failures caused by dependency resolution, build configuration, etc. Develocity attempts to classify failures based on context, but it doesn't always classify correctly. By default, most failures are classified as non-verification. By explicitly throwing a `VerificationException` for verification task failures, the failures will be appropriately classified. See also: https://docs.gradle.com/develocity/failure-classification Signed-off-by: Eric Haag --- .../boot/build/architecture/ArchitectureCheck.java | 4 ++-- .../java/org/springframework/boot/build/bom/CheckBom.java | 4 ++-- .../CheckAdditionalSpringConfigurationMetadata.java | 4 ++-- .../context/properties/CheckSpringConfigurationMetadata.java | 4 ++-- .../boot/build/springframework/CheckFactoriesFile.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureCheck.java b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureCheck.java index de967e41762f..82642af49b05 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureCheck.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/architecture/ArchitectureCheck.java @@ -31,7 +31,6 @@ import com.tngtech.archunit.lang.ArchRule; import com.tngtech.archunit.lang.EvaluationResult; import org.gradle.api.DefaultTask; -import org.gradle.api.GradleException; import org.gradle.api.Task; import org.gradle.api.Transformer; import org.gradle.api.file.DirectoryProperty; @@ -49,6 +48,7 @@ import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.SkipWhenEmpty; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.VerificationException; /** * {@link Task} that checks for architecture problems. @@ -86,7 +86,7 @@ void checkArchitecture() throws IOException { File outputFile = getOutputDirectory().file("failure-report.txt").get().getAsFile(); writeViolationReport(violations, outputFile); if (!violations.isEmpty()) { - throw new GradleException("Architecture check failed. See '" + outputFile + "' for details."); + throw new VerificationException("Architecture check failed. See '" + outputFile + "' for details."); } } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java b/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java index 585fd149fb05..2f635e985079 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/bom/CheckBom.java @@ -34,7 +34,6 @@ import org.apache.maven.artifact.versioning.Restriction; import org.apache.maven.artifact.versioning.VersionRange; import org.gradle.api.DefaultTask; -import org.gradle.api.GradleException; import org.gradle.api.artifacts.ConfigurationContainer; import org.gradle.api.artifacts.dsl.DependencyHandler; import org.gradle.api.file.RegularFile; @@ -44,6 +43,7 @@ import org.gradle.api.tasks.PathSensitive; import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.VerificationException; import org.springframework.boot.build.bom.Library.Group; import org.springframework.boot.build.bom.Library.ImportedBom; @@ -94,7 +94,7 @@ void checkBom() { System.out.println(); errors.forEach(System.out::println); System.out.println(); - throw new GradleException("Bom check failed. See previous output for details."); + throw new VerificationException("Bom check failed. See previous output for details."); } } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckAdditionalSpringConfigurationMetadata.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckAdditionalSpringConfigurationMetadata.java index 8405dc445f08..68aa2c07823c 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckAdditionalSpringConfigurationMetadata.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckAdditionalSpringConfigurationMetadata.java @@ -31,7 +31,6 @@ import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; -import org.gradle.api.GradleException; import org.gradle.api.file.FileTree; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.tasks.InputFiles; @@ -40,6 +39,7 @@ import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.SourceTask; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.VerificationException; /** * {@link SourceTask} that checks additional Spring configuration metadata files. @@ -70,7 +70,7 @@ void check() throws JsonParseException, IOException { File reportFile = getReportLocation().get().getAsFile(); Files.write(reportFile.toPath(), report, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); if (report.hasProblems()) { - throw new GradleException( + throw new VerificationException( "Problems found in additional Spring configuration metadata. See " + reportFile + " for details."); } } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckSpringConfigurationMetadata.java b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckSpringConfigurationMetadata.java index f1bff685cd86..0415267ee332 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckSpringConfigurationMetadata.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/context/properties/CheckSpringConfigurationMetadata.java @@ -30,7 +30,6 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.gradle.api.DefaultTask; -import org.gradle.api.GradleException; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.provider.ListProperty; import org.gradle.api.tasks.Input; @@ -40,6 +39,7 @@ import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.SourceTask; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.VerificationException; /** * {@link SourceTask} that checks {@code spring-configuration-metadata.json} files. @@ -70,7 +70,7 @@ void check() throws JsonParseException, IOException { File reportFile = getReportLocation().get().getAsFile(); Files.write(reportFile.toPath(), report, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); if (report.hasProblems()) { - throw new GradleException( + throw new VerificationException( "Problems found in Spring configuration metadata. See " + reportFile + " for details."); } } diff --git a/buildSrc/src/main/java/org/springframework/boot/build/springframework/CheckFactoriesFile.java b/buildSrc/src/main/java/org/springframework/boot/build/springframework/CheckFactoriesFile.java index 9c4227fd1b5c..770c89534c40 100644 --- a/buildSrc/src/main/java/org/springframework/boot/build/springframework/CheckFactoriesFile.java +++ b/buildSrc/src/main/java/org/springframework/boot/build/springframework/CheckFactoriesFile.java @@ -31,7 +31,6 @@ import java.util.Properties; import org.gradle.api.DefaultTask; -import org.gradle.api.GradleException; import org.gradle.api.Task; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.FileCollection; @@ -43,6 +42,7 @@ import org.gradle.api.tasks.PathSensitivity; import org.gradle.api.tasks.SkipWhenEmpty; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.VerificationException; import org.gradle.language.base.plugins.LifecycleBasePlugin; import org.springframework.core.io.support.SpringFactoriesLoader; @@ -112,7 +112,7 @@ private void check(File factoriesFile) { File outputFile = getOutputDirectory().file("failure-report.txt").get().getAsFile(); writeReport(factoriesFile, problems, outputFile); if (!problems.isEmpty()) { - throw new GradleException("%s check failed. See '%s' for details".formatted(this.path, outputFile)); + throw new VerificationException("%s check failed. See '%s' for details".formatted(this.path, outputFile)); } }