Skip to content

Commit

Permalink
Nexus publish test
Browse files Browse the repository at this point in the history
  • Loading branch information
turchenkoalex committed Jan 14, 2025
1 parent dcb3bef commit a8bed6a
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 56 deletions.
12 changes: 5 additions & 7 deletions .github/workflows/verify.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,11 @@ jobs:
if: success()
env:
GITHUB_HEAD_REF: ${{ github.head_ref }}
JRELEASER_DEPLOY_MAVEN_MAVENCENTRAL_SONATYPE_USERNAME: ${{ secrets.JRELEASER_DEPLOY_MAVEN_MAVENCENTRAL_SONATYPE_USERNAME }}
JRELEASER_DEPLOY_MAVEN_MAVENCENTRAL_SONATYPE_PASSWORD: ${{ secrets.JRELEASER_DEPLOY_MAVEN_MAVENCENTRAL_SONATYPE_PASSWORD }}
JRELEASER_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
JRELEASER_GPG_PASSPHRASE: ${{ secrets.JRELEASER_GPG_PASSPHRASE }}
JRELEASER_GPG_PUBLIC_KEY: ${{ secrets.JRELEASER_GPG_PUBLIC_KEY }}
JRELEASER_GPG_SECRET_KEY: ${{ secrets.JRELEASER_GPG_SECRET_KEY }}
run: ./gradlew fullRelease
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }}
GPG_SIGNING_PASSWORD: ${{ secrets.GPG_SIGNING_PASSWORD }}
SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
run: ./gradlew devSnapshot printDevSnapshotReleaseNote
detekt:
name: Detekt
runs-on: ubuntu-latest
Expand Down
178 changes: 129 additions & 49 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import io.gitlab.arturbosch.detekt.Detekt
import io.gitlab.arturbosch.detekt.report.ReportMergeTask
import org.jreleaser.gradle.plugin.tasks.JReleaserFullReleaseTask
import org.jreleaser.model.Active
import org.jreleaser.model.Signing

group = "io.github.turchenkoalex"

Expand All @@ -14,8 +11,8 @@ plugins {
alias(libs.plugins.kotlinx.serialization) apply false
alias(libs.plugins.detekt)
alias(libs.plugins.kover)
alias(libs.plugins.jreleaser)
alias(libs.plugins.nebula.release)
alias(libs.plugins.nexus.publish)
}

