Skip to content

Commit 60b0b7a

Browse files
committed
Support Gradle Plugin testing with locally-built sigstore-java
The plugin runs with a separate build, so by default it uses mavenCentral only. However, we need to ensure the plugin is compatible with the main branch, so we publish sigstore-java to a temp folder, and use it as a repository in tests. Fixes #204 Signed-off-by: Vladimir Sitnikov <[email protected]>
1 parent 25d7f7e commit 60b0b7a

File tree

13 files changed

+254
-32
lines changed

13 files changed

+254
-32
lines changed

build-logic/publishing/src/main/kotlin/build-logic.kotlin-dsl-published-gradle-plugin.gradle.kts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,39 @@ plugins {
77
id("build-logic.dokka-javadoc")
88
id("build-logic.publish-to-central")
99
}
10+
11+
val sigstoreJavaRuntime by configurations.creating {
12+
description = "declares dependencies that will be useful for testing purposes"
13+
isCanBeConsumed = false
14+
isCanBeResolved = false
15+
}
16+
17+
val sigstoreJavaTestClasspath by configurations.creating {
18+
description = "sigstore-java in local repository for testing purposes"
19+
isCanBeConsumed = false
20+
isCanBeResolved = true
21+
extendsFrom(sigstoreJavaRuntime)
22+
attributes {
23+
attribute(Category.CATEGORY_ATTRIBUTE, objects.named("maven-repository"))
24+
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL))
25+
}
26+
}
27+
28+
tasks.test {
29+
dependsOn(sigstoreJavaTestClasspath)
30+
systemProperty("sigstore.test.current.version", version)
31+
val projectDir = layout.projectDirectory.asFile
32+
// This adds paths to the local repositories that contain currently-built sigstore-java
33+
// It enables testing both "sigstore-java from Central" and "sigstore-java build locally" in the plugin tests
34+
jvmArgumentProviders.add(
35+
// Gradle does not support Provider for systemProperties yet, see https://github.com/gradle/gradle/issues/12247
36+
CommandLineArgumentProvider {
37+
listOf(
38+
"-Dsigstore.test.local.maven.repo=" +
39+
sigstoreJavaTestClasspath.joinToString(File.pathSeparator) {
40+
it.toRelativeString(projectDir)
41+
}
42+
)
43+
}
44+
)
45+
}

build-logic/publishing/src/main/kotlin/build-logic.publish-to-central.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import org.gradle.api.publish.internal.PublicationInternal
33
plugins {
44
id("java-library")
55
id("maven-publish")
6+
id("build-logic.publish-to-tmp-maven-repo")
67
}
78

89
val repoUrl = "https://github.com/sigstore/sigstore-java"
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
plugins {
2+
id("java-library")
3+
id("maven-publish")
4+
}
5+
6+
val localRepoElements by configurations.creating {
7+
isCanBeConsumed = true
8+
isCanBeResolved = false
9+
description =
10+
"Shares local maven repository directory that contains the artifacts produced by the current project"
11+
attributes {
12+
attribute(Category.CATEGORY_ATTRIBUTE, objects.named("maven-repository"))
13+
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL))
14+
}
15+
}
16+
17+
val localRepoDir = layout.buildDirectory.dir("local-maven-repo")
18+
19+
publishing {
20+
repositories {
21+
maven {
22+
name = "tmp-maven"
23+
url = uri(localRepoDir)
24+
}
25+
}
26+
}
27+
28+
localRepoElements.outgoing.artifact(localRepoDir) {
29+
builtBy(tasks.named("publishAllPublicationsToTmp-mavenRepository"))
30+
}
31+
32+
val cleanLocalRepository by tasks.registering(Delete::class) {
33+
description = "Clears local-maven-repo so timestamp-based snapshot artifacts do not consume space"
34+
delete(localRepoDir)
35+
}
36+
37+
tasks.withType<PublishToMavenRepository>()
38+
.matching { it.name.endsWith("PublicationToTmp-mavenRepository") }
39+
.configureEach {
40+
dependsOn(cleanLocalRepository)
41+
}

