Skip to content

Commit 4d5811d

Browse files
committed
Allow using centrally declared registries in --registry option of push tasks
1 parent 4fa895f commit 4d5811d

2 files changed

Lines changed: 31 additions & 16 deletions

File tree

src/main/kotlin/io/github/sgtsilvio/gradle/oci/image/PushOciImagesTask.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package io.github.sgtsilvio.gradle.oci.image
22

33
import io.github.sgtsilvio.gradle.oci.dsl.OciExtension
44
import io.github.sgtsilvio.gradle.oci.dsl.OciRegistry
5+
import io.github.sgtsilvio.gradle.oci.internal.dsl.settingsRegistriesService
56
import io.github.sgtsilvio.gradle.oci.internal.gradle.passwordCredentials
67
import io.github.sgtsilvio.gradle.oci.internal.reactor.netty.OciRegistryHttpClient
78
import io.github.sgtsilvio.gradle.oci.internal.registry.Credentials
@@ -23,7 +24,10 @@ import org.gradle.api.tasks.Internal
2324
import org.gradle.api.tasks.Nested
2425
import org.gradle.api.tasks.options.Option
2526
import org.gradle.internal.logging.progress.ProgressLoggerFactory
26-
import org.gradle.kotlin.dsl.*
27+
import org.gradle.kotlin.dsl.getByType
28+
import org.gradle.kotlin.dsl.newInstance
29+
import org.gradle.kotlin.dsl.registerIfAbsent
30+
import org.gradle.kotlin.dsl.submit
2731
import org.gradle.work.DisableCachingByDefault
2832
import org.gradle.workers.WorkAction
2933
import org.gradle.workers.WorkParameters
@@ -75,8 +79,11 @@ abstract class PushOciImagesTask @Inject constructor(private val workerExecutor:
7579
option = "registry",
7680
description = "Pushes to the registry defined with the specified name in oci.registries.",
7781
)
78-
protected fun setRegistryName(registryName: String) =
79-
registry.from(project.extensions.getByType(OciExtension::class).registries.list[registryName])
82+
protected fun setRegistryName(registryName: String) = registry.from(
83+
project.extensions.getByType(OciExtension::class).registries.list.findByName(registryName)
84+
?: project.settingsRegistriesService?.registries?.findByName(registryName)
85+
?: throw IllegalArgumentException("Registry with name '$registryName' not found.")
86+
)
8087

8188
@Option(option = "url", description = "Pushes to the specified registry URL.")
8289
protected fun setRegistryUrl(registryUrl: String) = registry.url.set(project.uri(registryUrl))

