Skip to content

Commit ab69961

Browse files
committed
make signature extension .sigstore.json
Signed-off-by: Appu Goundan <[email protected]>
1 parent b5d777b commit ab69961

File tree

8 files changed

+38
-33
lines changed

8 files changed

+38
-33
lines changed

sigstore-gradle/sigstore-gradle-sign-base-plugin/src/main/kotlin/dev/sigstore/sign/SigstoreSignExtension.kt

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ import org.gradle.api.provider.Property
2626
import org.gradle.api.publish.Publication
2727
import org.gradle.api.publish.PublicationArtifact
2828
import org.gradle.api.publish.internal.PublicationInternal
29+
import org.gradle.api.publish.maven.MavenArtifact
30+
import org.gradle.api.publish.maven.internal.artifact.AbstractMavenArtifact
31+
import org.gradle.api.publish.maven.internal.artifact.DerivedMavenArtifact
2932
import org.gradle.kotlin.dsl.create
3033
import org.gradle.kotlin.dsl.named
3134
import org.gradle.kotlin.dsl.register
@@ -88,28 +91,34 @@ abstract class SigstoreSignExtension(private val project: Project) {
8891
val artifacts = mutableMapOf<PublicationArtifact, T>()
8992
publication.allPublishableArtifacts {
9093
val publishableArtifact = this
91-
if (file.extension !in listOf("asc", SigstoreSignature.EXTENSION)) {
94+
if (!file.name.endsWith(".asc") && !file.name.endsWith(SigstoreSignature.DOT_EXTENSION)) {
9295
val signatureLocation =
93-
signatureDirectory.map { it.file(file.name + "." + SigstoreSignature.EXTENSION) }
96+
signatureDirectory.map { it.file(file.name + SigstoreSignature.DOT_EXTENSION) }
9497
signTask.configure {
9598
sign(publishableArtifact.file, builtBy = publishableArtifact)
9699
.outputSignature.set(signatureLocation)
97100
}
98-
artifacts[publishableArtifact] = publication.addDerivedArtifact(
99-
publishableArtifact,
100-
DefaultDerivedArtifactFile(project.tasks.named<DefaultTask>(signTask.name), signatureLocation)
101-
).apply { builtBy(signTask) }
101+
val dervied = DefaultDerivedArtifactFile(project.tasks.named<DefaultTask>(signTask.name), signatureLocation)
102+
artifacts[publishableArtifact] = publication.addDerivedArtifact(publishableArtifact, dervied).apply {
103+
builtBy(signTask)
104+
// TODO: workaround for https://github.com/gradle/gradle/issues/28969
105+
// TODO: Behavior is undefined for non-maven artifacts.
106+
if (publishableArtifact is AbstractMavenArtifact) {
107+
(this as DerivedMavenArtifact).setExtension((publishableArtifact as AbstractMavenArtifact).extension + SigstoreSignature.DOT_EXTENSION)
108+
}
109+
}
102110
// Gradle's signing plugin reacts on adding artifacts, and it might add .asc signature
103-
// So we need to remove .sigstore.asc as it is unwanted in most of the cases
111+
// So we need to remove .sigstore.json.asc as it is unwanted in most of the cases
104112
if (removeSigstoreAsc) {
105113
project.tasks.withType<Sign>()
106114
.matching { it.name.contains(publicationName, ignoreCase = true) }
107115
.configureEach {
108-
// Remove .sigstore.asc signature.
116+
// Remove .sigstore.json.asc signature.
109117
// Unfortunately, it will scan all the signatures every time,
110118
// however, it seems to be the only way to do it since the artifacts can be added
111119
// within afterEvaluate block, so we can't use afterEvaluate
112-
// to "remove all .sigstore.asc" at once
120+
// to "remove all .sigstore.json.asc" at once
121+
signatures.removeIf { it.name.endsWith(SigstoreSignature.DOT_EXTENSION + ".asc") }
113122
signatures.removeIf { it.name.endsWith(".sigstore.asc") }
114123
}
115124
}

sigstore-gradle/sigstore-gradle-sign-base-plugin/src/main/kotlin/dev/sigstore/sign/SigstoreSignature.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ import javax.inject.Inject
2525

2626
abstract class SigstoreSignature @Inject constructor(private val name: String) : Named {
2727
companion object {
28-
const val EXTENSION = "sigstore"
28+
const val EXTENSION = "sigstore.json"
29+
const val DOT_EXTENSION = ".$EXTENSION";
2930
}
3031

3132
// Gradle 6.8.3: Cannot have abstract method SigstoreSignature.getName
@@ -73,7 +74,7 @@ abstract class SigstoreSignature @Inject constructor(private val name: String) :
7374

7475
init {
7576
outputSignature.convention(
76-
signatureDirectory.map { it.file(file.singleFile.name + ".$EXTENSION") }
77+
signatureDirectory.map { it.file(file.singleFile.name + DOT_EXTENSION) }
7778
)
7879
}
7980
}

sigstore-gradle/sigstore-gradle-sign-base-plugin/src/main/kotlin/dev/sigstore/sign/tasks/SigstoreSignFilesTask.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import org.gradle.api.plugins.JavaPluginExtension
3131
import org.gradle.api.provider.Property
3232
import org.gradle.api.provider.Provider
3333
import org.gradle.api.provider.ProviderFactory
34-
import org.gradle.api.provider.SetProperty
3534
import org.gradle.api.tasks.*
3635
import org.gradle.jvm.toolchain.JavaLauncher
3736
import org.gradle.jvm.toolchain.JavaToolchainService

sigstore-gradle/sigstore-gradle-sign-base-plugin/src/test/kotlin/dev/sigstore/gradle/PluginSmokeTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,17 @@ class PluginSmokeTest : BaseGradleTest() {
3939
project {
4040
apply(plugin = "dev.sigstore.sign-base")
4141
val hello by tasks.registering(WriteProperties::class) {
42-
outputFile = layout.buildDirectory.file("props/$name.properties").get().asFile
42+
destinationFile = layout.buildDirectory.file("props/$name.properties")
4343
property("hello", "world")
4444
}
4545

4646
// It should be eagerly created to access signOutput
4747
val signFile by tasks.registering(SigstoreSignFilesTask::class) {
48-
signFile(hello.map { it.outputFile })
48+
signFile(hello.map { it.destinationFile.asFile.get() })
4949
}
5050

5151
Assertions.assertThat(signFile.flatMap { it.singleSignature() }.get().asFile)
52-
.hasFileName("hello.properties.sigstore")
52+
.hasFileName("hello.properties.sigstore.json")
5353
}
5454
}
5555

sigstore-gradle/sigstore-gradle-sign-base-plugin/src/test/kotlin/dev/sigstore/gradle/SigstoreSignTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class SigstoreSignTest: BaseGradleTest() {
4545
}
4646
def signFile = tasks.register("signFile", SigstoreSignFilesTask) {
4747
signFile(helloProps.map { it.outputFile })
48-
.outputSignature.set(file("build/helloProps.txt.sigstore"))
48+
.outputSignature.set(file("build/helloProps.txt.sigstore.json"))
4949
}
5050
""".trimIndent()
5151
)
@@ -57,7 +57,7 @@ class SigstoreSignTest: BaseGradleTest() {
5757
enableConfigurationCache(case.gradle)
5858
prepare(case.gradle.version, "signFile", "-s")
5959
.build()
60-
assertThat(projectDir.resolve("build/helloProps.txt.sigstore"))
60+
assertThat(projectDir.resolve("build/helloProps.txt.sigstore.json"))
6161
.content()
6262
.basicSigstoreStructure()
6363

sigstore-gradle/sigstore-gradle-sign-plugin/src/test/kotlin/dev/sigstore/gradle/RemoveSigstoreAscTest.kt

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,11 @@ package dev.sigstore.gradle
1919
import dev.sigstore.testkit.BaseGradleTest
2020
import dev.sigstore.testkit.TestedGradle
2121
import dev.sigstore.testkit.TestedGradleAndSigstoreJava
22-
import dev.sigstore.testkit.TestedSigstoreJava
2322
import dev.sigstore.testkit.annotations.EnabledIfOidcExists
2423
import org.assertj.core.api.Assertions.assertThat
2524
import org.assertj.core.api.SoftAssertions
2625
import org.gradle.util.GradleVersion
2726
import org.junit.jupiter.params.ParameterizedTest
28-
import org.junit.jupiter.params.provider.Arguments
29-
import org.junit.jupiter.params.provider.Arguments.arguments
3027
import org.junit.jupiter.params.provider.MethodSource
3128

3229
@EnabledIfOidcExists
@@ -89,8 +86,8 @@ class RemoveSigstoreAscTest : BaseGradleTest() {
8986
projectDir.resolve("gradle.properties").toFile().appendText(
9087
"""
9188
92-
# By default, dev.sigstore.sign asks Gradle to avoid signing .sigstore as .sigstore.asc
93-
# This is an opt-out hatch for those who need .sigstore.asc
89+
# By default, dev.sigstore.sign asks Gradle to avoid signing .sigstore.json as
90+
# .sigstore.json.asc This is an opt-out hatch for those who need .sigstore.json.asc
9491
dev.sigstore.sign.remove.sigstore.asc=false
9592
""".trimIndent()
9693
)
@@ -153,7 +150,7 @@ class RemoveSigstoreAscTest : BaseGradleTest() {
153150
}
154151

155152
private fun SoftAssertions.assertSignatures(name: String, expectSigstoreAsc: Boolean = false) {
156-
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/$name.sigstore"))
153+
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/$name.sigstore.json"))
157154
.describedAs("$name should be signed with Sigstore")
158155
.content()
159156
.basicSigstoreStructure()
@@ -163,14 +160,14 @@ class RemoveSigstoreAscTest : BaseGradleTest() {
163160
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/$name.asc.sigstore"))
164161
.describedAs("$name.asc should NOT be signed with Sigstore")
165162
.doesNotExist()
166-
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/$name.sigstore.asc"))
163+
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/$name.sigstore.json.asc"))
167164
.apply {
168165
if (expectSigstoreAsc) {
169-
describedAs("$name.sigstore should be signed with PGP")
166+
describedAs("$name.sigstore.json should be signed with PGP")
170167
exists()
171168
} else {
172-
// We don't want to sign .sigstore files with PGP
173-
describedAs("$name.sigstore should NOT be signed with PGP")
169+
// We don't want to sign .sigstore.json files with PGP
170+
describedAs("$name.sigstore.json should NOT be signed with PGP")
174171
doesNotExist()
175172
}
176173
}

sigstore-gradle/sigstore-gradle-sign-plugin/src/test/kotlin/dev/sigstore/gradle/SigstorePublishSignTest.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@
1717
package dev.sigstore.gradle
1818

1919
import dev.sigstore.testkit.BaseGradleTest
20-
import dev.sigstore.testkit.TestedGradle
2120
import dev.sigstore.testkit.TestedGradleAndSigstoreJava
22-
import dev.sigstore.testkit.TestedSigstoreJava
2321
import dev.sigstore.testkit.annotations.EnabledIfOidcExists
2422
import org.assertj.core.api.Assertions.assertThat
2523
import org.junit.jupiter.params.ParameterizedTest
@@ -70,16 +68,16 @@ class SigstorePublishSignTest : BaseGradleTest() {
7068
prepare(case.gradle.version, "publishAllPublicationsToTmpRepository", "-s")
7169
.build()
7270

73-
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/sigstore-test-1.0.pom.sigstore"))
71+
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/sigstore-test-1.0.pom.sigstore.json"))
7472
.content()
7573
.basicSigstoreStructure()
76-
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/sigstore-test-1.0.jar.sigstore"))
74+
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/sigstore-test-1.0.jar.sigstore.json"))
7775
.content()
7876
.basicSigstoreStructure()
79-
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/sigstore-test-1.0-sources.jar.sigstore"))
77+
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/sigstore-test-1.0-sources.jar.sigstore.json"))
8078
.content()
8179
.basicSigstoreStructure()
82-
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/sigstore-test-1.0.module.sigstore"))
80+
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/sigstore-test-1.0.module.sigstore.json"))
8381
.content()
8482
.basicSigstoreStructure()
8583

sigstore-testkit/src/main/kotlin/dev/sigstore/testkit/BaseGradleTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ open class BaseGradleTest {
3535
ON, OFF
3636
}
3737

38+
// to debug these tests, add .withDebug(true) before running a test in debug mode
3839
protected val gradleRunner = GradleRunner.create().withPluginClasspath()
3940

4041
companion object {

0 commit comments

Comments
 (0)