Skip to content

Commit 05f1c19

Browse files
committed
add Maven Central publishing conventions, remove GitHub branch publishing config
1 parent 7272844 commit 05f1c19

File tree

3 files changed

+194
-16
lines changed

3 files changed

+194
-16
lines changed

buildSrc/src/main/kotlin/buildsrc/conventions/github-maven-publish.gradle.kts

Lines changed: 0 additions & 16 deletions
This file was deleted.
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package buildsrc.conventions
2+
3+
import buildsrc.settings.MavenPublishingSettings
4+
5+
plugins {
6+
`maven-publish`
7+
signing
8+
}
9+
10+
val mavenPublishing =
11+
extensions.create<MavenPublishingSettings>(MavenPublishingSettings.EXTENSION_NAME, project)
12+
13+
14+
//region POM convention
15+
publishing {
16+
publications.withType<MavenPublication>().configureEach {
17+
pom {
18+
name.convention("Binary Compatibility Validator MU")
19+
description.convention("BCV-MU is a Gradle Plugin that validates the public JVM binary API of libraries, to make sure that breaking changes are tracked.")
20+
url.convention("https://github.com/adamko-dev/kotlin-binary-compatibility-validator-mu")
21+
22+
scm {
23+
connection.convention("scm:git:https://github.com/adamko-dev/kotlin-binary-compatibility-validator-mu")
24+
developerConnection.convention("scm:git:https://github.com/adamko-dev/kotlin-binary-compatibility-validator-mu")
25+
url.convention("https://github.com/adamko-dev/kotlin-binary-compatibility-validator-mu")
26+
}
27+
28+
licenses {
29+
license {
30+
name.convention("Apache-2.0")
31+
url.convention("https://www.apache.org/licenses/LICENSE-2.0.txt")
32+
}
33+
}
34+
35+
developers {
36+
developer {
37+
email.set("adam@adamko.dev")
38+
}
39+
}
40+
}
41+
}
42+
}
43+
//endregion
44+
45+
46+
//region Maven Central publishing/signing
47+
publishing {
48+
repositories {
49+
val mavenCentralUsername = mavenPublishing.mavenCentralUsername.orNull
50+
val mavenCentralPassword = mavenPublishing.mavenCentralPassword.orNull
51+
if (!mavenCentralUsername.isNullOrBlank() && !mavenCentralPassword.isNullOrBlank()) {
52+
maven(mavenPublishing.sonatypeReleaseUrl) {
53+
name = "SonatypeRelease"
54+
credentials {
55+
username = mavenCentralUsername
56+
password = mavenCentralPassword
57+
}
58+
}
59+
}
60+
}
61+
62+
// com.gradle.plugin-publish automatically adds a Javadoc jar
63+
}
64+
65+
signing {
66+
logger.info("maven-publishing.gradle.kts enabled signing for ${project.path}")
67+
68+
val keyId = mavenPublishing.signingKeyId.orNull
69+
val key = mavenPublishing.signingKey.orNull
70+
val password = mavenPublishing.signingPassword.orNull
71+
72+
if (!keyId.isNullOrBlank() && !key.isNullOrBlank() && !password.isNullOrBlank()) {
73+
useInMemoryPgpKeys(keyId, key, password)
74+
}
75+
76+
setRequired({
77+
gradle.taskGraph.allTasks.filterIsInstance<PublishToMavenRepository>().any {
78+
it.repository.name == "SonatypeRelease"
79+
}
80+
})
81+
}
82+
83+
//afterEvaluate {
84+
// com.gradle.plugin-publish automatically signs tasks in a weird way, that stops this from working:
85+
// signing {
86+
// sign(publishing.publications)
87+
// }
88+
//}
89+
//endregion
90+
91+
92+
//region Fix Gradle warning about signing tasks using publishing task outputs without explicit dependencies
93+
// https://youtrack.jetbrains.com/issue/KT-46466 https://github.com/gradle/gradle/issues/26091
94+
tasks.withType<AbstractPublishToMaven>().configureEach {
95+
val signingTasks = tasks.withType<Sign>()
96+
mustRunAfter(signingTasks)
97+
}
98+
//endregion
99+
100+
101+
//region publishing logging
102+
tasks.withType<AbstractPublishToMaven>().configureEach {
103+
val publicationGAV = provider { publication?.run { "$group:$artifactId:$version" } }
104+
doLast("log publication GAV") {
105+
if (publicationGAV.isPresent) {
106+
logger.info("[task: ${path}] ${publicationGAV.get()}")
107+
}
108+
}
109+
}
110+
//endregion
111+
112+
113+
//region IJ workarounds
114+
// manually define the Kotlin DSL accessors because IntelliJ _still_ doesn't load them properly
115+
fun Project.publishing(configure: PublishingExtension.() -> Unit): Unit =
116+
extensions.configure(configure)
117+
118+
val Project.publishing: PublishingExtension
119+
get() = extensions.getByType()
120+
121+
fun Project.signing(configure: SigningExtension.() -> Unit): Unit =
122+
extensions.configure(configure)
123+
124+
val Project.signing: SigningExtension
125+
get() = extensions.getByType()
126+
//endregion
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package buildsrc.settings
2+
3+
import java.io.File
4+
import javax.inject.Inject
5+
import org.gradle.api.Project
6+
import org.gradle.api.provider.Provider
7+
import org.gradle.api.provider.ProviderFactory
8+
import org.gradle.kotlin.dsl.*
9+
10+
11+
/**
12+
* Settings for the [buildsrc.conventions.Maven_publish_test_gradle] convention plugin.
13+
*/
14+
abstract class MavenPublishingSettings @Inject constructor(
15+
private val project: Project,
16+
private val providers: ProviderFactory,
17+
) {
18+
19+
private val isReleaseVersion: Provider<Boolean> =
20+
providers.provider { !project.version.toString().endsWith("-SNAPSHOT") }
21+
22+
val sonatypeReleaseUrl: Provider<String> =
23+
isReleaseVersion.map { isRelease ->
24+
if (isRelease) {
25+
"https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/"
26+
} else {
27+
"https://s01.oss.sonatype.org/content/repositories/snapshots/"
28+
}
29+
}
30+
31+
val mavenCentralUsername: Provider<String> =
32+
bcvProp("mavenCentralUsername")
33+
.orElse(providers.environmentVariable("MAVEN_SONATYPE_USERNAME"))
34+
val mavenCentralPassword: Provider<String> =
35+
bcvProp("mavenCentralPassword")
36+
.orElse(providers.environmentVariable("MAVEN_SONATYPE_PASSWORD"))
37+
38+
val signingKeyId: Provider<String> =
39+
bcvProp("signing.keyId")
40+
.orElse(providers.environmentVariable("MAVEN_SONATYPE_SIGNING_KEY_ID"))
41+
val signingKey: Provider<String> =
42+
bcvProp("signing.key")
43+
.orElse(providers.environmentVariable("MAVEN_SONATYPE_SIGNING_KEY"))
44+
val signingPassword: Provider<String> =
45+
bcvProp("signing.password")
46+
.orElse(providers.environmentVariable("MAVEN_SONATYPE_SIGNING_PASSWORD"))
47+
48+
val githubPublishDir: Provider<File> =
49+
providers.environmentVariable("GITHUB_PUBLISH_DIR").map { File(it) }
50+
51+
private fun bcvProp(name: String): Provider<String> =
52+
providers.gradleProperty("dev.adamko.bcv-mu.$name")
53+
54+
private fun <T : Any> bcvProp(name: String, convert: (String) -> T): Provider<T> =
55+
bcvProp(name).map(convert)
56+
57+
companion object {
58+
const val EXTENSION_NAME = "mavenPublishing"
59+
60+
/** Retrieve the [KayrayBuildProperties] extension. */
61+
internal val Project.mavenPublishing: MavenPublishingSettings
62+
get() = extensions.getByType()
63+
64+
/** Configure the [KayrayBuildProperties] extension. */
65+
internal fun Project.mavenPublishing(configure: MavenPublishingSettings.() -> Unit) =
66+
extensions.configure(configure)
67+
}
68+
}

0 commit comments

Comments
 (0)