|
| 1 | + |
1 | 2 | package publish |
2 | 3 |
|
| 4 | +import com.vanniktech.maven.publish.MavenPublishBaseExtension |
| 5 | +import com.vanniktech.maven.publish.MavenPublishPlugin |
| 6 | +import com.vanniktech.maven.publish.SonatypeHost |
3 | 7 | import org.gradle.api.Plugin |
4 | 8 | import org.gradle.api.Project |
5 | | -import org.gradle.api.plugins.JavaPluginExtension |
6 | 9 | import org.gradle.api.publish.PublishingExtension |
7 | 10 | import org.gradle.api.publish.maven.MavenPublication |
8 | | -import org.gradle.api.tasks.SourceSetContainer |
9 | | -import org.gradle.jvm.tasks.Jar |
10 | 11 | import org.gradle.plugins.signing.Sign |
11 | | -import org.gradle.plugins.signing.SigningExtension |
12 | 12 |
|
| 13 | +@Suppress("unused") // false positive |
13 | 14 | class PublishToMavenCentralPlugin : Plugin<Project> { |
14 | 15 | override fun apply(target: Project) { |
15 | | - target.plugins.apply("maven-publish") |
16 | | - |
17 | | - val ossrhUser = target.propOrEnv("GODOT_KOTLIN_MAVEN_CENTRAL_TOKEN_USERNAME") |
18 | | - val ossrhPassword = target.propOrEnv("GODOT_KOTLIN_MAVEN_CENTRAL_TOKEN_PASSWORD") |
19 | | - val signingKey = target.propOrEnv("GODOT_KOTLIN_GPG_PRIVATE_KEY_ASCII") |
20 | | - val signingPassword = target.propOrEnv("GODOT_KOTLIN_GPG_KEY_PASSPHRASE") |
21 | | - val canSign = ossrhUser != null && ossrhPassword != null && signingKey != null && signingPassword != null |
22 | | - |
23 | | - if (canSign) { |
24 | | - target.plugins.apply("signing") |
25 | | - target.logger.info("Will sign artifact for project \"${target.name}\" and setup publishing") |
26 | | - } else { |
27 | | - target.logger.warn("Cannot sign project \"${target.name}\" as credentials are missing. Will not setup signing and remote publishing credentials. Publishing will only work to maven local!") |
28 | | - } |
| 16 | + target.plugins.apply(org.gradle.api.publish.maven.plugins.MavenPublishPlugin::class.java) |
29 | 17 |
|
30 | | - target.afterEvaluate { project -> |
31 | | - val isReleaseMode = !(project.version as String).endsWith("-SNAPSHOT") |
| 18 | + target.afterEvaluate { evaluatedProject -> |
| 19 | + val mavenCentralUser = target.propOrEnv("ORG_GRADLE_PROJECT_mavenCentralUsername") ?: target.propOrEnv("mavenCentralUsername") |
| 20 | + val mavenCentralPassword = target.propOrEnv("ORG_GRADLE_PROJECT_mavenCentralPassword") ?: target.propOrEnv("mavenCentralPassword") |
| 21 | + val gpgInMemoryKey = target.propOrEnv("ORG_GRADLE_PROJECT_signingInMemoryKey") ?: target.propOrEnv("signingInMemoryKey") |
| 22 | + val gpgPassword = target.propOrEnv("ORG_GRADLE_PROJECT_signingInMemoryKeyPassword") ?: target.propOrEnv("signingInMemoryKeyPassword") |
32 | 23 |
|
33 | | - if (canSign) { // for local development, If missing in CI it will fail later on deploy so we would notice the issue then |
34 | | - project.extensions.configure(SigningExtension::class.java) { signingExtension -> |
35 | | - signingExtension.useInMemoryPgpKeys(signingKey, signingPassword) |
36 | | - project.extensions.findByType(PublishingExtension::class.java)?.publications?.all { publication -> |
37 | | - signingExtension.sign(publication) |
38 | | - } |
39 | | - } |
40 | | - } |
| 24 | + val canSign = mavenCentralUser != null && mavenCentralPassword != null && gpgInMemoryKey != null && gpgPassword != null |
41 | 25 |
|
42 | | - project.extensions.getByType(JavaPluginExtension::class.java).apply { |
43 | | - withSourcesJar() |
44 | | - withJavadocJar() |
45 | | - } |
46 | | - |
47 | | - project.extensions.getByType(PublishingExtension::class.java).apply { |
48 | | - repositories.apply { |
49 | | - maven { mavenArtifactRepository -> |
50 | | - val targetRepo = if (isReleaseMode) { |
51 | | - "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/" |
52 | | - } else { |
53 | | - "https://s01.oss.sonatype.org/content/repositories/snapshots/" |
54 | | - } |
55 | | - mavenArtifactRepository.setUrl(targetRepo) |
56 | | - |
57 | | - if (canSign) { |
58 | | - mavenArtifactRepository.credentials { passwordCredentials -> |
59 | | - passwordCredentials.username = ossrhUser |
60 | | - passwordCredentials.password = ossrhPassword |
61 | | - } |
62 | | - } |
63 | | - } |
64 | | - } |
| 26 | + target.extensions.getByType(PublishingExtension::class.java).apply { |
65 | 27 | publications { publicationContainer -> |
66 | 28 | publicationContainer.all { publication -> |
67 | 29 | if (publication is MavenPublication) { |
68 | 30 | publication.groupId = "com.utopia-rise" |
69 | 31 | val artifactId = publication.artifactId |
70 | | - publication.artifactId = if (artifactId.isNullOrEmpty()) project.name else artifactId |
71 | | - publication.version = project.version as String |
| 32 | + publication.artifactId = if (artifactId.isNullOrEmpty()) target.name else artifactId |
| 33 | + publication.version = target.version as String |
72 | 34 |
|
73 | 35 | publication.pom { mavenPom -> |
74 | 36 | mavenPom.url.set("https://github.com/utopia-rise/godot-kotlin-jvm.git") |
75 | 37 |
|
76 | 38 | if (mavenPom.name.getOrElse("").isNullOrEmpty()) { |
77 | | - mavenPom.name.set(project.name) |
| 39 | + mavenPom.name.set(target.name) |
78 | 40 | } |
79 | 41 | if (mavenPom.description.getOrElse("").isNullOrEmpty()) { |
80 | | - mavenPom.description.set(project.description ?: "Godot kotlin jvm module") |
| 42 | + mavenPom.description.set(target.description ?: "Godot kotlin jvm module") |
81 | 43 | } |
82 | 44 |
|
83 | 45 | mavenPom.scm { mavenPomScm -> |
@@ -127,22 +89,33 @@ class PublishToMavenCentralPlugin : Plugin<Project> { |
127 | 89 | } |
128 | 90 | } |
129 | 91 |
|
| 92 | + |
130 | 93 | if (canSign) { |
131 | | - project |
132 | | - .tasks |
133 | | - .filter { task -> task.name.startsWith("publish") } |
134 | | - .forEach { task -> |
135 | | - task.dependsOn(project.tasks.withType(Sign::class.java)) |
136 | | - } |
| 94 | + evaluatedProject.logger.info("Will sign artifact for project \"${evaluatedProject.name}\" and setup publishing") |
| 95 | + |
| 96 | + evaluatedProject.pluginManager.apply(MavenPublishPlugin::class.java) |
| 97 | + evaluatedProject.extensions.getByType(MavenPublishBaseExtension::class.java).apply { |
| 98 | + publishToMavenCentral(SonatypeHost.CENTRAL_PORTAL) |
| 99 | + signAllPublications() |
| 100 | + } |
| 101 | + |
| 102 | + target.afterEvaluate { |
| 103 | + target |
| 104 | + .tasks |
| 105 | + .filter { task -> task.name.startsWith("publish") } |
| 106 | + .forEach { task -> |
| 107 | + task.dependsOn(target.tasks.withType(Sign::class.java)) |
| 108 | + } |
| 109 | + } |
| 110 | + } else { |
| 111 | + evaluatedProject.logger.warn("Cannot sign project \"${evaluatedProject.name}\" as credentials are missing. Will not setup signing and remote publishing credentials. Publishing will only work to maven local!") |
137 | 112 | } |
138 | 113 | } |
139 | 114 | } |
140 | 115 | } |
141 | 116 |
|
142 | 117 | fun Project.propOrEnv(name: String): String? { |
143 | | - var property: String? = findProperty(name) as String? |
144 | | - if (property == null) { |
145 | | - property = System.getenv(name) |
146 | | - } |
147 | | - return property |
| 118 | + return findProperty(name) as? String? |
| 119 | + ?: System.getenv(name)?.ifEmpty { null } |
| 120 | + ?: providers.systemProperty(name).orNull |
148 | 121 | } |
0 commit comments