Skip to content

Commit 44f1df7

Browse files
committed
Reorganize image input/output code
1 parent ef47090 commit 44f1df7

File tree

15 files changed

+71
-82
lines changed

15 files changed

+71
-82
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313

1414
### Chore
1515

16-
- Simplify image input/output API.
16+
- Improve image input/output API.
1717

1818
## [0.2.1] - 2025-04-23
1919

examples/buildpacks/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
import dev.codebandits.container.gradle.image.outputLocalImage
12
import dev.codebandits.container.gradle.tasks.ContainerTask
2-
import dev.codebandits.container.gradle.tasks.outputLocalImage
33

44
plugins {
55
id("dev.codebandits.container")

examples/dind-build/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
import dev.codebandits.container.gradle.image.outputLocalImage
12
import dev.codebandits.container.gradle.tasks.ContainerTask
2-
import dev.codebandits.container.gradle.tasks.outputLocalImage
33

44
plugins {
55
id("dev.codebandits.container")

examples/input-output-chaining/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
import dev.codebandits.container.gradle.image.inputLocalImage
2+
import dev.codebandits.container.gradle.image.outputLocalImage
13
import dev.codebandits.container.gradle.tasks.ContainerTask
2-
import dev.codebandits.container.gradle.tasks.inputLocalImage
3-
import dev.codebandits.container.gradle.tasks.outputLocalImage
44
import org.gradle.kotlin.dsl.support.serviceOf
55

66
plugins {

src/main/kotlin/dev/codebandits/container/gradle/tasks/ImageReferenceParts.kt renamed to src/main/kotlin/dev/codebandits/container/gradle/image/ImageReferenceParts.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package dev.codebandits.container.gradle.tasks
1+
package dev.codebandits.container.gradle.image
22

33
internal data class ImageReferenceParts(
44
val registry: String,

src/main/kotlin/dev/codebandits/container/gradle/docker/Docker.kt renamed to src/main/kotlin/dev/codebandits/container/gradle/image/Local.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
1-
package dev.codebandits.container.gradle.docker
1+
package dev.codebandits.container.gradle.image
22

33
import com.github.dockerjava.api.DockerClient
4+
import com.github.dockerjava.api.exception.NotFoundException
45
import com.github.dockerjava.core.DefaultDockerClientConfig
56
import com.github.dockerjava.core.DockerClientImpl
67
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient
78

8-
internal object Docker {
9+
internal object Local {
10+
internal fun getImageId(imageReference: String): String? {
11+
val dockerClient = Local.createClient()
12+
try {
13+
val inspectImageResponse = dockerClient.inspectImageCmd(imageReference).exec()
14+
return inspectImageResponse.id
15+
} catch (_: NotFoundException) {
16+
return null
17+
}
18+
}
19+
920
internal fun createClient(dockerHost: String? = null): DockerClient {
1021
val config = DefaultDockerClientConfig.createDefaultConfigBuilder()
1122
.let { it -> if (dockerHost == null) it else it.withDockerHost(dockerHost) }

src/main/kotlin/dev/codebandits/container/gradle/docker/Registry.kt renamed to src/main/kotlin/dev/codebandits/container/gradle/image/Registry.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
package dev.codebandits.container.gradle.docker
1+
package dev.codebandits.container.gradle.image
22

3-
import dev.codebandits.container.gradle.tasks.ImageReferenceParts
4-
import dev.codebandits.container.gradle.tasks.toImageReferenceParts
53
import org.gradle.api.GradleException
64
import java.net.URI
75
import java.net.http.HttpClient
@@ -11,7 +9,7 @@ import java.net.http.HttpResponse
119
internal object Registry {
1210
private val httpClient = HttpClient.newBuilder().build()
1311

14-
internal fun getDigest(imageReference: String): String? {
12+
internal fun getImageDigest(imageReference: String): String? {
1513
val imageReferenceParts = imageReference.toImageReferenceParts()
1614
val httpResponse = run {
1715
val httpRequest = buildRegistryManifestRequest(imageReferenceParts)

src/main/kotlin/dev/codebandits/container/gradle/tasks/extensions.kt renamed to src/main/kotlin/dev/codebandits/container/gradle/image/extensions.kt

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
package dev.codebandits.container.gradle.tasks
1+
package dev.codebandits.container.gradle.image
22

33
import org.gradle.api.Task
4+
import org.gradle.api.file.RegularFile
5+
import org.gradle.api.provider.Provider
6+
import java.net.URLEncoder
7+
import java.nio.charset.StandardCharsets
48

59
public fun Task.inputLocalImage(
610
imageReference: String,
@@ -54,3 +58,35 @@ public fun Task.outputRegistryImage(
5458
}
5559
}
5660
}
61+
62+
private fun Task.getLocalImageTrackingFile(
63+
imageReference: String,
64+
): Provider<RegularFile> {
65+
val fileName = URLEncoder.encode(imageReference, StandardCharsets.UTF_8)
66+
return project.layout.buildDirectory.file("images/local/$fileName")
67+
}
68+
69+
private fun Task.getRegistryImageTrackingFile(
70+
imageReference: String,
71+
): Provider<RegularFile> {
72+
val fileName = URLEncoder.encode(imageReference, StandardCharsets.UTF_8)
73+
return project.layout.buildDirectory.file("images/registry/$fileName")
74+
}
75+
76+
private fun writeLocalImageId(imageReference: String, regularFile: RegularFile) {
77+
val file = regularFile.asFile
78+
if (!file.parentFile.exists()) {
79+
file.parentFile.mkdirs()
80+
}
81+
val imageId = Local.getImageId(imageReference)
82+
file.writeText(imageId ?: "")
83+
}
84+
85+
private fun writeRegistryImageDigest(imageReference: String, regularFile: RegularFile) {
86+
val file = regularFile.asFile
87+
if (!file.parentFile.exists()) {
88+
file.parentFile.mkdirs()
89+
}
90+
val imageDigest = Registry.getImageDigest(imageReference)
91+
file.writeText(imageDigest ?: "")
92+
}

src/main/kotlin/dev/codebandits/container/gradle/tasks/ContainerTask.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import com.github.dockerjava.api.model.Bind
77
import com.github.dockerjava.api.model.Frame
88
import com.github.dockerjava.api.model.HostConfig
99
import com.github.dockerjava.api.model.StreamType
10-
import dev.codebandits.container.gradle.docker.Docker
10+
import dev.codebandits.container.gradle.image.Local
1111
import org.gradle.api.DefaultTask
1212
import org.gradle.api.GradleException
1313
import org.gradle.api.model.ObjectFactory
@@ -57,7 +57,7 @@ public abstract class ContainerTask : DefaultTask() {
5757
action = {
5858
val spec = DockerPullSpec(project.objects).apply(configure)
5959
val dockerHost = spec.dockerHost.orNull
60-
val dockerClient = Docker.createClient(dockerHost)
60+
val dockerClient = Local.createClient(dockerHost)
6161

6262
dockerClient
6363
.pullImageCmd(spec.image.get())
@@ -74,7 +74,7 @@ public abstract class ContainerTask : DefaultTask() {
7474
action = {
7575
val spec = DockerRemoveSpec(project.objects).apply(configure)
7676
val dockerHost = spec.dockerHost.orNull
77-
val dockerClient = Docker.createClient(dockerHost)
77+
val dockerClient = Local.createClient(dockerHost)
7878

7979
dockerClient
8080
.removeImageCmd(spec.image.get())
@@ -90,7 +90,7 @@ public abstract class ContainerTask : DefaultTask() {
9090
action = {
9191
val spec = DockerRunSpec(project.objects).apply(configure)
9292
val dockerHost = spec.dockerHost.orNull
93-
val dockerClient = Docker.createClient(dockerHost)
93+
val dockerClient = Local.createClient(dockerHost)
9494

9595
val hostConfig = HostConfig.newHostConfig()
9696
.withAutoRemove(spec.autoRemove.get())

src/main/kotlin/dev/codebandits/container/gradle/tasks/ExecutionStep.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package dev.codebandits.container.gradle.tasks
22

3-
import org.gradle.api.Action
4-
import org.gradle.api.Task
53
import org.gradle.process.ExecResult
64

75
public class ExecutionStep(

0 commit comments

Comments
 (0)