From a50521063e41719a9817ba7fbf1219d2f9dbaf52 Mon Sep 17 00:00:00 2001
From: KitsuneAlex <alexh@karmakrafts.dev>
Date: Sat, 29 Mar 2025 18:06:42 +0100
Subject: [PATCH] Use Nexus Gradle plugin for Maven Central publishing

---
 build.gradle.kts                              | 16 ++++++-
 gradle/libs.versions.toml                     |  4 +-
 .../dev/karmakrafts/conventions/Publishing.kt | 48 -------------------
 .../dev/karmakrafts/conventions/Signing.kt    | 11 +++--
 4 files changed, 25 insertions(+), 54 deletions(-)

diff --git a/build.gradle.kts b/build.gradle.kts
index 500156e..09e17c4 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -27,6 +27,7 @@ plugins {
     `maven-publish`
     signing
     alias(libs.plugins.kotlinx.serialization)
+    alias(libs.plugins.gradleNexus)
 }
 
 group = "dev.karmakrafts.conventions"
@@ -91,6 +92,19 @@ System.getenv("CI_PROJECT_ID")?.let {
     }
 }
 
+nexusPublishing {
+    repositories {
+        System.getenv("OSSRH_USERNAME")?.let { userName ->
+            sonatype {
+                nexusUrl = URI.create("https://s01.oss.sonatype.org/service/local")
+                snapshotRepositoryUrl = URI.create("https://s01.oss.sonatype.org/content/repositories/snapshots")
+                username = userName
+                password = System.getenv("OSSRH_PASSWORD")
+            }
+        }
+    }
+}
+
 publishing {
     repositories {
         System.getenv("CI_API_V4_URL")?.let { apiUrl ->
@@ -110,7 +124,7 @@ publishing {
     publications.withType<MavenPublication>().configureEach {
         pom {
             name = project.name
-            description = "Karma Krafts conventions and utilities plugin for Gradle."
+            description = "Karma Krafts conventions and utilities plugin for Gradle"
             url = System.getenv("CI_PROJECT_URL")
             licenses {
                 license {
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index c07b564..80f2a77 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -5,6 +5,7 @@ kotlinxSerialization = "1.8.0" # https://github.com/Kotlin/kotlinx.serialization
 kotlin = "2.1.10" # https://github.com/JetBrains/kotlin/releases
 kotlinxKover = "0.9.1" # https://github.com/Kotlin/kotlinx-kover/releases
 androidGradle = "8.7.3" # https://developer.android.com/reference/tools/gradle-api
+gradleNexus = "2.0.0" # https://github.com/gradle-nexus/publish-plugin/releases
 
 [libraries]
 kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinxSerialization" }
@@ -16,4 +17,5 @@ kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
 kotlinx-kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kotlinxKover" }
 android-library = { id = "com.android.library", version.ref = "androidGradle" }
 android-application = { id = "com.android.application", version.ref = "androidGradle" }
-kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlinxSerialization" }
\ No newline at end of file
+kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlinxSerialization" }
+gradleNexus = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "gradleNexus" }
\ No newline at end of file
diff --git a/src/main/kotlin/dev/karmakrafts/conventions/Publishing.kt b/src/main/kotlin/dev/karmakrafts/conventions/Publishing.kt
index 28ed198..9899530 100644
--- a/src/main/kotlin/dev/karmakrafts/conventions/Publishing.kt
+++ b/src/main/kotlin/dev/karmakrafts/conventions/Publishing.kt
@@ -26,54 +26,6 @@ import org.gradle.kotlin.dsl.getByType
 import org.gradle.kotlin.dsl.withType
 import java.net.URI
 
-/**
- * Adds MavenCentral as a publishing repository using
- * environment provided OSSRH_USERNAME and OSSRH_PASSWORD variables.
- */
-fun RepositoryHandler.authenticatedMavenCentral() {
-    System.getenv("OSSRH_USERNAME")?.let { userName ->
-        maven {
-            url = URI.create("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2")
-            name = "MavenCentral"
-            credentials {
-                username = userName
-                password = System.getenv("OSSRH_PASSWORD")
-            }
-        }
-    }
-}
-
-/**
- * Adds MavenCentral Snapshots as a publishing repository using
- * environment provided OSSRH_USERNAME and OSSRH_PASSWORD variables.
- */
-fun RepositoryHandler.authenticatedMavenCentralSnapshots() {
-    System.getenv("OSSRH_USERNAME")?.let { userName ->
-        maven {
-            url = URI.create("https://s01.oss.sonatype.org/content/repositories/snapshots/")
-            name = "MavenCentral"
-            credentials {
-                username = userName
-                password = System.getenv("OSSRH_PASSWORD")
-            }
-        }
-    }
-}
-
-fun Project.authenticatedMavenCentral() {
-    pluginManager.withPlugin("maven-publish") {
-        extensions.getByType<PublishingExtension>().apply {
-            repositories {
-                if (version.toString().endsWith("-SNAPSHOT")) {
-                    authenticatedMavenCentralSnapshots()
-                    return@repositories
-                }
-                authenticatedMavenCentral()
-            }
-        }
-    }
-}
-
 fun MavenPom.karmaKraftsOrganization() {
     organization {
         name.set("Karma Krafts")
diff --git a/src/main/kotlin/dev/karmakrafts/conventions/Signing.kt b/src/main/kotlin/dev/karmakrafts/conventions/Signing.kt
index 6b9a737..b00926a 100644
--- a/src/main/kotlin/dev/karmakrafts/conventions/Signing.kt
+++ b/src/main/kotlin/dev/karmakrafts/conventions/Signing.kt
@@ -19,20 +19,23 @@ package dev.karmakrafts.conventions
 import org.gradle.api.publish.PublishingExtension
 import org.gradle.kotlin.dsl.getByType
 import org.gradle.plugins.signing.SigningExtension
+import kotlin.io.encoding.Base64
+import kotlin.io.encoding.ExperimentalEncodingApi
 
 /**
  * Configures the PGP keys from given environment variables
  * SIGNING_KEY_ID, SIGNING_PRIVATE_KEY and SIGNING_PASSWORD if present.
  */
+@OptIn(ExperimentalEncodingApi::class)
 fun SigningExtension.signPublications() {
     System.getenv("SIGNING_KEY_ID")?.let { keyId ->
         useInMemoryPgpKeys( // @formatter:off
             keyId,
-            System.getenv("SIGNING_PRIVATE_KEY"),
+            System.getenv("SIGNING_PRIVATE_KEY")?.let { encodedKey ->
+                Base64.decode(encodedKey).decodeToString()
+            },
             System.getenv("SIGNING_PASSWORD")
         ) // @formatter:on
-        for (publication in project.extensions.getByType(PublishingExtension::class).publications) {
-            sign(publication)
-        }
+        sign(project.extensions.getByType<PublishingExtension>().publications)
     }
 }
\ No newline at end of file
-- 
GitLab