migrate docker-compose convention plugin out of buildSrc

This commit is contained in:
Adam 2022-10-02 12:11:06 +02:00
parent 105555bf6c
commit f804c39a3b
32 changed files with 564 additions and 239 deletions

View file

@ -1,8 +1,9 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
`kotlin-dsl`
kotlin("jvm") version embeddedKotlinVersion
id("kafkatorio.conventions.kotlin-dsl")
// `kotlin-dsl`
// kotlin("jvm") version embeddedKotlinVersion
}
dependencies {
@ -34,20 +35,20 @@ dependencies {
implementation(libs.kotlinx.cli)
}
val gradleJvmTarget = "11"
kotlin {
jvmToolchain {
(this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(gradleJvmTarget))
}
}
kotlinDslPluginOptions {
jvmTarget.set(gradleJvmTarget)
}
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = gradleJvmTarget
}
}
//val gradleJvmTarget = "11"
//
//kotlin {
// jvmToolchain {
// (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(gradleJvmTarget))
// }
//}
//
//kotlinDslPluginOptions {
// jvmTarget.set(gradleJvmTarget)
//}
//
//tasks.withType<KotlinCompile>().configureEach {
// kotlinOptions {
// jvmTarget = gradleJvmTarget
// }
//}

View file

@ -0,0 +1,24 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
kotlin("jvm")
}
val gradleJvmTarget = "11"
dependencies {
implementation(platform(kotlin("bom")))
implementation(gradleApi())
}
kotlin {
jvmToolchain {
(this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(gradleJvmTarget))
}
}
tasks.withType<KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = gradleJvmTarget
}
}

View file

@ -0,0 +1,17 @@
package kafkatorio.common
import org.gradle.api.artifacts.Configuration
fun Configuration.asProvider() {
isVisible = false
isCanBeResolved = false
isCanBeConsumed = true
}
fun Configuration.asConsumer() {
isVisible = false
isCanBeResolved = true
isCanBeConsumed = false
}

View file

@ -16,3 +16,16 @@ dependencyResolutionManagement {
}
}
}
include(
":modules:common-lib",
":modules:build-conventions",
":modules:docker-compose",
":modules:factorio-mod",
":modules:typescript",
)
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")

View file

@ -1,63 +1,63 @@
package kafkatorio.conventions.infra
import kafkatorio.tasks.DockerEnvUpdateTask
import kafkatorio.extensions.DOCKER_COMPOSE_TASK_GROUP
import org.jetbrains.kotlin.util.parseSpaceSeparatedArgs
plugins {
base
id("kafkatorio.conventions.infra.process-runner")
}
val dockerComposeProjectName: String by extra(rootProject.name)
val dockerSrcDir: Directory by extra(layout.projectDirectory.dir("src"))
val dockerUp by tasks.registering(Exec::class) {
group = DOCKER_COMPOSE_TASK_GROUP
dependsOn(tasks.assemble)
logging.captureStandardOutput(LogLevel.LIFECYCLE)
workingDir = dockerSrcDir.asFile
commandLine = parseSpaceSeparatedArgs(""" docker-compose up -d """)
}
val dockerDown by tasks.registering(Exec::class) {
group = DOCKER_COMPOSE_TASK_GROUP
logging.captureStandardOutput(LogLevel.LIFECYCLE)
workingDir = dockerSrcDir.asFile
commandLine = parseSpaceSeparatedArgs(""" docker-compose down """)
}
val dockerRemove by tasks.registering(Exec::class) {
group = DOCKER_COMPOSE_TASK_GROUP
logging.captureStandardOutput(LogLevel.LIFECYCLE)
workingDir = dockerSrcDir.asFile
commandLine = parseSpaceSeparatedArgs(""" docker-compose rm --stop -v -f """)
}
tasks.matching { it.name == "processRun" }.configureEach { dependsOn(dockerUp, dockerEnvUpdate) }
tasks.matching { it.name == "processKill" }.configureEach { dependsOn(dockerDown) }
val dockerEnvUpdate by tasks.registering(DockerEnvUpdateTask::class) {
dotEnvFile.set(dockerSrcDir.file(".env"))
properties(
"COMPOSE_PROJECT_NAME" to dockerComposeProjectName,
"KAFKATORIO_VERSION" to project.version,
"REGISTRY_HOST" to providers.gradleProperty("dockerContainerRegistryHost"),
)
}
tasks.assemble { dependsOn(dockerEnvUpdate) }
//import kafkatorio.tasks.DockerEnvUpdateTask
//import kafkatorio.extensions.DOCKER_COMPOSE_TASK_GROUP
//import org.jetbrains.kotlin.util.parseSpaceSeparatedArgs
//
//plugins {
// base
// id("kafkatorio.conventions.infra.process-runner")
//}
//
//
//val dockerComposeProjectName: String by extra(rootProject.name)
//val dockerSrcDir: Directory by extra(layout.projectDirectory.dir("src"))
//
//
//val dockerUp by tasks.registering(Exec::class) {
// group = DOCKER_COMPOSE_TASK_GROUP
//
// dependsOn(tasks.assemble)
// logging.captureStandardOutput(LogLevel.LIFECYCLE)
//
// workingDir = dockerSrcDir.asFile
// commandLine = parseSpaceSeparatedArgs(""" docker-compose up -d """)
//}
//
//
//val dockerDown by tasks.registering(Exec::class) {
// group = DOCKER_COMPOSE_TASK_GROUP
//
// logging.captureStandardOutput(LogLevel.LIFECYCLE)
//
// workingDir = dockerSrcDir.asFile
// commandLine = parseSpaceSeparatedArgs(""" docker-compose down """)
//}
//
//
//val dockerRemove by tasks.registering(Exec::class) {
// group = DOCKER_COMPOSE_TASK_GROUP
//
// logging.captureStandardOutput(LogLevel.LIFECYCLE)
//
// workingDir = dockerSrcDir.asFile
// commandLine = parseSpaceSeparatedArgs(""" docker-compose rm --stop -v -f """)
//}
//
//
//tasks.matching { it.name == "processRun" }.configureEach { dependsOn(dockerUp, dockerEnvUpdate) }
//tasks.matching { it.name == "processKill" }.configureEach { dependsOn(dockerDown) }
//
//
//val dockerEnvUpdate by tasks.registering(DockerEnvUpdateTask::class) {
// dotEnvFile.set(dockerSrcDir.file(".env"))
//
// properties(
// "COMPOSE_PROJECT_NAME" to dockerComposeProjectName,
// "KAFKATORIO_VERSION" to project.version,
// "REGISTRY_HOST" to providers.gradleProperty("dockerContainerRegistryHost"),
// )
//}
//
//
//tasks.assemble { dependsOn(dockerEnvUpdate) }

