Skip to content

Commit a0df7f5

Browse files
committed
Update allowed publication logic, add tests
1 parent 9ecdc35 commit a0df7f5

File tree

4 files changed

+131
-13
lines changed

4 files changed

+131
-13
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ dependencies {
2929
compileOnly(gradleApi())
3030
implementation(libs.aws.sdk.s3)
3131
implementation(libs.aws.sdk.cloudwatch)
32-
testImplementation(libs.junit.jupiter)
32+
testImplementation(kotlin("test"))
33+
testImplementation(libs.kotlinx.coroutines.test)
3334
}
3435

3536
gradlePlugin {

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

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,10 @@ private object EnvironmentVariables {
3838
const val GPG_SECRET_KEY = "JRELEASER_GPG_SECRET_KEY"
3939
}
4040

41-
private val ALLOWED_PUBLICATION_NAMES = setOf(
41+
internal val ALLOWED_PUBLICATION_NAMES = setOf(
4242
"common",
4343
"jvm",
4444
"kotlinMultiplatform",
45-
"iosArm64",
46-
"iosX64",
47-
"linuxArm64",
48-
"linuxX64",
49-
"macosArm64",
50-
"macosX64",
51-
"mingwX64",
52-
5345
"metadata",
5446
"bom",
5547
"versionCatalog",
@@ -64,6 +56,22 @@ private val ALLOWED_PUBLICATION_NAMES = setOf(
6456
"dynamodb-mapper-schema-generatorPluginMarkerMaven",
6557
)
6658

59+
internal val KOTLIN_NATIVE_PUBLICATION_NAMES = setOf(
60+
"iosArm64",
61+
"iosX64",
62+
"linuxArm64",
63+
"linuxX64",
64+
"macosArm64",
65+
"macosX64",
66+
"mingwX64",
67+
)
68+
69+
// TODO Refactor to support project names _or_ publication group names.
70+
// aws-crt-kotlin is not published with a group name, so we need to check project names instead.
71+
private val KOTLIN_NATIVE_PROJECT_NAMES = setOf(
72+
"aws-crt-kotlin",
73+
)
74+
6775
/**
6876
* Mark this project as excluded from publishing
6977
*/
@@ -367,7 +375,7 @@ fun Project.configureJReleaser() {
367375
}
368376
}
369377

370-
private fun isAvailableForPublication(project: Project, publication: MavenPublication): Boolean {
378+
internal fun isAvailableForPublication(project: Project, publication: MavenPublication): Boolean {
371379
var shouldPublish = true
372380

373381
// Check SKIP_PUBLISH_PROP
@@ -378,7 +386,10 @@ private fun isAvailableForPublication(project: Project, publication: MavenPublic
378386
shouldPublish = shouldPublish && (publishGroupName == null || publication.groupId.startsWith(publishGroupName))
379387

380388
// Validate publication name is allowed to be published
381-
shouldPublish = shouldPublish && ALLOWED_PUBLICATION_NAMES.any { publication.name.equals(it, ignoreCase = true) }
389+
shouldPublish = shouldPublish && (
390+
ALLOWED_PUBLICATION_NAMES.any { publication.name.equals(it, ignoreCase = true) } || // standard publication
391+
(KOTLIN_NATIVE_PUBLICATION_NAMES.any { publication.name.equals(it, ignoreCase = true) } && KOTLIN_NATIVE_PROJECT_NAMES.any { project.name.equals(it, ignoreCase = true) }) // Kotlin/Native publication
392+
)
382393

383394
return shouldPublish
384395
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package aws.sdk.kotlin.gradle.dsl
6+
7+
import kotlin.test.Test
8+
import kotlinx.coroutines.test.runTest
9+
import org.gradle.api.publish.PublishingExtension
10+
import org.gradle.api.publish.maven.MavenPublication
11+
import org.gradle.testfixtures.ProjectBuilder
12+
import kotlin.test.assertFalse
13+
import kotlin.test.assertTrue
14+
15+
class PublishTest {
16+
@Test
17+
fun `aws-crt-kotlin can publish Kotlin Native artifacts`() = runTest {
18+
val project = ProjectBuilder.builder().withName("aws-crt-kotlin").build()
19+
project.group = "aws.sdk.kotlin.crt"
20+
project.version = "1.2.3"
21+
22+
project.configurePublishing("aws-crt-kotlin")
23+
24+
val publishing = project.extensions.getByType(PublishingExtension::class.java)
25+
publishing.publications {
26+
ALLOWED_PUBLICATION_NAMES.forEach {
27+
val jvmRuntimePublication = create(it, MavenPublication::class.java).apply {
28+
groupId = "aws.sdk.kotlin.crt"
29+
version = "1.2.3"
30+
artifactId = "aws-crt-kotlin"
31+
}
32+
assertTrue(isAvailableForPublication(project, jvmRuntimePublication))
33+
}
34+
35+
KOTLIN_NATIVE_PUBLICATION_NAMES.forEach {
36+
val nativeRuntimePublication = create(it, MavenPublication::class.java).apply {
37+
groupId = "aws.sdk.kotlin.crt"
38+
version = "1.2.3"
39+
artifactId = "aws-crt-kotlin"
40+
}
41+
assertTrue(isAvailableForPublication(project, nativeRuntimePublication))
42+
}
43+
}
44+
}
45+
46+
@Test
47+
fun `aws-sdk-kotlin cannot publish Kotlin Native artifacts`() = runTest {
48+
val project = ProjectBuilder.builder().withName("aws-sdk-kotlin").build()
49+
project.group = "aws.sdk.kotlin"
50+
project.version = "1.2.3"
51+
52+
project.configurePublishing("aws-sdk-kotlin")
53+
54+
val publishing = project.extensions.getByType(PublishingExtension::class.java)
55+
publishing.publications {
56+
ALLOWED_PUBLICATION_NAMES.forEach {
57+
val jvmRuntimePublication = create(it, MavenPublication::class.java).apply {
58+
groupId = "aws.sdk.kotlin"
59+
version = "1.2.3"
60+
artifactId = "aws-runtime"
61+
}
62+
assertTrue(isAvailableForPublication(project, jvmRuntimePublication))
63+
}
64+
65+
KOTLIN_NATIVE_PUBLICATION_NAMES.forEach {
66+
val nativeRuntimePublication = create(it, MavenPublication::class.java).apply {
67+
groupId = "aws.sdk.kotlin"
68+
version = "1.2.3"
69+
artifactId = "aws-runtime"
70+
}
71+
assertFalse(isAvailableForPublication(project, nativeRuntimePublication))
72+
}
73+
}
74+
}
75+
76+
@Test
77+
fun `smithy-kotlin cannot publish Kotlin Native artifacts`() = runTest {
78+
val project = ProjectBuilder.builder().withName("aws-smithy-kotlin").build()
79+
project.group = "aws.smithy.kotlin"
80+
project.version = "1.2.3"
81+
82+
project.configurePublishing("smithy-kotlin", "smithy-lang")
83+
84+
val publishing = project.extensions.getByType(PublishingExtension::class.java)
85+
publishing.publications {
86+
ALLOWED_PUBLICATION_NAMES.forEach {
87+
val jvmRuntimePublication = create(it, MavenPublication::class.java).apply {
88+
groupId = "aws.smithy.kotlin"
89+
version = "1.2.3"
90+
artifactId = "runtime"
91+
}
92+
assertTrue(isAvailableForPublication(project, jvmRuntimePublication))
93+
}
94+
95+
KOTLIN_NATIVE_PUBLICATION_NAMES.forEach {
96+
val nativeRuntimePublication = create(it, MavenPublication::class.java).apply {
97+
groupId = "aws.smithy.kotlin"
98+
version = "1.2.3"
99+
artifactId = "runtime"
100+
}
101+
assertFalse(isAvailableForPublication(project, nativeRuntimePublication))
102+
}
103+
}
104+
}
105+
}

gradle/libs.versions.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ publish-plugin-version = "1.3.1"
88
smithy-version = "1.60.2"
99
smithy-gradle-plugin-version = "1.3.0"
1010
junit-version = "5.10.1"
11+
coroutines-version = "1.10.2"
1112

1213
[libraries]
1314
aws-sdk-cloudwatch = { module = "aws.sdk.kotlin:cloudwatch", version.ref = "aws-sdk-version" }
@@ -19,8 +20,8 @@ nexus-publish-plugin = { module = "io.github.gradle-nexus:publish-plugin", versi
1920
jreleaser-plugin = { module = "org.jreleaser:jreleaser-gradle-plugin", version.ref = "jreleaser-plugin-version" }
2021
smithy-model = { module = "software.amazon.smithy:smithy-model", version.ref = "smithy-version" }
2122
smithy-gradle-base-plugin = { module = "software.amazon.smithy.gradle:smithy-base", version.ref = "smithy-gradle-plugin-version" }
22-
2323
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit-version" }
24+
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines-version" }
2425

2526
[plugins]
2627
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin-version" }

0 commit comments

Comments
 (0)