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