allprojects {
Expand Down Expand Up @@ -91,14 +88,26 @@ val publishProjects = setOf(
"cors",
)

val fullRelease = tasks.register("fullRelease")
val settingsProvider = SettingsProvider()

tasks.withType<Sign> {
doFirst {
settingsProvider.validateGPGSecrets()
}
dependsOn(tasks.getByName("build"))
}

tasks.withType<PublishToMavenRepository> {
doFirst {
settingsProvider.validateSonatypeCredentials()
}
}

subprojects {
if (this.name in publishProjects) {
apply(plugin = "java-library")
apply(plugin = "maven-publish")
apply(plugin = "signing")
apply(plugin = "org.jreleaser")
version = sanitizeVersion()

java {
Expand All @@ -113,6 +122,7 @@ subprojects {

groupId = "io.github.turchenkoalex"
artifactId = "kotlet-${project.name}"
version = sanitizeVersion()

versionMapping {
usage("java-api") {
Expand Down Expand Up @@ -155,54 +165,47 @@ subprojects {
}
}

jreleaser {
gitRootSearch = true

release {
github {
enabled = false
}
}

signing {
active = Active.ALWAYS
armored = true
mode = Signing.Mode.MEMORY
}

deploy {
maven {
mavenCentral {
create("sonatype") {
active = Active.ALWAYS
url = "https://central.sonatype.com/api/v1/publisher"
javadocJar = true
sourceJar = true
stagingRepository(layout.buildDirectory.dir("staging-deploy").get().asFile.absolutePath)
}
}
}
}
}

val jreleaserDirTask = tasks.register("jreleaserDir") {
doFirst {
mkdir(layout.buildDirectory.dir("jreleaser").get().asFile)
}
signing {
useInMemoryPgpKeys(settingsProvider.gpgSigningKey, settingsProvider.gpgSigningPassword)
sign(publishing.publications["mavenJava"])
}
}
}

val jreleaserTask = tasks.withType<JReleaserFullReleaseTask> {
dependsOn(jreleaserDirTask)
}
tasks.register("printFinalReleaseNote") {
doLast {
printFinalReleaseNote(
groupId = "io.github.turchenkoalex",
artifactId = "kotlet",
sanitizedVersion = project.sanitizeVersion()
)
}
dependsOn(tasks.getByName("final"))
}

fullRelease {
dependsOn(jreleaserTask)
}
tasks.register("printDevSnapshotReleaseNote") {
doLast {
printDevSnapshotReleaseNote(
groupId = "io.github.turchenkoalex",
artifactId = "kotlet",
sanitizedVersion = project.sanitizeVersion()
)
}
dependsOn(tasks.getByName("devSnapshot"))
}

tasks.release {
finalizedBy(fullRelease)

nexusPublishing {
repositories {
sonatype {
useStaging.set(!project.isSnapshotVersion())
packageGroup.set("io.github.turchenkoalex")
username.set(settingsProvider.sonatypeUsername)
password.set(settingsProvider.sonatypePassword)
nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/"))
snapshotRepositoryUrl.set(uri("https://s01.oss.sonatype.org/content/repositories/snapshots/"))
}
}
}

// We want to change SNAPSHOT versions format from:
Expand All @@ -213,7 +216,7 @@ tasks.release {
fun Project.sanitizeVersion(): String {
val version = version.toString()
return if (project.isSnapshotVersion()) {
val githubHeadRef = System.getenv("GITHUB_HEAD_REF")
val githubHeadRef = settingsProvider.githubHeadRef
if (githubHeadRef != null) {
// github pull request
version
Expand All @@ -230,3 +233,80 @@ fun Project.sanitizeVersion(): String {
}

fun Project.isSnapshotVersion() = version.toString().contains("-dev.")

fun printFinalReleaseNote(groupId: String, artifactId: String, sanitizedVersion: String) {
println()
println("========================================================")
println()
println("New RELEASE artifact version were published:")
println(" groupId: $groupId")
println(" artifactId: $artifactId")
println(" version: $sanitizedVersion")
println()
println("Discover on Maven Central:")
println(" https://repo1.maven.org/maven2/${groupId.replace('.', '/')}/$artifactId/")
println()
println("Edit or delete artifacts on OSS Nexus Repository Manager:")
println(" https://oss.sonatype.org/#nexus-search;gav~$groupId~~~~")
println()
println("Control staging repositories on OSS Nexus Repository Manager:")
println(" https://oss.sonatype.org/#stagingRepositories")
println()
println("========================================================")
println()
}

fun printDevSnapshotReleaseNote(groupId: String, artifactId: String, sanitizedVersion: String) {
println()
println("========================================================")
println()
println("New developer SNAPSHOT artifact version were published:")
println(" groupId: $groupId")
println(" artifactId: $artifactId")
println(" version: $sanitizedVersion")
println()
println("Discover on Maven Central:")
println(" https://s01.oss.sonatype.org/content/repositories/snapshots/${groupId.replace('.', '/')}/$artifactId/")
println()
println("Edit or delete artifacts on OSS Nexus Repository Manager:")
println(" https://s01.oss.sonatype.org/#nexus-search;gav~$groupId~~~~")
println()
println("========================================================")
println()
}

class SettingsProvider {

val gpgSigningKey: String?
get() = System.getenv(GPG_SIGNING_KEY_PROPERTY)

val gpgSigningPassword: String?
get() = System.getenv(GPG_SIGNING_PASSWORD_PROPERTY)

val sonatypeUsername: String?
get() = System.getenv(SONATYPE_USERNAME_PROPERTY)

val sonatypePassword: String?
get() = System.getenv(SONATYPE_PASSWORD_PROPERTY)

val githubHeadRef: String?
get() = System.getenv(GITHUB_HEAD_REF_PROPERTY)

fun validateGPGSecrets() = require(
value = !gpgSigningKey.isNullOrBlank() && !gpgSigningPassword.isNullOrBlank(),
lazyMessage = { "Both $GPG_SIGNING_KEY_PROPERTY and $GPG_SIGNING_PASSWORD_PROPERTY environment variables must not be empty" }
)

fun validateSonatypeCredentials() = require(
value = !sonatypeUsername.isNullOrBlank() && !sonatypePassword.isNullOrBlank(),
lazyMessage = { "Both $SONATYPE_USERNAME_PROPERTY and $SONATYPE_PASSWORD_PROPERTY environment variables must not be empty" }
)

private companion object {
private const val GPG_SIGNING_KEY_PROPERTY = "GPG_SIGNING_KEY"
private const val GPG_SIGNING_PASSWORD_PROPERTY = "GPG_SIGNING_PASSWORD"
private const val SONATYPE_USERNAME_PROPERTY = "SONATYPE_USERNAME"
private const val SONATYPE_PASSWORD_PROPERTY = "SONATYPE_PASSWORD"
private const val GITHUB_HEAD_REF_PROPERTY = "GITHUB_HEAD_REF"
}
}
2 changes: 2 additions & 0 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ kotlinx-serialization = "1.8.0"
kover = "0.9.1"
mockk = "1.13.16"
nebula = "19.0.10"
nexus = "1.3.0"
opentelemetry = "1.46.0"
opentelemetry-instrumentation-api = "2.11.0"
opentelemetry-semconv = "1.29.0-alpha"
Expand All @@ -23,6 +24,7 @@ kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
kover = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" }
nebula-release = { id = "com.netflix.nebula.release", version.ref = "nebula" }
nexus-publish = { id = "io.github.gradle-nexus.publish-plugin", version.ref = "nexus" }

[libraries]

Expand Down

0 comments on commit a8bed6a

Please sign in to comment.