multi‐micronaut build - krickert/search-api GitHub Wiki

import javax.inject.Inject
import org.gradle.api.tasks.TaskAction
import org.gradle.process.ExecOperations

abstract class MultiProjectTask @Inject constructor(
    private val execOperations: ExecOperations
) : DefaultTask() {

    protected val subprojectDirs = listOf(
        "./projects/project1",
        "./projects/project2",
        "./projects/project3",
        "./projects/project4",
    )

    protected val dockerSubprojectDirs = listOf(
        "./projects/project3",
        "./projects/project4",
    )

    protected val isWindows = System.getProperty("os.name").lowercase().contains("windows")
    protected val gradleCommand = if (isWindows) "./gradlew.bat" else "./gradlew"

    protected fun runGradleCommand(dir: String, vararg commands: String) {
        println("Running commands [${commands.joinToString()}] for $dir")
        execOperations.exec {
            workingDir = file(dir)
            commandLine(listOf(gradleCommand) + commands)
        }
    }
}

abstract class DockerBuildTask @Inject constructor(execOperations: ExecOperations) : MultiProjectTask(execOperations) {
    @TaskAction
    fun buildAllDocker() {
        dockerSubprojectDirs.forEach { dir ->
            runGradleCommand(dir, "clean", "publishToMavenLocal", "-x", "test")
        }
    }
}

tasks.register<DockerBuildTask>("allDocker") {
    group = "dockerBuild"
    description = "Create all the docker images"
}

abstract class CleanAndTestAllTask @Inject constructor(execOperations: ExecOperations) : MultiProjectTask(execOperations) {
    @TaskAction
    fun cleanAndTestAll() {
        subprojectDirs.forEach { dir ->
            runGradleCommand(dir, "clean", "test")
        }
    }
}

tasks.register<CleanAndTestAllTask>("cleanAndTestAll") {
    group = "verification"
    description = "Clean and run tests for all projects"
}

abstract class BuildAndPublishTask @Inject constructor(execOperations: ExecOperations) : MultiProjectTask(execOperations) {
    @TaskAction
    fun buildAndPublishAll() {
        subprojectDirs.forEach { dir ->
            runGradleCommand(dir, "clean", "build", "publishToMavenLocal", "-x", "test")
        }
    }
}

tasks.register<BuildAndPublishTask>("buildAndPublishAll") {
    group = "build"
    description = "Build all projects without tests and publish to Maven local"
}