Skip to content

Commit 85d2b02

Browse files
committed
Update Kotlin DSL to use the container extension
Authored-by: Leonhardt Koepsell <hello@lnhrdt.com>
1 parent 5982603 commit 85d2b02

File tree

10 files changed

+115
-133
lines changed

10 files changed

+115
-133
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ plugins {
2424
Create tasks that use containers:
2525

2626
```kotlin
27+
import dev.codebandits.container.gradle.container
2728
import dev.codebandits.container.gradle.tasks.ContainerTask
2829

2930
tasks {
3031
register<ContainerTask>("writeHello") {
32+
container.inputLocalImage("alpine:latest")
3133
dockerPull { image = "alpine:latest" }
3234
dockerRun {
3335
image = "alpine:latest"

examples/buildpacks/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import dev.codebandits.container.gradle.image.outputLocalImage
1+
import dev.codebandits.container.gradle.container
22
import dev.codebandits.container.gradle.tasks.ContainerTask
33

44
plugins {
@@ -9,7 +9,7 @@ tasks {
99
register<ContainerTask>("buildImage") {
1010
inputs.file("index.html")
1111
inputs.file("project.toml")
12-
outputLocalImage("my-image:latest")
12+
container.outputLocalImage("my-image:latest")
1313
dockerPull {
1414
image = "buildpacksio/pack:latest"
1515
}

examples/dind-build/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import dev.codebandits.container.gradle.image.outputLocalImage
1+
import dev.codebandits.container.gradle.container
22
import dev.codebandits.container.gradle.tasks.ContainerTask
33

44
plugins {
@@ -8,7 +8,7 @@ plugins {
88
tasks {
99
register<ContainerTask>("buildImage") {
1010
inputs.file("Dockerfile")
11-
outputLocalImage("my-image:latest")
11+
container.outputLocalImage("my-image:latest")
1212
dockerPull {
1313
image = "docker:dind"
1414
}

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import dev.codebandits.container.gradle.image.inputLocalImage
2-
import dev.codebandits.container.gradle.image.outputLocalImage
1+
import dev.codebandits.container.gradle.container
32
import dev.codebandits.container.gradle.tasks.ContainerTask
43
import org.gradle.kotlin.dsl.support.serviceOf
54

@@ -10,7 +9,7 @@ plugins {
109
tasks {
1110
register("printImageID") {
1211
dependsOn("buildImage")
13-
inputLocalImage("my-image:latest")
12+
container.inputLocalImage("my-image:latest")
1413
doLast {
1514
serviceOf<ExecOperations>().exec {
1615
commandLine("sh", "-c", "docker images --filter reference=my-image:latest --format {{.ID}}")
@@ -20,7 +19,7 @@ tasks {
2019

2120
register<ContainerTask>("buildImage") {
2221
inputs.file("Dockerfile")
23-
outputLocalImage("my-image:latest")
22+
container.outputLocalImage("my-image:latest")
2423
dockerPull {
2524
image = "docker:dind"
2625
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package dev.codebandits.container.gradle
2+
3+
import dev.codebandits.container.gradle.image.Local
4+
import dev.codebandits.container.gradle.image.Registry
5+
import org.gradle.api.Task
6+
import org.gradle.api.file.RegularFile
7+
import org.gradle.api.provider.Provider
8+
import java.net.URLEncoder
9+
import java.nio.charset.StandardCharsets
10+
11+
public abstract class ContainerTaskExtension(private val task: Task) {
12+
public fun inputLocalImage(imageReference: String) {
13+
val trackingFile = task.getLocalImageTrackingFile(imageReference)
14+
task.inputs.file(trackingFile.map { regularFile ->
15+
writeLocalImageId(imageReference, regularFile)
16+
regularFile
17+
})
18+
}
19+
20+
public fun outputLocalImage(imageReference: String) {
21+
val trackingFile = task.getLocalImageTrackingFile(imageReference)
22+
task.outputs.file(trackingFile.map { regularFile ->
23+
writeLocalImageId(imageReference, regularFile)
24+
regularFile
25+
})
26+
task.doLast { writeLocalImageId(imageReference, trackingFile.get()) }
27+
}
28+
29+
public fun inputRegistryImage(imageReference: String, autoRefresh: Boolean = false) {
30+
val trackingFile = task.getRegistryImageTrackingFile(imageReference)
31+
task.inputs.file(trackingFile.map { regularFile ->
32+
if (autoRefresh || !regularFile.asFile.exists()) {
33+
writeRegistryImageDigest(imageReference, regularFile)
34+
}
35+
regularFile
36+
})
37+
}
38+
39+
public fun outputRegistryImage(imageReference: String, autoRefresh: Boolean = false) {
40+
val trackingFile = task.getLocalImageTrackingFile(imageReference)
41+
task.outputs.file(trackingFile.map { regularFile ->
42+
if (autoRefresh || !regularFile.asFile.exists()) {
43+
writeRegistryImageDigest(imageReference, regularFile)
44+
}
45+
regularFile
46+
})
47+
task.doLast {
48+
val regularFile = trackingFile.get()
49+
if (autoRefresh || !regularFile.asFile.exists()) {
50+
writeRegistryImageDigest(imageReference, regularFile)
51+
}
52+
}
53+
}
54+
55+
private fun Task.getLocalImageTrackingFile(
56+
imageReference: String,
57+
): Provider<RegularFile> {
58+
val fileName = URLEncoder.encode(imageReference, StandardCharsets.UTF_8)
59+
return project.layout.buildDirectory.file("images/local/$fileName")
60+
}
61+
62+
private fun Task.getRegistryImageTrackingFile(
63+
imageReference: String,
64+
): Provider<RegularFile> {
65+
val fileName = URLEncoder.encode(imageReference, StandardCharsets.UTF_8)
66+
return project.layout.buildDirectory.file("images/registry/$fileName")
67+
}
68+
69+
private fun writeLocalImageId(imageReference: String, regularFile: RegularFile) {
70+
val file = regularFile.asFile
71+
if (!file.parentFile.exists()) {
72+
file.parentFile.mkdirs()
73+
}
74+
val imageId = Local.getImageId(imageReference)
75+
file.writeText(imageId ?: "")
76+
}
77+
78+
private fun writeRegistryImageDigest(imageReference: String, regularFile: RegularFile) {
79+
val file = regularFile.asFile
80+
if (!file.parentFile.exists()) {
81+
file.parentFile.mkdirs()
82+
}
83+
val imageDigest = Registry.getImageDigest(imageReference)
84+
file.writeText(imageDigest ?: "")
85+
}
86+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package dev.codebandits.container.gradle
2+
3+
import org.gradle.api.Task
4+
5+
public val Task.container: ContainerTaskExtension get() = extensions.getByName("container") as ContainerTaskExtension

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

Lines changed: 0 additions & 110 deletions
This file was deleted.

src/main/kotlin/dev/codebandits/container/gradle/plugin/ContainerPlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.codebandits.container.gradle.plugin
22

3-
import dev.codebandits.container.gradle.image.ContainerTaskExtension
3+
import dev.codebandits.container.gradle.ContainerTaskExtension
44
import org.gradle.api.Plugin
55
import org.gradle.api.Project
66

src/testFeatures/kotlin/dev/codebandits/container/gradle/TaskImagesTest.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ class TaskImagesTest : GradleProjectTest() {
2222

2323
buildGradleKtsFile.appendLine(
2424
"""
25-
import dev.codebandits.container.gradle.image.inputLocalImage
25+
import dev.codebandits.container.gradle.container
2626
2727
plugins {
2828
id("dev.codebandits.container")
2929
}
3030
3131
tasks {
3232
register("useImage") {
33-
inputLocalImage("$imageReference")
33+
container.inputLocalImage("$imageReference")
3434
outputs.upToDateWhen { true }
3535
doLast { }
3636
}
@@ -88,16 +88,16 @@ class TaskImagesTest : GradleProjectTest() {
8888

8989
buildGradleKtsFile.appendLine(
9090
"""
91+
import dev.codebandits.container.gradle.container
9192
import dev.codebandits.container.gradle.tasks.ContainerTask
92-
import dev.codebandits.container.gradle.image.outputLocalImage
9393
9494
plugins {
9595
id("dev.codebandits.container")
9696
}
9797
9898
tasks {
9999
register<ContainerTask>("buildImage") {
100-
outputLocalImage("$imageReference")
100+
container.outputLocalImage("$imageReference")
101101
dockerPull { image = "docker:dind" }
102102
dockerRun {
103103
image = "docker:dind"
@@ -154,15 +154,15 @@ class TaskImagesTest : GradleProjectTest() {
154154
fun `inputRegistryImage checks remote image state for up-to-date determination`() {
155155
buildGradleKtsFile.appendLine(
156156
"""
157-
import dev.codebandits.container.gradle.image.inputRegistryImage
157+
import dev.codebandits.container.gradle.container
158158
159159
plugins {
160160
id("dev.codebandits.container")
161161
}
162162
163163
tasks {
164164
register("useImage") {
165-
inputRegistryImage("hello-world:latest")
165+
container.inputRegistryImage("hello-world:latest")
166166
outputs.upToDateWhen { true }
167167
doLast { }
168168
}
@@ -197,15 +197,15 @@ class TaskImagesTest : GradleProjectTest() {
197197
fun `inputRegistryImage can check fully qualified Docker Hub images`() {
198198
buildGradleKtsFile.appendLine(
199199
"""
200-
import dev.codebandits.container.gradle.image.inputRegistryImage
200+
import dev.codebandits.container.gradle.container
201201
202202
plugins {
203203
id("dev.codebandits.container")
204204
}
205205
206206
tasks {
207207
register("useImage") {
208-
inputRegistryImage("docker.io/library/hello-world:latest")
208+
container.inputRegistryImage("docker.io/library/hello-world:latest")
209209
outputs.upToDateWhen { true }
210210
doLast { }
211211
}
@@ -227,15 +227,15 @@ class TaskImagesTest : GradleProjectTest() {
227227
fun `inputRegistryImage can check fully qualified Quay images`() {
228228
buildGradleKtsFile.appendLine(
229229
"""
230-
import dev.codebandits.container.gradle.image.inputRegistryImage
230+
import dev.codebandits.container.gradle.container
231231
232232
plugins {
233233
id("dev.codebandits.container")
234234
}
235235
236236
tasks {
237237
register("useImage") {
238-
inputRegistryImage("quay.io/argoproj/argocd:latest")
238+
container.inputRegistryImage("quay.io/argoproj/argocd:latest")
239239
outputs.upToDateWhen { true }
240240
doLast { }
241241
}
@@ -257,15 +257,15 @@ class TaskImagesTest : GradleProjectTest() {
257257
fun `inputRegistryImage can check fully qualified GHCR images`() {
258258
buildGradleKtsFile.appendLine(
259259
"""
260-
import dev.codebandits.container.gradle.image.inputRegistryImage
260+
import dev.codebandits.container.gradle.container
261261
262262
plugins {
263263
id("dev.codebandits.container")
264264
}
265265
266266
tasks {
267267
register("useImage") {
268-
inputRegistryImage("ghcr.io/linuxserver/kasm:latest")
268+
container.inputRegistryImage("ghcr.io/linuxserver/kasm:latest")
269269
outputs.upToDateWhen { true }
270270
doLast { }
271271
}

0 commit comments

Comments
 (0)