View file

@ -1,81 +0,0 @@
package kafkatorio.tasks
import kafkatorio.extensions.filesChecksum
import javax.inject.Inject
import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.logging.LogLevel
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.PathSensitive
import org.gradle.api.tasks.PathSensitivity
import org.gradle.api.tasks.SkipWhenEmpty
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.property
import org.gradle.process.ExecOperations
import org.gradle.work.NormalizeLineEndings
import org.jetbrains.kotlin.util.parseSpaceSeparatedArgs
@CacheableTask
@Suppress("UnstableApiUsage")
abstract class DockerComposeExec @Inject constructor(
private val executor: ExecOperations,
private val objects: ObjectFactory,
private val providers: ProviderFactory,
) : DefaultTask() {
@get:InputDirectory
@get:SkipWhenEmpty
@get:PathSensitive(PathSensitivity.RELATIVE)
@get:NormalizeLineEndings
abstract val dockerComposeDir: DirectoryProperty
@get:Input
abstract val command: Property<String>
@get:Input
val dockerIsActive: Property<Boolean> = objects.property<Boolean>().convention(
providers.exec {
commandLine = parseSpaceSeparatedArgs("docker info")
isIgnoreExitValue = true
}.result.map {
it.exitValue == 0
}
)
@get:OutputFile
val stateFile: RegularFileProperty = objects.fileProperty().convention {
temporaryDir.resolve("docker-files.md5")
}
init {
group = DOCKER_COMPOSE_GROUP
logging.captureStandardOutput(LogLevel.LIFECYCLE)
super.onlyIf { task ->
require(task is DockerComposeExec)
task.dockerIsActive.getOrElse(false)
}
}
@TaskAction
fun exec() {
executor.exec {
workingDir = dockerComposeDir.asFile.get()
commandLine = parseSpaceSeparatedArgs(command.get())
}
val inputChecksum = dockerComposeDir.get().filesChecksum()
stateFile.get().asFile.writeText("$inputChecksum")
}
companion object {
const val DOCKER_COMPOSE_GROUP: String = "docker-compose"
}
}

View file

@ -1,27 +0,0 @@
package kafkatorio.tasks
import javax.inject.Inject
import kafkatorio.extensions.DOCKER_COMPOSE_TASK_GROUP
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.logging.LogLevel
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.WriteProperties
@CacheableTask
open class DockerEnvUpdateTask @Inject constructor(
private val objects: ObjectFactory
) : WriteProperties() {
@Internal
val dotEnvFile: RegularFileProperty = objects.fileProperty()
init {
group = DOCKER_COMPOSE_TASK_GROUP
super.setOutputFile(dotEnvFile)
super.getLogging().captureStandardOutput(LogLevel.LIFECYCLE)
}
}