From d55cb12cddb7639b9ccd5ea30ce3e0823ecb98a6 Mon Sep 17 00:00:00 2001 From: "Philip K. Warren" Date: Thu, 23 Apr 2026 09:54:03 -0500 Subject: [PATCH 1/2] Add missing inputs and outputs to Gradle exec tasks Update Gradle exec tasks to declare their inputs and outputs, so that tasks won't run multiple times (especially those that interact with the BSR, potentially leading to rate limiting). This is seen in CI runs where `make generate` and `make build` run the same generation and export steps. --- buf.gen.yaml | 1 - build.gradle.kts | 61 ++++++++++++++++--- conformance/buf.gen.yaml | 1 - conformance/build.gradle.kts | 8 ++- .../proto/buf.gen.cel.testtypes.yaml | 2 +- src/test/resources/proto/buf.gen.cel.yaml | 2 +- src/test/resources/proto/buf.gen.imports.yaml | 2 +- .../resources/proto/buf.gen.noimports.yaml | 2 +- 8 files changed, 63 insertions(+), 16 deletions(-) diff --git a/buf.gen.yaml b/buf.gen.yaml index 3d3c5a49..3cb08a7c 100644 --- a/buf.gen.yaml +++ b/buf.gen.yaml @@ -1,5 +1,4 @@ version: v2 -clean: true plugins: - remote: buf.build/protocolbuffers/java:$protocJavaPluginVersion out: build/generated/sources/bufgen diff --git a/build.gradle.kts b/build.gradle.kts index b4d1ba59..ae7f1815 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -56,6 +56,7 @@ tasks.register("configureBuf") { tasks.register("installLicenseHeader") { description = "Installs the Buf license-header CLI." environment("GOBIN", bufLicenseHeaderCLIFile.parentFile.absolutePath) + inputs.property("bufVersion", libs.versions.buf.get()) outputs.file(bufLicenseHeaderCLIFile) commandLine("go", "install", "github.com/bufbuild/buf/private/pkg/licenseheader/cmd/license-header@v${libs.versions.buf.get()}") } @@ -81,8 +82,11 @@ tasks.register("licenseHeader") { } tasks.register("filterBufGenYaml") { - from(".") - include("buf.gen.yaml", "src/**/buf*gen*.yaml") + from(files("buf.gen.yaml")) + from("src/test/resources/proto") { + include("buf*gen*.yaml") + into("src/test/resources/proto") + } includeEmptyDirs = false into(layout.buildDirectory.dir("buf-gen-templates")) expand("protocJavaPluginVersion" to "v${libs.versions.protobuf.get().substringAfter('.')}") @@ -92,11 +96,16 @@ tasks.register("filterBufGenYaml") { tasks.register("generateTestSourcesImports") { dependsOn("exportProtovalidateModule", "filterBufGenYaml") description = "Generates code with buf generate --include-imports for unit tests." + val template = layout.buildDirectory.file("buf-gen-templates/src/test/resources/proto/buf.gen.imports.yaml") + inputs.files(buf) + inputs.file(template) + inputs.dir("src/test/resources/proto") + outputs.dir(layout.buildDirectory.dir("generated/test-sources/bufgen-imports")) commandLine( buf.asPath, "generate", "--template", - "${layout.buildDirectory.get()}/buf-gen-templates/src/test/resources/proto/buf.gen.imports.yaml", + template.get().asFile.absolutePath, "--include-imports", ) } @@ -104,22 +113,33 @@ tasks.register("generateTestSourcesImports") { tasks.register("generateTestSourcesNoImports") { dependsOn("exportProtovalidateModule", "filterBufGenYaml") description = "Generates code with buf generate --include-imports for unit tests." + val template = layout.buildDirectory.file("buf-gen-templates/src/test/resources/proto/buf.gen.noimports.yaml") + inputs.files(buf) + inputs.file(template) + inputs.dir("src/main/resources") + inputs.dir("src/test/resources/proto") + outputs.dir(layout.buildDirectory.dir("generated/test-sources/bufgen-noimports")) commandLine( buf.asPath, "generate", "--template", - "${layout.buildDirectory.get()}/buf-gen-templates/src/test/resources/proto/buf.gen.noimports.yaml", + template.get().asFile.absolutePath, ) } tasks.register("generateCelConformance") { dependsOn("generateCelConformanceTestTypes", "filterBufGenYaml") description = "Generates CEL conformance code with buf generate for unit tests." + val template = layout.buildDirectory.file("buf-gen-templates/src/test/resources/proto/buf.gen.cel.yaml") + inputs.files(buf) + inputs.file(template) + inputs.property("celSpecVersion", project.findProperty("cel.spec.version").toString()) + outputs.dir(layout.buildDirectory.dir("generated/test-sources/bufgen-cel")) commandLine( buf.asPath, "generate", "--template", - "${layout.buildDirectory.get()}/buf-gen-templates/src/test/resources/proto/buf.gen.cel.yaml", + template.get().asFile.absolutePath, "buf.build/google/cel-spec:${project.findProperty("cel.spec.version")}", "--exclude-path", "cel/expr/conformance/proto2", @@ -136,11 +156,16 @@ tasks.register("generateCelConformance") { tasks.register("generateCelConformanceTestTypes") { dependsOn("exportProtovalidateModule", "filterBufGenYaml") description = "Generates CEL conformance test types with buf generate for unit tests using a Java package override." + val template = layout.buildDirectory.file("buf-gen-templates/src/test/resources/proto/buf.gen.cel.testtypes.yaml") + inputs.files(buf) + inputs.file(template) + inputs.property("celSpecVersion", project.findProperty("cel.spec.version").toString()) + outputs.dir(layout.buildDirectory.dir("generated/test-sources/bufgen-cel-testtypes")) commandLine( buf.asPath, "generate", "--template", - "${layout.buildDirectory.get()}/buf-gen-templates/src/test/resources/proto/buf.gen.cel.testtypes.yaml", + template.get().asFile.absolutePath, "buf.build/google/cel-spec:${project.findProperty("cel.spec.version")}", "--path", "cel/expr/conformance/proto3", @@ -184,6 +209,9 @@ tasks.register("exportProtovalidateModule") { if (!semverRegex.matches(version)) { input = "https://github.com/bufbuild/protovalidate.git#subdir=proto/protovalidate,ref=$version" } + inputs.files(buf) + inputs.property("protovalidateVersion", version) + outputs.dir("src/main/resources/buf") commandLine( buf.asPath, "export", @@ -196,7 +224,12 @@ tasks.register("exportProtovalidateModule") { tasks.register("generateSources") { dependsOn("exportProtovalidateModule", "filterBufGenYaml") description = "Generates sources for the bufbuild/protovalidate module sources to build/generated/sources/bufgen." - commandLine(buf.asPath, "generate", "--template", "${layout.buildDirectory.get()}/buf-gen-templates/buf.gen.yaml", "src/main/resources") + val template = layout.buildDirectory.file("buf-gen-templates/buf.gen.yaml") + inputs.files(buf) + inputs.file(template) + inputs.dir("src/main/resources/buf") + outputs.dir(layout.buildDirectory.dir("generated/sources/bufgen")) + commandLine(buf.asPath, "generate", "--template", template.get().asFile.absolutePath, "src/main/resources") } tasks.register("generate") { @@ -205,9 +238,16 @@ tasks.register("generate") { "generateTestSources", "generateSources", "licenseHeader", + ":conformance:generateConformance", ) } +// src/main/resources and build/generated/sources/bufgen are generate-task outputs; consumers need explicit ordering. +tasks.named("processResources") { dependsOn("exportProtovalidateModule") } +tasks.matching { it.name == "sourcesJar" }.configureEach { + dependsOn("exportProtovalidateModule", "generateSources") +} + tasks.withType { dependsOn("generate") if (JavaVersion.current().isJava9Compatible) { @@ -251,7 +291,10 @@ sourceSets { } test { java { - srcDir(layout.buildDirectory.dir("generated/test-sources/bufgen")) + srcDir(layout.buildDirectory.dir("generated/test-sources/bufgen-imports")) + srcDir(layout.buildDirectory.dir("generated/test-sources/bufgen-noimports")) + srcDir(layout.buildDirectory.dir("generated/test-sources/bufgen-cel")) + srcDir(layout.buildDirectory.dir("generated/test-sources/bufgen-cel-testtypes")) } } } @@ -259,7 +302,7 @@ sourceSets { apply(plugin = "com.diffplug.spotless") configure { java { - targetExclude("build/generated/sources/bufgen/build/buf/validate/**/*.java", "build/generated/test-sources/bufgen/**/*.java") + targetExclude("build/generated/sources/bufgen/build/buf/validate/**/*.java", "build/generated/test-sources/bufgen-*/**/*.java") } kotlinGradle { ktlint() diff --git a/conformance/buf.gen.yaml b/conformance/buf.gen.yaml index aafad4c4..4fecae0e 100644 --- a/conformance/buf.gen.yaml +++ b/conformance/buf.gen.yaml @@ -1,5 +1,4 @@ version: v2 -clean: true managed: enabled: true override: diff --git a/conformance/build.gradle.kts b/conformance/build.gradle.kts index d6db8435..297c6e30 100644 --- a/conformance/build.gradle.kts +++ b/conformance/build.gradle.kts @@ -39,6 +39,7 @@ val conformanceArgs = (project.findProperty("protovalidate.conformance.args")?.t tasks.register("installProtovalidateConformance") { description = "Installs the Protovalidate Conformance CLI." environment("GOBIN", conformanceCLIFile.parentFile.absolutePath) + inputs.property("protovalidateVersion", project.findProperty("protovalidate.version").toString()) outputs.file(conformanceCLIFile) commandLine( "go", @@ -71,11 +72,16 @@ tasks.register("generateConformance") { if (!semverRegex.matches(version)) { input = "https://github.com/bufbuild/protovalidate.git#subdir=proto/protovalidate-testing,ref=$version" } + val template = layout.buildDirectory.file("buf-gen-templates/buf.gen.yaml") + inputs.files(buf) + inputs.file(template) + inputs.property("protovalidateVersion", version) + outputs.dir(layout.buildDirectory.dir("generated/sources/bufgen")) commandLine( buf.asPath, "generate", "--template", - "${layout.buildDirectory.get()}/buf-gen-templates/buf.gen.yaml", + template.get().asFile.absolutePath, input, ) } diff --git a/src/test/resources/proto/buf.gen.cel.testtypes.yaml b/src/test/resources/proto/buf.gen.cel.testtypes.yaml index 47ec585c..7617ebcf 100644 --- a/src/test/resources/proto/buf.gen.cel.testtypes.yaml +++ b/src/test/resources/proto/buf.gen.cel.testtypes.yaml @@ -6,4 +6,4 @@ managed: value: cel.expr.conformance.proto3 plugins: - remote: buf.build/protocolbuffers/java:$protocJavaPluginVersion - out: build/generated/test-sources/bufgen + out: build/generated/test-sources/bufgen-cel-testtypes diff --git a/src/test/resources/proto/buf.gen.cel.yaml b/src/test/resources/proto/buf.gen.cel.yaml index 175f6083..1eada8cb 100644 --- a/src/test/resources/proto/buf.gen.cel.yaml +++ b/src/test/resources/proto/buf.gen.cel.yaml @@ -3,4 +3,4 @@ managed: enabled: true plugins: - remote: buf.build/protocolbuffers/java:$protocJavaPluginVersion - out: build/generated/test-sources/bufgen + out: build/generated/test-sources/bufgen-cel diff --git a/src/test/resources/proto/buf.gen.imports.yaml b/src/test/resources/proto/buf.gen.imports.yaml index 5ed4410f..f9ad45a4 100644 --- a/src/test/resources/proto/buf.gen.imports.yaml +++ b/src/test/resources/proto/buf.gen.imports.yaml @@ -6,6 +6,6 @@ managed: value: com.example.imports plugins: - remote: buf.build/protocolbuffers/java:$protocJavaPluginVersion - out: build/generated/test-sources/bufgen + out: build/generated/test-sources/bufgen-imports inputs: - directory: src/test/resources/proto diff --git a/src/test/resources/proto/buf.gen.noimports.yaml b/src/test/resources/proto/buf.gen.noimports.yaml index 7eecf2ac..d8db0d53 100644 --- a/src/test/resources/proto/buf.gen.noimports.yaml +++ b/src/test/resources/proto/buf.gen.noimports.yaml @@ -9,7 +9,7 @@ managed: value: com.example.noimports plugins: - remote: buf.build/protocolbuffers/java:$protocJavaPluginVersion - out: build/generated/test-sources/bufgen + out: build/generated/test-sources/bufgen-noimports inputs: - directory: src/main/resources - directory: src/test/resources/proto From f2e2fce96d67e5070001054bfb9486e9322a7fb4 Mon Sep 17 00:00:00 2001 From: "Philip K. Warren" Date: Thu, 23 Apr 2026 10:14:20 -0500 Subject: [PATCH 2/2] Fix build warning --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index ae7f1815..03380f7d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,7 @@ import com.diffplug.gradle.spotless.SpotlessExtension import com.vanniktech.maven.publish.JavaLibrary import com.vanniktech.maven.publish.JavadocJar +import com.vanniktech.maven.publish.SourcesJar import net.ltgt.gradle.errorprone.CheckSeverity import net.ltgt.gradle.errorprone.errorprone @@ -362,8 +363,7 @@ mavenPublishing { // - `JavadocJar.Empty()` publish an empty jar // - `JavadocJar.Javadoc()` to publish standard javadocs javadocJar = JavadocJar.Javadoc(), - // whether to publish a sources jar - sourcesJar = true, + sourcesJar = SourcesJar.Sources(), ), ) pom {