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 3d3c5a494..3cb08a7c7 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 b4d1ba596..ae7f1815f 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 aafad4c43..4fecae0eb 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 d6db8435f..297c6e307 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 47ec585c9..7617ebcfd 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 175f60834..1eada8cb8 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 5ed4410f0..f9ad45a4d 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 7eecf2ace..d8db0d53e 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 ae7f1815f..03380f7de 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 {