Skip to content

Commit ebfc081

Browse files
authored
Add missing inputs and outputs to Gradle exec tasks (#456)
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.
1 parent ce1c80e commit ebfc081

8 files changed

Lines changed: 65 additions & 18 deletions

File tree

buf.gen.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
version: v2
2-
clean: true
32
plugins:
43
- remote: buf.build/protocolbuffers/java:$protocJavaPluginVersion
54
out: build/generated/sources/bufgen

build.gradle.kts

Lines changed: 54 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import com.diffplug.gradle.spotless.SpotlessExtension
22
import com.vanniktech.maven.publish.JavaLibrary
33
import com.vanniktech.maven.publish.JavadocJar
4+
import com.vanniktech.maven.publish.SourcesJar
45
import net.ltgt.gradle.errorprone.CheckSeverity
56
import net.ltgt.gradle.errorprone.errorprone
67

@@ -56,6 +57,7 @@ tasks.register("configureBuf") {
5657
tasks.register<Exec>("installLicenseHeader") {
5758
description = "Installs the Buf license-header CLI."
5859
environment("GOBIN", bufLicenseHeaderCLIFile.parentFile.absolutePath)
60+
inputs.property("bufVersion", libs.versions.buf.get())
5961
outputs.file(bufLicenseHeaderCLIFile)
6062
commandLine("go", "install", "github.com/bufbuild/buf/private/pkg/licenseheader/cmd/license-header@v${libs.versions.buf.get()}")
6163
}
@@ -81,8 +83,11 @@ tasks.register<Exec>("licenseHeader") {
8183
}
8284

8385
tasks.register<Copy>("filterBufGenYaml") {
84-
from(".")
85-
include("buf.gen.yaml", "src/**/buf*gen*.yaml")
86+
from(files("buf.gen.yaml"))
87+
from("src/test/resources/proto") {
88+
include("buf*gen*.yaml")
89+
into("src/test/resources/proto")
90+
}
8691
includeEmptyDirs = false
8792
into(layout.buildDirectory.dir("buf-gen-templates"))
8893
expand("protocJavaPluginVersion" to "v${libs.versions.protobuf.get().substringAfter('.')}")
@@ -92,34 +97,50 @@ tasks.register<Copy>("filterBufGenYaml") {
9297
tasks.register<Exec>("generateTestSourcesImports") {
9398
dependsOn("exportProtovalidateModule", "filterBufGenYaml")
9499
description = "Generates code with buf generate --include-imports for unit tests."
100+
val template = layout.buildDirectory.file("buf-gen-templates/src/test/resources/proto/buf.gen.imports.yaml")
101+
inputs.files(buf)
102+
inputs.file(template)
103+
inputs.dir("src/test/resources/proto")
104+
outputs.dir(layout.buildDirectory.dir("generated/test-sources/bufgen-imports"))
95105
commandLine(
96106
buf.asPath,
97107
"generate",
98108
"--template",
99-
"${layout.buildDirectory.get()}/buf-gen-templates/src/test/resources/proto/buf.gen.imports.yaml",
109+
template.get().asFile.absolutePath,
100110
"--include-imports",
101111
)
102112
}
103113

104114
tasks.register<Exec>("generateTestSourcesNoImports") {
105115
dependsOn("exportProtovalidateModule", "filterBufGenYaml")
106116
description = "Generates code with buf generate --include-imports for unit tests."
117+
val template = layout.buildDirectory.file("buf-gen-templates/src/test/resources/proto/buf.gen.noimports.yaml")
118+
inputs.files(buf)
119+
inputs.file(template)
120+
inputs.dir("src/main/resources")
121+
inputs.dir("src/test/resources/proto")
122+
outputs.dir(layout.buildDirectory.dir("generated/test-sources/bufgen-noimports"))
107123
commandLine(
108124
buf.asPath,
109125
"generate",
110126
"--template",
111-
"${layout.buildDirectory.get()}/buf-gen-templates/src/test/resources/proto/buf.gen.noimports.yaml",
127+
template.get().asFile.absolutePath,
112128
)
113129
}
114130

115131
tasks.register<Exec>("generateCelConformance") {
116132
dependsOn("generateCelConformanceTestTypes", "filterBufGenYaml")
117133
description = "Generates CEL conformance code with buf generate for unit tests."
134+
val template = layout.buildDirectory.file("buf-gen-templates/src/test/resources/proto/buf.gen.cel.yaml")
135+
inputs.files(buf)
136+
inputs.file(template)
137+
inputs.property("celSpecVersion", project.findProperty("cel.spec.version").toString())
138+
outputs.dir(layout.buildDirectory.dir("generated/test-sources/bufgen-cel"))
118139
commandLine(
119140
buf.asPath,
120141
"generate",
121142
"--template",
122-
"${layout.buildDirectory.get()}/buf-gen-templates/src/test/resources/proto/buf.gen.cel.yaml",
143+
template.get().asFile.absolutePath,
123144
"buf.build/google/cel-spec:${project.findProperty("cel.spec.version")}",
124145
"--exclude-path",
125146
"cel/expr/conformance/proto2",
@@ -136,11 +157,16 @@ tasks.register<Exec>("generateCelConformance") {
136157
tasks.register<Exec>("generateCelConformanceTestTypes") {
137158
dependsOn("exportProtovalidateModule", "filterBufGenYaml")
138159
description = "Generates CEL conformance test types with buf generate for unit tests using a Java package override."
160+
val template = layout.buildDirectory.file("buf-gen-templates/src/test/resources/proto/buf.gen.cel.testtypes.yaml")
161+
inputs.files(buf)
162+
inputs.file(template)
163+
inputs.property("celSpecVersion", project.findProperty("cel.spec.version").toString())
164+
outputs.dir(layout.buildDirectory.dir("generated/test-sources/bufgen-cel-testtypes"))
139165
commandLine(
140166
buf.asPath,
141167
"generate",
142168
"--template",
143-
"${layout.buildDirectory.get()}/buf-gen-templates/src/test/resources/proto/buf.gen.cel.testtypes.yaml",
169+
template.get().asFile.absolutePath,
144170
"buf.build/google/cel-spec:${project.findProperty("cel.spec.version")}",
145171
"--path",
146172
"cel/expr/conformance/proto3",
@@ -184,6 +210,9 @@ tasks.register<Exec>("exportProtovalidateModule") {
184210
if (!semverRegex.matches(version)) {
185211
input = "https://github.com/bufbuild/protovalidate.git#subdir=proto/protovalidate,ref=$version"
186212
}
213+
inputs.files(buf)
214+
inputs.property("protovalidateVersion", version)
215+
outputs.dir("src/main/resources/buf")
187216
commandLine(
188217
buf.asPath,
189218
"export",
@@ -196,7 +225,12 @@ tasks.register<Exec>("exportProtovalidateModule") {
196225
tasks.register<Exec>("generateSources") {
197226
dependsOn("exportProtovalidateModule", "filterBufGenYaml")
198227
description = "Generates sources for the bufbuild/protovalidate module sources to build/generated/sources/bufgen."
199-
commandLine(buf.asPath, "generate", "--template", "${layout.buildDirectory.get()}/buf-gen-templates/buf.gen.yaml", "src/main/resources")
228+
val template = layout.buildDirectory.file("buf-gen-templates/buf.gen.yaml")
229+
inputs.files(buf)
230+
inputs.file(template)
231+
inputs.dir("src/main/resources/buf")
232+
outputs.dir(layout.buildDirectory.dir("generated/sources/bufgen"))
233+
commandLine(buf.asPath, "generate", "--template", template.get().asFile.absolutePath, "src/main/resources")
200234
}
201235

202236
tasks.register("generate") {
@@ -205,9 +239,16 @@ tasks.register("generate") {
205239
"generateTestSources",
206240
"generateSources",
207241
"licenseHeader",
242+
":conformance:generateConformance",
208243
)
209244
}
210245

246+
// src/main/resources and build/generated/sources/bufgen are generate-task outputs; consumers need explicit ordering.
247+
tasks.named("processResources") { dependsOn("exportProtovalidateModule") }
248+
tasks.matching { it.name == "sourcesJar" }.configureEach {
249+
dependsOn("exportProtovalidateModule", "generateSources")
250+
}
251+
211252
tasks.withType<JavaCompile> {
212253
dependsOn("generate")
213254
if (JavaVersion.current().isJava9Compatible) {
@@ -251,15 +292,18 @@ sourceSets {
251292
}
252293
test {
253294
java {
254-
srcDir(layout.buildDirectory.dir("generated/test-sources/bufgen"))
295+
srcDir(layout.buildDirectory.dir("generated/test-sources/bufgen-imports"))
296+
srcDir(layout.buildDirectory.dir("generated/test-sources/bufgen-noimports"))
297+
srcDir(layout.buildDirectory.dir("generated/test-sources/bufgen-cel"))
298+
srcDir(layout.buildDirectory.dir("generated/test-sources/bufgen-cel-testtypes"))
255299
}
256300
}
257301
}
258302

259303
apply(plugin = "com.diffplug.spotless")
260304
configure<SpotlessExtension> {
261305
java {
262-
targetExclude("build/generated/sources/bufgen/build/buf/validate/**/*.java", "build/generated/test-sources/bufgen/**/*.java")
306+
targetExclude("build/generated/sources/bufgen/build/buf/validate/**/*.java", "build/generated/test-sources/bufgen-*/**/*.java")
263307
}
264308
kotlinGradle {
265309
ktlint()
@@ -319,8 +363,7 @@ mavenPublishing {
319363
// - `JavadocJar.Empty()` publish an empty jar
320364
// - `JavadocJar.Javadoc()` to publish standard javadocs
321365
javadocJar = JavadocJar.Javadoc(),
322-
// whether to publish a sources jar
323-
sourcesJar = true,
366+
sourcesJar = SourcesJar.Sources(),
324367
),
325368
)
326369
pom {

conformance/buf.gen.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
version: v2
2-
clean: true
32
managed:
43
enabled: true
54
override:

conformance/build.gradle.kts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ val conformanceArgs = (project.findProperty("protovalidate.conformance.args")?.t
3939
tasks.register<Exec>("installProtovalidateConformance") {
4040
description = "Installs the Protovalidate Conformance CLI."
4141
environment("GOBIN", conformanceCLIFile.parentFile.absolutePath)
42+
inputs.property("protovalidateVersion", project.findProperty("protovalidate.version").toString())
4243
outputs.file(conformanceCLIFile)
4344
commandLine(
4445
"go",
@@ -71,11 +72,16 @@ tasks.register<Exec>("generateConformance") {
7172
if (!semverRegex.matches(version)) {
7273
input = "https://github.com/bufbuild/protovalidate.git#subdir=proto/protovalidate-testing,ref=$version"
7374
}
75+
val template = layout.buildDirectory.file("buf-gen-templates/buf.gen.yaml")
76+
inputs.files(buf)
77+
inputs.file(template)
78+
inputs.property("protovalidateVersion", version)
79+
outputs.dir(layout.buildDirectory.dir("generated/sources/bufgen"))
7480
commandLine(
7581
buf.asPath,
7682
"generate",
7783
"--template",
78-
"${layout.buildDirectory.get()}/buf-gen-templates/buf.gen.yaml",
84+
template.get().asFile.absolutePath,
7985
input,
8086
)
8187
}

src/test/resources/proto/buf.gen.cel.testtypes.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ managed:
66
value: cel.expr.conformance.proto3
77
plugins:
88
- remote: buf.build/protocolbuffers/java:$protocJavaPluginVersion
9-
out: build/generated/test-sources/bufgen
9+
out: build/generated/test-sources/bufgen-cel-testtypes

src/test/resources/proto/buf.gen.cel.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ managed:
33
enabled: true
44
plugins:
55
- remote: buf.build/protocolbuffers/java:$protocJavaPluginVersion
6-
out: build/generated/test-sources/bufgen
6+
out: build/generated/test-sources/bufgen-cel

src/test/resources/proto/buf.gen.imports.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ managed:
66
value: com.example.imports
77
plugins:
88
- remote: buf.build/protocolbuffers/java:$protocJavaPluginVersion
9-
out: build/generated/test-sources/bufgen
9+
out: build/generated/test-sources/bufgen-imports
1010
inputs:
1111
- directory: src/test/resources/proto

src/test/resources/proto/buf.gen.noimports.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ managed:
99
value: com.example.noimports
1010
plugins:
1111
- remote: buf.build/protocolbuffers/java:$protocJavaPluginVersion
12-
out: build/generated/test-sources/bufgen
12+
out: build/generated/test-sources/bufgen-noimports
1313
inputs:
1414
- directory: src/main/resources
1515
- directory: src/test/resources/proto

0 commit comments

Comments
 (0)