Skip to content

Commit 1547834

Browse files
authored
Build/Release: Add a "generate digest" task and use for source tarball and Quarkus distributables (#1271)
* Ensure that digest and signature are generated for both Polaris-Server and admin tar/zip distribution * Move "generate digest" functionality to a Gradle task
1 parent 25d6d51 commit 1547834

File tree

6 files changed

+138
-42
lines changed

6 files changed

+138
-42
lines changed

build-logic/src/main/kotlin/publishing/PublishingHelperExtension.kt

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,6 @@ constructor(objectFactory: ObjectFactory, project: Project) {
4949
objectFactory
5050
.fileProperty()
5151
.convention(project.provider { distributionDir.get().file("${baseName.get()}.tar.gz") })
52-
val sourceTarballDigest =
53-
objectFactory
54-
.fileProperty()
55-
.convention(
56-
project.provider { distributionDir.get().file("${baseName.get()}.tar.gz.sha512") }
57-
)
5852

5953
val mailingLists = objectFactory.listProperty(String::class.java).convention(emptyList())
6054

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package publishing
21+
22+
import java.security.MessageDigest
23+
import javax.inject.Inject
24+
import org.gradle.api.DefaultTask
25+
import org.gradle.api.model.ObjectFactory
26+
import org.gradle.api.tasks.Input
27+
import org.gradle.api.tasks.InputFile
28+
import org.gradle.api.tasks.OutputFile
29+
import org.gradle.api.tasks.TaskAction
30+
import org.gradle.work.DisableCachingByDefault
31+
32+
@DisableCachingByDefault
33+
abstract class GenerateDigest @Inject constructor(objectFactory: ObjectFactory) : DefaultTask() {
34+
35+
@get:InputFile val file = objectFactory.fileProperty()
36+
@get:Input val algorithm = objectFactory.property(String::class.java).convention("SHA-512")
37+
@get:OutputFile
38+
val outputFile =
39+
objectFactory.fileProperty().convention {
40+
val input = file.get().asFile
41+
val algo = algorithm.get()
42+
input.parentFile.resolve("${input.name}-${algo.replace("-", "").lowercase()}")
43+
}
44+
45+
@TaskAction
46+
fun generate() {
47+
val input = file.get().asFile
48+
val digestFile = outputFile.get().asFile
49+
val md = MessageDigest.getInstance(algorithm.get())
50+
input.inputStream().use {
51+
val buffered = it.buffered(8192)
52+
val buf = ByteArray(8192)
53+
var rd: Int
54+
while (true) {
55+
rd = buffered.read(buf)
56+
if (rd == -1) break
57+
md.update(buf, 0, rd)
58+
}
59+
60+
digestFile.writeText(
61+
md.digest().joinToString(separator = "") { eachByte -> "%02x".format(eachByte) } +
62+
" ${input.name}"
63+
)
64+
}
65+
}
66+
}

build-logic/src/main/kotlin/publishing/rootProject.kt

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -61,27 +61,28 @@ internal fun configureOnRootProject(project: Project) =
6161
workingDir(project.projectDir)
6262
}
6363

64-
val digestSourceTarball = tasks.register("digestSourceTarball")
65-
digestSourceTarball.configure {
66-
mustRunAfter(sourceTarball)
67-
68-
doFirst {
69-
val e = project.extensions.getByType(PublishingHelperExtension::class.java)
70-
generateDigest(e.sourceTarball.get().asFile, e.sourceTarballDigest.get().asFile, "SHA-512")
64+
val digestSourceTarball =
65+
tasks.register<GenerateDigest>("digestSourceTarball") {
66+
description = "Generate the source tarball digest"
67+
mustRunAfter(sourceTarball)
68+
file.set {
69+
val e = project.extensions.getByType(PublishingHelperExtension::class.java)
70+
e.sourceTarball.get().asFile
71+
}
7172
}
72-
}
7373

7474
sourceTarball.configure { finalizedBy(digestSourceTarball) }
7575

7676
if (isSigning) {
77-
val signSourceTarball = tasks.register<Sign>("signSourceTarball")
78-
signSourceTarball.configure {
79-
mustRunAfter(sourceTarball)
80-
doFirst {
81-
val e = project.extensions.getByType(PublishingHelperExtension::class.java)
82-
sign(e.sourceTarball.get().asFile)
77+
val signSourceTarball =
78+
tasks.register<Sign>("signSourceTarball") {
79+
description = "Sign the source tarball"
80+
mustRunAfter(sourceTarball)
81+
doFirst {
82+
val e = project.extensions.getByType(PublishingHelperExtension::class.java)
83+
sign(e.sourceTarball.get().asFile)
84+
}
8385
}
84-
}
8586
sourceTarball.configure { finalizedBy(signSourceTarball) }
8687
}
8788

build-logic/src/main/kotlin/publishing/util.kt

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,8 @@ import groovy.json.JsonException
2323
import groovy.json.JsonSlurper
2424
import groovy.util.Node
2525
import groovy.util.NodeList
26-
import java.io.File
2726
import java.io.FileNotFoundException
2827
import java.net.URI
29-
import java.security.MessageDigest
3028
import org.gradle.api.artifacts.Configuration
3129
import org.gradle.api.artifacts.component.ModuleComponentSelector
3230
import org.gradle.api.artifacts.result.DependencyResult
@@ -58,25 +56,6 @@ internal fun xmlNode(node: Node?, child: String): Node? {
5856
return null
5957
}
6058

61-
internal fun generateDigest(input: File, output: File, algorithm: String) {
62-
val md = MessageDigest.getInstance(algorithm)
63-
input.inputStream().use {
64-
val buffered = it.buffered(8192)
65-
val buf = ByteArray(8192)
66-
var rd: Int
67-
while (true) {
68-
rd = buffered.read(buf)
69-
if (rd == -1) break
70-
md.update(buf, 0, rd)
71-
}
72-
73-
output.writeText(
74-
md.digest().joinToString(separator = "") { eachByte -> "%02x".format(eachByte) } +
75-
" ${input.name}"
76-
)
77-
}
78-
}
79-
8059
internal fun <T : Any> unsafeCast(o: Any?): T {
8160
@Suppress("UNCHECKED_CAST")
8261
return o as T

quarkus/admin/build.gradle.kts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919

2020
import io.quarkus.gradle.tasks.QuarkusBuild
21+
import publishing.GenerateDigest
2122

2223
plugins {
2324
alias(libs.plugins.quarkus)
@@ -110,11 +111,38 @@ val distZip =
110111
inputs.files(runScript)
111112
}
112113

114+
val digestDistTar =
115+
tasks.register<GenerateDigest>("digestDistTar") {
116+
description = "Generate the distribution tar digest"
117+
mustRunAfter(distTar)
118+
file.set { distTar.get().archiveFile.get().asFile }
119+
}
120+
121+
val digestDistZip =
122+
tasks.register<GenerateDigest>("digestDistZip") {
123+
description = "Generate the distribution zip digest"
124+
mustRunAfter(distZip)
125+
file.set { distZip.get().archiveFile.get().asFile }
126+
}
127+
128+
distTar.configure { finalizedBy(digestDistTar) }
129+
130+
distZip.configure { finalizedBy(digestDistZip) }
131+
132+
if (project.hasProperty("release") || project.hasProperty("signArtifacts")) {
133+
signing {
134+
sign(distTar.get())
135+
sign(distZip.get())
136+
}
137+
}
138+
113139
// Expose runnable jar via quarkusRunner configuration for integration-tests that require the
114140
// server.
115141
artifacts {
116142
add(distributionTar.name, provider { distTar.get().archiveFile }) { builtBy(distTar) }
143+
add(distributionTar.name, provider { digestDistTar.get().outputFile }) { builtBy(digestDistTar) }
117144
add(distributionZip.name, provider { distZip.get().archiveFile }) { builtBy(distZip) }
145+
add(distributionZip.name, provider { digestDistZip.get().outputFile }) { builtBy(digestDistZip) }
118146
}
119147

120148
afterEvaluate {

quarkus/server/build.gradle.kts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import io.quarkus.gradle.tasks.QuarkusBuild
2121
import io.quarkus.gradle.tasks.QuarkusRun
22+
import publishing.GenerateDigest
2223

2324
plugins {
2425
alias(libs.plugins.quarkus)
@@ -109,14 +110,41 @@ val distZip =
109110
inputs.files(runScript)
110111
}
111112

113+
val digestDistTar =
114+
tasks.register<GenerateDigest>("digestDistTar") {
115+
description = "Generate the distribution tar digest"
116+
mustRunAfter(distTar)
117+
file.set { distTar.get().archiveFile.get().asFile }
118+
}
119+
120+
val digestDistZip =
121+
tasks.register<GenerateDigest>("digestDistZip") {
122+
description = "Generate the distribution zip digest"
123+
mustRunAfter(distZip)
124+
file.set { distZip.get().archiveFile.get().asFile }
125+
}
126+
127+
distTar.configure { finalizedBy(digestDistTar) }
128+
129+
distZip.configure { finalizedBy(digestDistZip) }
130+
131+
if (project.hasProperty("release") || project.hasProperty("signArtifacts")) {
132+
signing {
133+
sign(distTar.get())
134+
sign(distZip.get())
135+
}
136+
}
137+
112138
// Expose runnable jar via quarkusRunner configuration for integration-tests that require the
113139
// server.
114140
artifacts {
115141
add(quarkusRunner.name, provider { quarkusBuild.get().fastJar.resolve("quarkus-run.jar") }) {
116142
builtBy(quarkusBuild)
117143
}
118144
add(distributionTar.name, provider { distTar.get().archiveFile }) { builtBy(distTar) }
145+
add(distributionTar.name, provider { digestDistTar.get().outputFile }) { builtBy(digestDistTar) }
119146
add(distributionZip.name, provider { distZip.get().archiveFile }) { builtBy(distZip) }
147+
add(distributionZip.name, provider { digestDistZip.get().outputFile }) { builtBy(digestDistZip) }
120148
}
121149

122150
afterEvaluate {

0 commit comments

Comments
 (0)