Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,15 @@
*/
import dev.sigstore.sign.SigstoreSignExtension
import dev.sigstore.sign.services.SigstoreSigningService
import dev.sigstore.sign.tasks.SigstoreSignFilesTask

// https://github.com/gradle/gradle/pull/16627
inline fun <reified T: Named> AttributeContainer.attribute(attr: Attribute<T>, value: String) =
attribute(attr, objects.named<T>(value))

val sigstoreSign = extensions.create("sigstoreSign", SigstoreSignExtension::class, project)
val sigstoreSign = extensions.create("sigstoreSign", SigstoreSignExtension::class)

gradle.sharedServices.registerIfAbsent(SigstoreSigningService.SERVICE_NAME, SigstoreSigningService::class) {
val service = gradle.sharedServices.registerIfAbsent(SigstoreSigningService.SERVICE_NAME, SigstoreSigningService::class) {
parameters {
// Prevents concurrent execution of tasks that use the service, so we ensure there's only one signing task active at a time
maxParallelUsages.set(1)
Expand All @@ -41,7 +42,7 @@ val sigstoreClient = configurations.create("sigstoreClient") {
}
}

val sigstoreClientClasspath = configurations.create("sigstoreClientClasspath") {
val sigstoreClientClasspathConf = configurations.register("sigstoreClientClasspath") {
description = "Resolves Sigstore dependencies"
isCanBeResolved = true
isCanBeConsumed = false
Expand All @@ -54,3 +55,11 @@ val sigstoreClientClasspath = configurations.create("sigstoreClientClasspath") {
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, JavaVersion.current().majorVersion.toInt())
}
}

tasks.withType<SigstoreSignFilesTask>().configureEach {
// See https://docs.gradle.org/current/userguide/build_services.html
signingService.set(service)
usesService(service)

sigstoreClientClasspath.from(sigstoreClientClasspathConf)
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,29 +17,25 @@
package dev.sigstore.sign

import dev.sigstore.sign.tasks.SigstoreSignFilesTask
import org.gradle.api.Action
import org.gradle.api.DefaultTask
import org.gradle.api.DomainObjectCollection
import org.gradle.api.Project
import org.gradle.api.plugins.ExtensionAware
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.publish.Publication
import org.gradle.api.publish.PublicationArtifact
import org.gradle.api.publish.internal.PublicationInternal
import org.gradle.api.publish.maven.MavenArtifact
import org.gradle.api.publish.maven.internal.artifact.AbstractMavenArtifact
import org.gradle.api.publish.maven.internal.artifact.DerivedMavenArtifact
import org.gradle.kotlin.dsl.create
import org.gradle.kotlin.dsl.named
import org.gradle.kotlin.dsl.register
import org.gradle.kotlin.dsl.the
import org.gradle.kotlin.dsl.withType
import org.gradle.plugins.signing.Sign
import org.gradle.util.GradleVersion
import javax.inject.Inject
import kotlin.collections.set

abstract class SigstoreSignExtension(private val project: Project) {
abstract class SigstoreSignExtension @Inject constructor (private val project: Project) {
private val Publication.signingTaskName: String
get() = "sigstoreSign${name.titlecase()}Publication"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,5 @@ abstract class SigstoreSigningService: BuildService<SigstoreSigningService.Param
const val SERVICE_NAME = "sigstoreJavaSigningService"
}

interface Params: BuildServiceParameters {
}
interface Params: BuildServiceParameters
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,13 @@
*/
package dev.sigstore.sign.tasks

import dev.sigstore.sign.SigstoreSignExtension
import dev.sigstore.sign.SigstoreSignature
import dev.sigstore.sign.services.SigstoreSigningService
import dev.sigstore.sign.work.SignWorkAction
import org.gradle.api.Buildable
import org.gradle.api.DefaultTask
import org.gradle.api.JavaVersion
import org.gradle.api.NamedDomainObjectContainer
import org.gradle.api.file.*
import org.gradle.api.model.ObjectFactory
import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
Expand All @@ -34,7 +31,6 @@ import org.gradle.api.tasks.*
import org.gradle.jvm.toolchain.JavaLauncher
import org.gradle.jvm.toolchain.JavaToolchainService
import org.gradle.kotlin.dsl.findByType
import org.gradle.kotlin.dsl.get
import org.gradle.kotlin.dsl.the
import org.gradle.work.DisableCachingByDefault
import org.gradle.workers.WorkerExecutor
Expand All @@ -43,22 +39,6 @@ import javax.inject.Inject

@DisableCachingByDefault(because = "Sigstore signatures are true-timestamp dependent, so we should not cache signatures")
abstract class SigstoreSignFilesTask : DefaultTask() {
companion object {
private val PROPERTY_SET_PROVIDER = Property::class.java.getMethod("set", Provider::class.java)
}

init {
@Suppress("UNCHECKED_CAST")
val service: Provider<SigstoreSigningService> =
project.gradle.sharedServices.registrations[SigstoreSigningService.SERVICE_NAME].service as Provider<SigstoreSigningService>

// Use reflection to resolve set(Provider) vs set(Object) ambiguity
@Suppress("LeakingThis")
PROPERTY_SET_PROVIDER.invoke(signingService, service)
// See https://docs.gradle.org/current/userguide/build_services.html
@Suppress("LeakingThis")
usesService(service)
}

/**
* Signing service is there so none of the signing tasks execute concurrently.
Expand All @@ -67,20 +47,13 @@ abstract class SigstoreSignFilesTask : DefaultTask() {
* Type is `Any` to workaround https://github.com/gradle/gradle/issues/17559
*/
@get:Internal
protected abstract val signingService: Property<Any>

@Nested
val signatures: NamedDomainObjectContainer<SigstoreSignature> =
objects.domainObjectContainer(SigstoreSignature::class.java) {
objects.newInstance(
SigstoreSignature::class.java,
it,
)
}
internal abstract val signingService: Property<Any>

@get:Nested
abstract val signatures: NamedDomainObjectContainer<SigstoreSignature>

@get:Classpath
@get:InputFiles
protected abstract val sigstoreClientClasspath: ConfigurableFileCollection
abstract val sigstoreClientClasspath: ConfigurableFileCollection

@get:Internal
abstract val signatureDirectory: DirectoryProperty
Expand All @@ -95,9 +68,6 @@ abstract class SigstoreSignFilesTask : DefaultTask() {
@get:Inject
protected abstract val providers: ProviderFactory

@get:Inject
protected abstract val objects: ObjectFactory

@get:Inject
protected abstract val layout: ProjectLayout

Expand All @@ -109,7 +79,6 @@ abstract class SigstoreSignFilesTask : DefaultTask() {
outputs.cacheIf("Sigstore signatures are true-timestamp dependent, so we should not cache signatures") {
false
}
sigstoreClientClasspath.from(project.configurations["sigstoreClientClasspath"])
signatureDirectory.convention(
layout.buildDirectory.dir("sigstore/$name")
)
Expand Down
Loading