From 1879df780ba9d6392a01e06a5894fc3ebfc2e549 Mon Sep 17 00:00:00 2001 From: Kenneth Endfinger Date: Mon, 21 Feb 2022 18:09:52 -0500 Subject: [PATCH] Refactor Manifest Generation into Gradle Plugin --- build.gradle.kts | 57 ++----------------- .../foundation/gradle/FoundationGlobals.kt | 7 +++ .../gradle/FoundationGradlePlugin.kt | 3 + .../gradle/FoundationProjectPlugin.kt | 16 ++++++ .../foundation/gradle/PaperVersionClient.kt | 6 +- .../foundation/gradle/UpdateManifestTask.kt | 32 +++++++++++ .../kubelet/foundation/gradle/extensions.kt | 17 ++++++ 7 files changed, 85 insertions(+), 53 deletions(-) create mode 100644 buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationGlobals.kt create mode 100644 buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationProjectPlugin.kt create mode 100644 buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/UpdateManifestTask.kt create mode 100644 buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/extensions.kt diff --git a/build.gradle.kts b/build.gradle.kts index 89a67d4..771e523 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,24 +1,18 @@ +import cloud.kubelet.foundation.gradle.FoundationProjectPlugin +import cloud.kubelet.foundation.gradle.isFoundationPlugin import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import org.jetbrains.kotlin.com.google.gson.Gson import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import java.io.FileWriter plugins { java id("cloud.kubelet.foundation.gradle") } -fun Project.isFoundationPlugin() = name.startsWith("foundation-") -fun Project.isFoundationTool() = !isFoundationPlugin() - -// Disable the JAR task for the root project. -tasks["jar"].enabled = false - allprojects { repositories { mavenCentral() maven { - name = "papermc-repo" + name = "papermc" url = uri("https://papermc.io/repo/repository/maven-public/") } @@ -29,59 +23,20 @@ allprojects { } } -val manifestsDir = buildDir.resolve("manifests") -manifestsDir.mkdirs() -val gson = Gson() - -tasks.create("updateManifests") { - // TODO: not using task dependencies, outputs, blah blah blah. - doLast { - val updateFile = manifestsDir.resolve("update.json") - val writer = FileWriter(updateFile) - writer.use { - val rootPath = rootProject.rootDir.toPath() - val updateManifest = subprojects.mapNotNull { project -> - if (project.isFoundationTool()) { - return@mapNotNull null - } - val files = project.tasks.getByName("shadowJar").outputs - val paths = files.files.map { rootPath.relativize(it.toPath()).toString() } - - if (paths.isNotEmpty()) project.name to mapOf( - "version" to project.version, - "artifacts" to paths, - ) - else null - }.toMap() - - gson.toJson( - updateManifest, - writer - ) - } - } -} - tasks.assemble { dependsOn("updateManifests") } +version = "0.2" + subprojects { plugins.apply("org.jetbrains.kotlin.jvm") plugins.apply("org.jetbrains.kotlin.plugin.serialization") plugins.apply("com.github.johnrengelman.shadow") + plugins.apply(FoundationProjectPlugin::class) - version = "0.2" group = "io.gorence" - // Add build number if running under CI. - val versionWithBuild = if (System.getenv("CI_PIPELINE_IID") != null) { - version as String + ".${System.getenv("CI_PIPELINE_IID")}" - } else { - "DEV" - } - version = versionWithBuild - dependencies { // Kotlin dependencies implementation(platform("org.jetbrains.kotlin:kotlin-bom")) diff --git a/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationGlobals.kt b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationGlobals.kt new file mode 100644 index 0000000..a68d68d --- /dev/null +++ b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationGlobals.kt @@ -0,0 +1,7 @@ +package cloud.kubelet.foundation.gradle + +import com.google.gson.Gson + +object FoundationGlobals { + val gson = Gson() +} diff --git a/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationGradlePlugin.kt b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationGradlePlugin.kt index 81c871c..fa75d06 100644 --- a/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationGradlePlugin.kt +++ b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationGradlePlugin.kt @@ -17,5 +17,8 @@ class FoundationGradlePlugin : Plugin { } val runPaperServer = project.tasks.create("runPaperServer") runPaperServer.dependsOn(setupPaperServer) + + val updateManifests = project.tasks.create("updateManifests") + project.tasks.getByName("assemble").dependsOn(updateManifests) } } diff --git a/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationProjectPlugin.kt b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationProjectPlugin.kt new file mode 100644 index 0000000..793c405 --- /dev/null +++ b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/FoundationProjectPlugin.kt @@ -0,0 +1,16 @@ +package cloud.kubelet.foundation.gradle + +import org.gradle.api.Plugin +import org.gradle.api.Project + +class FoundationProjectPlugin : Plugin { + override fun apply(project: Project) { + val versionWithBuild = if (System.getenv("CI_PIPELINE_IID") != null) { + project.rootProject.version.toString() + ".${System.getenv("CI_PIPELINE_IID")}" + } else { + "DEV" + } + + project.version = versionWithBuild + } +} diff --git a/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/PaperVersionClient.kt b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/PaperVersionClient.kt index deb9c2f..3461ecc 100644 --- a/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/PaperVersionClient.kt +++ b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/PaperVersionClient.kt @@ -6,9 +6,11 @@ import java.net.http.HttpClient import java.net.http.HttpRequest import java.net.http.HttpResponse -class PaperVersionClient(val client: HttpClient = HttpClient.newHttpClient()) { +class PaperVersionClient( + val client: HttpClient = HttpClient.newHttpClient(), + private val gson: Gson = FoundationGlobals.gson +) { private val apiBaseUrl = URI.create("https://papermc.io/api/v2/") - private val gson = Gson() fun getVersionBuilds(group: String): List { val response = client.send( diff --git a/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/UpdateManifestTask.kt b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/UpdateManifestTask.kt new file mode 100644 index 0000000..012332d --- /dev/null +++ b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/UpdateManifestTask.kt @@ -0,0 +1,32 @@ +package cloud.kubelet.foundation.gradle + +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.TaskAction +import java.nio.file.Files +import java.nio.file.Path + +open class UpdateManifestTask : DefaultTask() { + @TaskAction + fun update() { + val manifestsDir = ensureManifestsDir() + val updateFile = manifestsDir.resolve("update.json") + val rootPath = project.rootProject.rootDir.toPath() + val updateManifest = project.findPluginProjects().mapNotNull { project -> + val paths = project.shadowJarOutputs.allFilesRelativeToPath(rootPath) + if (paths.isNotEmpty()) { + project.name to mapOf( + "version" to project.version, + "artifacts" to paths.map { it.toUnixString() } + ) + } else null + }.toMap() + + Files.writeString(updateFile, FoundationGlobals.gson.toJson(updateManifest)) + } + + private fun ensureManifestsDir(): Path { + val manifestsDir = project.buildDir.resolve("manifests") + manifestsDir.mkdirs() + return manifestsDir.toPath() + } +} diff --git a/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/extensions.kt b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/extensions.kt new file mode 100644 index 0000000..890c523 --- /dev/null +++ b/buildSrc/src/main/kotlin/cloud/kubelet/foundation/gradle/extensions.kt @@ -0,0 +1,17 @@ +package cloud.kubelet.foundation.gradle + +import org.gradle.api.Project +import org.gradle.api.tasks.TaskOutputs +import java.nio.file.FileSystems +import java.nio.file.Path + +fun Project.isFoundationPlugin() = name.startsWith("foundation-") + +fun Project.findPluginProjects() = rootProject.subprojects.filter { project -> project.isFoundationPlugin() } + +val Project.shadowJarOutputs: TaskOutputs + get() = project.tasks.getByName("shadowJar").outputs + +fun TaskOutputs.allFilesRelativeToPath(root: Path): List = files.map { root.relativize(it.toPath()) } + +fun Path.toUnixString() = toString().replace(FileSystems.getDefault().separator, "/")