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"
}