src/main/kotlin/io/github/sgtsilvio/gradle/oci/internal/dsl/OciRegistriesImpl.kt

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import io.netty.buffer.UnpooledByteBufAllocator
1616
import io.netty.channel.ChannelOption
1717
import io.netty.util.concurrent.FastThreadLocal
1818
import org.gradle.api.Action
19+
import org.gradle.api.NamedDomainObjectList
1920
import org.gradle.api.Project
2021
import org.gradle.api.artifacts.ResolvableDependencies
2122
import org.gradle.api.artifacts.dsl.RepositoryHandler
@@ -142,7 +143,7 @@ private const val PORT_HTTP_HEADER_NAME = "port"
142143
internal fun OciRegistriesService(
143144
buildServiceRegistry: BuildServiceRegistry,
144145
name: String,
145-
registries: List<OciRegistry>,
146+
registries: NamedDomainObjectList<OciRegistry>,
146147
repositoryPort: Provider<Int>,
147148
imageMapping: OciImageMappingImpl,
148149
): OciRegistriesService {
@@ -154,24 +155,26 @@ internal fun OciRegistriesService(
154155
internal abstract class OciRegistriesService : BuildService<BuildServiceParameters.None>, AutoCloseable {
155156
private var state: State? = null
156157

157-
sealed class State {
158+
sealed class State(val registries: NamedDomainObjectList<OciRegistry>) {
159+
158160
class Initialized(
159-
val registries: List<OciRegistry>,
161+
registries: NamedDomainObjectList<OciRegistry>,
160162
val repositoryPort: Provider<Int>,
161163
val imageMapping: OciImageMappingImpl,
162-
) : State()
164+
) : State(registries)
163165

164166
class Started(
167+
registries: NamedDomainObjectList<OciRegistry>,
165168
val httpServers: List<DisposableServer>,
166-
) : State()
169+
) : State(registries)
167170

168-
object NoRegistries : State()
171+
class NoRegistries(registries: NamedDomainObjectList<OciRegistry>) : State(registries)
169172

170-
object Closed : State()
173+
class Closed(registries: NamedDomainObjectList<OciRegistry>) : State(registries)
171174
}
172175

173176
fun init(
174-
registries: List<OciRegistry>,
177+
registries: NamedDomainObjectList<OciRegistry>,
175178
repositoryPort: Provider<Int>,
176179
imageMapping: OciImageMappingImpl,
177180
) = synchronized(this) {
@@ -181,19 +184,22 @@ internal abstract class OciRegistriesService : BuildService<BuildServiceParamete
181184
state = State.Initialized(registries, repositoryPort, imageMapping)
182185
}
183186

187+
val registries: NamedDomainObjectList<OciRegistry> get() = state?.registries
188+
?: throw IllegalStateException("OciRegistriesService.registries must be called after init")
189+
184190
fun start() = synchronized(this) {
185191
val currentState = state
186192
?: throw IllegalStateException("OciRegistriesService.start must be called after init")
187193
if (currentState !is State.Initialized) {
188194
return
189195
}
190196
if (currentState.registries.isEmpty()) {
191-
state = State.NoRegistries
197+
state = State.NoRegistries(currentState.registries)
192198
} else {
193199
val loopResources = OciLoopResources.acquire()
194200
val httpClient = OciRegistryHttpClient.acquire()
195201
val httpServers = mutableListOf<DisposableServer>()
196-
state = State.Started(httpServers)
202+
state = State.Started(currentState.registries, httpServers)
197203
val redirectServer = startRedirectServer(currentState.repositoryPort.get(), loopResources)
198204
if (redirectServer != null) {
199205
httpServers += redirectServer
@@ -268,7 +274,7 @@ internal abstract class OciRegistriesService : BuildService<BuildServiceParamete
268274
OciRegistryHttpClient.release()
269275
OciLoopResources.release()
270276
}
271-
state = State.Closed
277+
state = State.Closed(currentState.registries)
272278
}
273279
}
274280

@@ -287,8 +293,7 @@ internal fun setupSettingsOciRegistries(
287293
}
288294

289295
internal fun setupProjectOciRegistries(project: Project, registries: OciRegistries, imageMapping: OciImageMappingImpl) {
290-
val settingsRegistriesService =
291-
project.gradle.sharedServices.registrations.findByName(SERVICE_BASE_NAME)?.service?.get() as? OciRegistriesService
296+
val settingsRegistriesService = project.settingsRegistriesService
292297
val registriesService = OciRegistriesService(
293298
project.gradle.sharedServices,
294299
"$SERVICE_BASE_NAME-${project.path}",
@@ -306,5 +311,8 @@ internal fun setupProjectOciRegistries(project: Project, registries: OciRegistri
306311
}
307312
}
308313

314+
internal val Project.settingsRegistriesService: OciRegistriesService?
315+
get() = project.gradle.sharedServices.registrations.findByName(SERVICE_BASE_NAME)?.service?.get() as? OciRegistriesService
316+
309317
private fun ResolvableDependencies.resolvesOciImages() =
310318
attributes.getAttribute(DISTRIBUTION_TYPE_ATTRIBUTE) in OCI_IMAGE_DISTRIBUTION_TYPES

0 commit comments

Comments
 (0)