sigstore-gradle/sigstore-gradle-sign-base-plugin/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ dependencies {
99
compileOnly(project(":sigstore-java"))
1010
implementation("com.fasterxml.jackson.core:jackson-databind:2.14.1")
1111

12+
sigstoreJavaRuntime(project(":sigstore-java")) {
13+
because("Test code needs access locally-built sigstore-java as a Maven repository")
14+
}
1215
testImplementation(project(":sigstore-testkit"))
1316
}
1417

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,6 @@ val sigstoreClientClasspath by configurations.creating {
4343
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, LibraryElements.JAR)
4444
attribute(Usage.USAGE_ATTRIBUTE, Usage.JAVA_RUNTIME)
4545
attribute(Bundling.BUNDLING_ATTRIBUTE, Bundling.EXTERNAL)
46+
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, JavaVersion.current().majorVersion.toInt())
4647
}
4748
}

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

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

1919
import dev.sigstore.testkit.BaseGradleTest
20+
import dev.sigstore.testkit.TestedGradle
2021
import org.junit.jupiter.params.ParameterizedTest
2122
import org.junit.jupiter.params.provider.MethodSource
2223

2324
class OidcDslTest: BaseGradleTest() {
2425
@ParameterizedTest
2526
@MethodSource("gradleVersionAndSettings")
26-
fun `configure GitHub OIDC client explicitly`(gradleVersion: String, configurationCache: ConfigurationCache) {
27+
fun `configure GitHub OIDC client explicitly`(gradle: TestedGradle) {
2728
writeBuildGradle(
2829
"""
2930
plugins {
@@ -44,8 +45,8 @@ class OidcDslTest: BaseGradleTest() {
4445
}
4546
""".trimIndent()
4647
)
47-
enableConfigurationCache(gradleVersion, configurationCache)
48-
prepare(gradleVersion, "printConfig", "-s")
48+
enableConfigurationCache(gradle)
49+
prepare(gradle.version, "printConfig", "-s")
4950
.build()
5051
}
5152
}

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

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

1919
import dev.sigstore.testkit.BaseGradleTest
20+
import dev.sigstore.testkit.TestedGradle
21+
import dev.sigstore.testkit.TestedSigstoreJava
2022
import dev.sigstore.testkit.annotations.EnabledIfOidcExists
2123
import org.assertj.core.api.Assertions.assertThat
22-
import org.junit.jupiter.api.Disabled
2324
import org.junit.jupiter.params.ParameterizedTest
2425
import org.junit.jupiter.params.provider.MethodSource
2526

2627
@EnabledIfOidcExists
2728
class SigstoreSignTest: BaseGradleTest() {
2829
@ParameterizedTest
29-
@MethodSource("gradleVersionAndSettings")
30-
fun `sign file`(gradleVersion: String, configurationCache: ConfigurationCache) {
30+
@MethodSource("gradleAndSigstoreJavaVersions")
31+
fun `sign file`(gradle: TestedGradle, sigstoreJava: TestedSigstoreJava) {
3132
writeBuildGradle(
3233
"""
3334
import dev.sigstore.sign.tasks.SigstoreSignFilesTask
3435
plugins {
3536
id("java")
3637
id("dev.sigstore.sign-base")
3738
}
38-
repositories {
39-
mavenCentral()
40-
}
39+
${declareRepositoryAndDependency(sigstoreJava)}
4140
group = "dev.sigstore.test"
4241
def helloProps = tasks.register("helloProps", WriteProperties) {
4342
outputFile = file("build/helloProps.txt")
@@ -54,15 +53,15 @@ class SigstoreSignTest: BaseGradleTest() {
5453
rootProject.name = 'sigstore-test'
5554
""".trimIndent()
5655
)
57-
enableConfigurationCache(gradleVersion, configurationCache)
58-
prepare(gradleVersion, "signFile", "-s")
56+
enableConfigurationCache(gradle)
57+
prepare(gradle.version, "signFile", "-s")
5958
.build()
6059
assertThat(projectDir.resolve("build/helloProps.txt.sigstore"))
6160
.content()
6261
.basicSigstoreStructure()
6362

64-
if (configurationCache == ConfigurationCache.ON) {
65-
val result = prepare(gradleVersion, "signFile", "-s")
63+
if (gradle.configurationCache == ConfigurationCache.ON) {
64+
val result = prepare(gradle.version, "signFile", "-s")
6665
.build()
6766

6867
assertThat(result.output)

sigstore-gradle/sigstore-gradle-sign-plugin/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ description = "Gradle plugin to that automatically signs all Publications in Sig
88
dependencies {
99
api(project(":sigstore-gradle:sigstore-gradle-sign-base-plugin"))
1010

11+
sigstoreJavaRuntime(project(":sigstore-java")) {
12+
because("Test code needs access locally-built sigstore-java as a Maven repository")
13+
}
14+
1115
testImplementation(project(":sigstore-testkit"))
1216
}
1317

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

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

1919
import dev.sigstore.testkit.BaseGradleTest
20+
import dev.sigstore.testkit.TestedGradle
21+
import dev.sigstore.testkit.TestedSigstoreJava
2022
import dev.sigstore.testkit.annotations.EnabledIfOidcExists
2123
import org.assertj.core.api.Assertions.assertThat
22-
import org.junit.jupiter.api.Disabled
2324
import org.junit.jupiter.params.ParameterizedTest
2425
import org.junit.jupiter.params.provider.MethodSource
2526

2627
@EnabledIfOidcExists
2728
class SigstorePublishSignTest : BaseGradleTest() {
2829
@ParameterizedTest
29-
@MethodSource("gradleVersionAndSettings")
30-
fun `sign file`(gradleVersion: String, configurationCache: ConfigurationCache) {
30+
@MethodSource("gradleAndSigstoreJavaVersions")
31+
fun `sign file`(gradle: TestedGradle, sigstoreJava: TestedSigstoreJava) {
3132
writeBuildGradle(
3233
"""
3334
plugins {
3435
id("java")
3536
id("maven-publish")
3637
id("dev.sigstore.sign")
3738
}
38-
repositories {
39-
mavenCentral()
40-
}
39+
${declareRepositoryAndDependency(sigstoreJava)}
4140
4241
group = "dev.sigstore.test"
4342
java {
@@ -66,8 +65,8 @@ class SigstorePublishSignTest : BaseGradleTest() {
6665
rootProject.name = 'sigstore-test'
6766
""".trimIndent()
6867
)
69-
enableConfigurationCache(gradleVersion, configurationCache)
70-
prepare(gradleVersion, "publishAllPublicationsToTmpRepository", "-s")
68+
enableConfigurationCache(gradle)
69+
prepare(gradle.version, "publishAllPublicationsToTmpRepository", "-s")
7170
.build()
7271

7372
assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/sigstore-test-1.0.pom.sigstore"))
@@ -83,8 +82,8 @@ class SigstorePublishSignTest : BaseGradleTest() {
8382
.content()
8483
.basicSigstoreStructure()
8584

86-
if (configurationCache == ConfigurationCache.ON) {
87-
val result = prepare(gradleVersion, "publishAllPublicationsToTmpRepository", "-s")
85+
if (gradle.configurationCache == ConfigurationCache.ON) {
86+
val result = prepare(gradle.version, "publishAllPublicationsToTmpRepository", "-s")
8887
.build()
8988

9089
assertThat(result.output)

sigstore-java/build.gradle.kts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@ dependencies {
2020

2121
implementation("io.github.erdtman:java-json-canonicalization:1.1")
2222

23+
implementation("dev.sigstore:protobuf-specs:0.0.1") {
24+
because("It generates Sigstore Bundle file")
25+
}
26+
implementation("com.google.protobuf:protobuf-java-util:3.13.0") {
27+
because("It converts protobuf to json")
28+
}
29+
2330
// grpc deps
2431
implementation(platform("io.grpc:grpc-bom:1.51.1"))
2532
implementation("io.grpc:grpc-protobuf")

0 commit comments

Comments
 (0)