Skip to content

Commit f66c20d

Browse files
authored
fix: add back configureNexus function (#109)
1 parent 5b7a1d1 commit f66c20d

File tree

4 files changed

+152
-2
lines changed

4 files changed

+152
-2
lines changed

build-plugins/build-support/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ dependencies {
2424
exclude(group = "org.jetbrains.kotlin", module = "kotlin-compiler-embeddable")
2525
}
2626

27-
implementation(libs.jReleaserPlugin)
27+
implementation(libs.nexus.publish.plugin)
28+
implementation(libs.jreleaser.plugin)
2829
compileOnly(gradleApi())
2930
implementation(libs.aws.sdk.s3)
3031
implementation(libs.aws.sdk.cloudwatch)

build-plugins/build-support/src/main/kotlin/aws/sdk/kotlin/gradle/dsl/Publish.kt

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package aws.sdk.kotlin.gradle.dsl
66

77
import aws.sdk.kotlin.gradle.util.verifyRootProject
8+
import io.github.gradlenexus.publishplugin.NexusPublishExtension
89
import org.gradle.api.Project
910
import org.gradle.api.publish.PublishingExtension
1011
import org.gradle.api.publish.maven.MavenPublication
@@ -15,11 +16,19 @@ import org.gradle.plugins.signing.Sign
1516
import org.gradle.plugins.signing.SigningExtension
1617
import org.jreleaser.gradle.plugin.JReleaserExtension
1718
import org.jreleaser.model.Active
19+
import java.time.Duration
1820

1921
private object Properties {
2022
const val SKIP_PUBLISHING = "skipPublish"
2123
}
2224

25+
// TODO Remove once aws-sdk-kotlin migrates to Central Portal
26+
private const val PUBLISH_GROUP_NAME_PROP = "publishGroupName"
27+
private const val SIGNING_KEY_PROP = "signingKey"
28+
private const val SIGNING_PASSWORD_PROP = "signingPassword"
29+
private const val SONATYPE_USERNAME_PROP = "sonatypeUsername"
30+
private const val SONATYPE_PASSWORD_PROP = "sonatypePassword"
31+
2332
private object EnvironmentVariables {
2433
const val GROUP_ID = "JRELEASER_PROJECT_JAVA_GROUP_ID"
2534
const val MAVEN_CENTRAL_USERNAME = "JRELEASER_MAVENCENTRAL_USERNAME"
@@ -55,6 +64,102 @@ fun Project.skipPublishing() {
5564
extra.set(Properties.SKIP_PUBLISHING, true)
5665
}
5766

67+
// TODO Remove this once aws-sdk-kotlin migrates to Central Portal
68+
fun Project.configureNexusPublishing(repoName: String, githubOrganization: String = "awslabs") {
69+
val project = this
70+
apply(plugin = "maven-publish")
71+
72+
// FIXME: create a real "javadoc" JAR from Dokka output
73+
val javadocJar = tasks.register<Jar>("emptyJar") {
74+
archiveClassifier.set("javadoc")
75+
destinationDirectory.set(layout.buildDirectory.dir("libs"))
76+
from()
77+
}
78+
79+
extensions.configure<PublishingExtension> {
80+
repositories {
81+
maven {
82+
name = "testLocal"
83+
url = rootProject.layout.buildDirectory.dir("m2").get().asFile.toURI()
84+
}
85+
}
86+
87+
publications.all {
88+
if (this !is MavenPublication) return@all
89+
90+
project.afterEvaluate {
91+
pom {
92+
name.set(project.name)
93+
description.set(project.description)
94+
url.set("https://github.com/$githubOrganization/$repoName")
95+
licenses {
96+
license {
97+
name.set("Apache-2.0")
98+
url.set("https://www.apache.org/licenses/LICENSE-2.0.txt")
99+
}
100+
}
101+
developers {
102+
developer {
103+
id.set(repoName)
104+
name.set("AWS SDK Kotlin Team")
105+
}
106+
}
107+
scm {
108+
connection.set("scm:git:git://github.com/$githubOrganization/$repoName.git")
109+
developerConnection.set("scm:git:ssh://github.com/$githubOrganization/$repoName.git")
110+
url.set("https://github.com/$githubOrganization/$repoName")
111+
}
112+
113+
artifact(javadocJar)
114+
}
115+
}
116+
}
117+
118+
if (project.hasProperty(SIGNING_KEY_PROP) && project.hasProperty(SIGNING_PASSWORD_PROP)) {
119+
apply(plugin = "signing")
120+
extensions.configure<SigningExtension> {
121+
useInMemoryPgpKeys(
122+
project.property(SIGNING_KEY_PROP) as String,
123+
project.property(SIGNING_PASSWORD_PROP) as String,
124+
)
125+
sign(publications)
126+
}
127+
128+
// FIXME - workaround for https://github.com/gradle/gradle/issues/26091
129+
val signingTasks = tasks.withType<Sign>()
130+
tasks.withType<AbstractPublishToMaven>().configureEach {
131+
mustRunAfter(signingTasks)
132+
}
133+
}
134+
}
135+
136+
fun isAvailableForNexusPublication(project: Project, publication: MavenPublication): Boolean {
137+
var shouldPublish = true
138+
139+
// Check SKIP_PUBLISH_PROP
140+
if (project.extra.has(Properties.SKIP_PUBLISHING)) shouldPublish = false
141+
142+
// Only publish publications with the configured group from JReleaser or everything if JReleaser group is not configured
143+
val publishGroupName = project.findProperty(PUBLISH_GROUP_NAME_PROP) as? String
144+
shouldPublish = shouldPublish && (publishGroupName == null || publication.groupId.startsWith(publishGroupName))
145+
146+
// Validate publication name is allowed to be published
147+
shouldPublish = shouldPublish && ALLOWED_PUBLICATION_NAMES.any { publication.name.equals(it, ignoreCase = true) }
148+
149+
return shouldPublish
150+
}
151+
152+
tasks.withType<AbstractPublishToMaven>().configureEach {
153+
onlyIf {
154+
isAvailableForNexusPublication(project, publication).also {
155+
if (!it) {
156+
logger.warn("Skipping publication, project=${project.name}; publication=${publication.name}; group=${publication.groupId}")
157+
}
158+
}
159+
}
160+
}
161+
}
162+
58163
/**
59164
* Configure publishing for this project. This applies the `maven-publish` and `signing` plugins and configures
60165
* the publications.
@@ -143,6 +248,43 @@ fun Project.configurePublishing(repoName: String, githubOrganization: String = "
143248
}
144249
}
145250

251+
/**
252+
* Configure nexus publishing plugin. This (conditionally) enables the `gradle-nexus.publish-plugin` and configures it.
253+
*/
254+
fun Project.configureNexus(
255+
nexusUrl: String = "https://ossrh-staging-api.central.sonatype.com/service/local/",
256+
snapshotRepositoryUrl: String = "https://central.sonatype.com/repository/maven-snapshots/",
257+
) {
258+
verifyRootProject { "Kotlin SDK nexus configuration must be applied to the root project only" }
259+
260+
val requiredProps = listOf(SONATYPE_USERNAME_PROP, SONATYPE_PASSWORD_PROP, PUBLISH_GROUP_NAME_PROP)
261+
val doConfigure = requiredProps.all { project.hasProperty(it) }
262+
if (!doConfigure) {
263+
logger.info("skipping nexus configuration, missing one or more required properties: $requiredProps")
264+
return
265+
}
266+
267+
apply(plugin = "io.github.gradle-nexus.publish-plugin")
268+
extensions.configure<NexusPublishExtension> {
269+
val publishGroupName = project.property(PUBLISH_GROUP_NAME_PROP) as String
270+
group = publishGroupName
271+
packageGroup.set(publishGroupName)
272+
repositories {
273+
create("awsNexus") {
274+
this.nexusUrl.set(uri(nexusUrl))
275+
this.snapshotRepositoryUrl.set(uri(snapshotRepositoryUrl))
276+
username.set(project.property(SONATYPE_USERNAME_PROP) as String)
277+
password.set(project.property(SONATYPE_PASSWORD_PROP) as String)
278+
}
279+
}
280+
281+
transitionCheckOptions {
282+
maxRetries.set(180)
283+
delayBetween.set(Duration.ofSeconds(10))
284+
}
285+
}
286+
}
287+
146288
/**
147289
* Configure JReleaser publishing plugin. This (conditionally) enables the `org.jreleaser` plugin and configures it.
148290
*/

build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ if (releaseVersion == null) logger.warn("no release version set")
1313
val s3Url = propertyOrEnv("release.s3.url", "RELEASE_S3_URL")
1414
if (s3Url == null) logger.warn("S3 repository not configured, missing S3 url")
1515

16+
allprojects {
17+
// Enables running `./gradlew allDeps` to get a comprehensive list of dependencies for every subproject
18+
tasks.register<DependencyReportTask>("allDeps") { }
19+
}
20+
1621
subprojects {
1722
group = "aws.sdk.kotlin.gradle"
1823
version = releaseVersion ?: "0.0.1"

gradle/libs.versions.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
aws-sdk-version = "1.4.116"
33
kotlin-version = "2.2.0"
44
ktlint = "1.3.0"
5+
nexus-plugin-version = "2.0.0"
56
jreleaser-plugin-version = "1.18.0"
67
publish-plugin-version = "1.3.1"
78
smithy-version = "1.60.2"
@@ -14,7 +15,8 @@ aws-sdk-s3 = { module = "aws.sdk.kotlin:s3", version.ref = "aws-sdk-version" }
1415
ktlint-cli = { module = "com.pinterest.ktlint:ktlint-cli", version.ref = "ktlint" }
1516
ktlint-cli-ruleset-core = { module = "com.pinterest.ktlint:ktlint-cli-ruleset-core", version.ref = "ktlint" }
1617
ktlint-test = {module = "com.pinterest.ktlint:ktlint-test", version.ref = "ktlint" }
17-
jReleaserPlugin = { module = "org.jreleaser:jreleaser-gradle-plugin", version.ref = "jreleaser-plugin-version" }
18+
nexus-publish-plugin = { module = "io.github.gradle-nexus:publish-plugin", version.ref = "nexus-plugin-version" }
19+
jreleaser-plugin = { module = "org.jreleaser:jreleaser-gradle-plugin", version.ref = "jreleaser-plugin-version" }
1820
smithy-model = { module = "software.amazon.smithy:smithy-model", version.ref = "smithy-version" }
1921
smithy-gradle-base-plugin = { module = "software.amazon.smithy.gradle:smithy-base", version.ref = "smithy-gradle-plugin-version" }
2022

0 commit comments

Comments
 (0)