Skip to content

Commit 2c474b7

Browse files
committed
Handle missing Maven publish configuration
1 parent 27d4779 commit 2c474b7

4 files changed

Lines changed: 121 additions & 14 deletions

File tree

.github/workflows/package-release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ jobs:
122122
- name: Publish Maven artifact
123123
if: inputs.publish_maven == true
124124
working-directory: packages/kotlin-codec
125-
run: ./gradlew publish -Preallyme.codec.nativeResourcesDir=${{ github.workspace }}/build/kotlin-native-resources
125+
run: ./gradlew publish -Preallyme.codec.nativeResourcesDir=${{ github.workspace }}/build/kotlin-native-resources -Preallyme.maven.requireRemote=true
126126
env:
127127
REALLYME_MAVEN_REPOSITORY_URL: ${{ secrets.REALLYME_MAVEN_REPOSITORY_URL }}
128128
REALLYME_MAVEN_USERNAME: ${{ secrets.REALLYME_MAVEN_USERNAME }}
@@ -165,7 +165,7 @@ jobs:
165165

166166
- name: Publish Android AAR
167167
if: inputs.publish_maven == true
168-
run: packages/kotlin-codec/gradlew -p packages/android-codec publish -Preallyme.codec.androidJniLibsDir=${{ github.workspace }}/build/android-jniLibs -Preallyme.codec.androidNativeAssetsDir=${{ github.workspace }}/build/android-native-assets -Preallyme.codec.requireAndroidJniLibs=true
168+
run: packages/kotlin-codec/gradlew -p packages/android-codec publish -Preallyme.codec.androidJniLibsDir=${{ github.workspace }}/build/android-jniLibs -Preallyme.codec.androidNativeAssetsDir=${{ github.workspace }}/build/android-native-assets -Preallyme.codec.requireAndroidJniLibs=true -Preallyme.maven.requireRemote=true
169169
env:
170170
REALLYME_MAVEN_REPOSITORY_URL: ${{ secrets.REALLYME_MAVEN_REPOSITORY_URL }}
171171
REALLYME_MAVEN_USERNAME: ${{ secrets.REALLYME_MAVEN_USERNAME }}

packages/android-codec/build.gradle.kts

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,17 @@ val signingKey = providers.gradleProperty("signingInMemoryKey")
3535
.orElse(providers.environmentVariable("MAVEN_SIGNING_KEY"))
3636
val signingPassword = providers.gradleProperty("signingInMemoryKeyPassword")
3737
.orElse(providers.environmentVariable("MAVEN_SIGNING_PASSWORD"))
38+
val requireRemoteMavenPublishing = providers.gradleProperty("reallyme.maven.requireRemote")
39+
.map { it == "true" }
40+
.orElse(false)
41+
42+
fun nonBlank(value: String?): String? = value?.trim()?.takeIf { it.isNotEmpty() }
43+
44+
val remoteMavenRepositoryUrlValue = nonBlank(remoteMavenRepositoryUrl.orNull)
45+
val remoteMavenUsernameValue = nonBlank(remoteMavenUsername.orNull)
46+
val remoteMavenPasswordValue = nonBlank(remoteMavenPassword.orNull)
47+
val signingKeyValue = nonBlank(signingKey.orNull)
48+
val signingPasswordValue = nonBlank(signingPassword.orNull)
3849

3950
val requiredAndroidJniLibs = listOf(
4051
"arm64-v8a/libreallyme_codec_ffi.so",
@@ -198,6 +209,44 @@ tasks.withType<PublishToMavenRepository>().configureEach {
198209
dependsOn("verifyReleaseAarContainsJniLibs")
199210
}
200211

212+
val verifyRemoteMavenPublishingConfigured = tasks.register("verifyRemoteMavenPublishingConfigured") {
213+
group = "verification"
214+
description = "Verifies that remote Maven publishing credentials are configured."
215+
onlyIf { requireRemoteMavenPublishing.get() }
216+
doLast {
217+
val missing = buildList {
218+
if (remoteMavenRepositoryUrlValue == null) {
219+
add("REALLYME_MAVEN_REPOSITORY_URL or -Preallyme.maven.repositoryUrl")
220+
}
221+
if (remoteMavenUsernameValue == null) {
222+
add("REALLYME_MAVEN_USERNAME or -Preallyme.maven.username")
223+
}
224+
if (remoteMavenPasswordValue == null) {
225+
add("REALLYME_MAVEN_PASSWORD or -Preallyme.maven.password")
226+
}
227+
if (signingKeyValue == null) {
228+
add("MAVEN_SIGNING_KEY or -PsigningInMemoryKey")
229+
}
230+
if (signingPasswordValue == null) {
231+
add("MAVEN_SIGNING_PASSWORD or -PsigningInMemoryKeyPassword")
232+
}
233+
}
234+
if (missing.isNotEmpty()) {
235+
throw GradleException(
236+
"remote Maven publishing is not configured; missing non-empty ${missing.joinToString(", ")}"
237+
)
238+
}
239+
}
240+
}
241+
242+
tasks.named("publish") {
243+
dependsOn(verifyRemoteMavenPublishingConfigured)
244+
}
245+
246+
tasks.withType<PublishToMavenRepository>().configureEach {
247+
dependsOn(verifyRemoteMavenPublishingConfigured)
248+
}
249+
201250
publishing {
202251
publications {
203252
create<MavenPublication>("release") {
@@ -237,22 +286,22 @@ publishing {
237286
name = "localRelease"
238287
url = layout.buildDirectory.dir("repos/releases").get().asFile.toURI()
239288
}
240-
if (remoteMavenRepositoryUrl.isPresent) {
289+
if (remoteMavenRepositoryUrlValue != null) {
241290
maven {
242291
name = "remoteRelease"
243-
url = uri(remoteMavenRepositoryUrl.get())
292+
url = uri(remoteMavenRepositoryUrlValue)
244293
credentials {
245-
username = remoteMavenUsername.orNull
246-
password = remoteMavenPassword.orNull
294+
username = remoteMavenUsernameValue
295+
password = remoteMavenPasswordValue
247296
}
248297
}
249298
}
250299
}
251300
}
252301

253302
signing {
254-
if (signingKey.isPresent) {
255-
useInMemoryPgpKeys(signingKey.get(), signingPassword.orNull)
303+
if (signingKeyValue != null) {
304+
useInMemoryPgpKeys(signingKeyValue, signingPasswordValue)
256305
sign(publishing.publications["release"])
257306
}
258307
}

packages/kotlin-codec/build.gradle.kts

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@ val signingKey = providers.gradleProperty("signingInMemoryKey")
2626
.orElse(providers.environmentVariable("MAVEN_SIGNING_KEY"))
2727
val signingPassword = providers.gradleProperty("signingInMemoryKeyPassword")
2828
.orElse(providers.environmentVariable("MAVEN_SIGNING_PASSWORD"))
29+
val requireRemoteMavenPublishing = providers.gradleProperty("reallyme.maven.requireRemote")
30+
.map { it == "true" }
31+
.orElse(false)
32+
33+
fun nonBlank(value: String?): String? = value?.trim()?.takeIf { it.isNotEmpty() }
34+
35+
val remoteMavenRepositoryUrlValue = nonBlank(remoteMavenRepositoryUrl.orNull)
36+
val remoteMavenUsernameValue = nonBlank(remoteMavenUsername.orNull)
37+
val remoteMavenPasswordValue = nonBlank(remoteMavenPassword.orNull)
38+
val signingKeyValue = nonBlank(signingKey.orNull)
39+
val signingPasswordValue = nonBlank(signingPassword.orNull)
2940
val configuredNativeResourcesDir = providers.gradleProperty("reallyme.codec.nativeResourcesDir")
3041
val nativeResourcesDir = configuredNativeResourcesDir
3142
.map { file(it) }
@@ -171,6 +182,44 @@ tasks.withType<PublishToMavenRepository>().configureEach {
171182
dependsOn(verifyBundledNativeResources)
172183
}
173184

185+
val verifyRemoteMavenPublishingConfigured = tasks.register("verifyRemoteMavenPublishingConfigured") {
186+
group = "verification"
187+
description = "Verifies that remote Maven publishing credentials are configured."
188+
onlyIf { requireRemoteMavenPublishing.get() }
189+
doLast {
190+
val missing = buildList {
191+
if (remoteMavenRepositoryUrlValue == null) {
192+
add("REALLYME_MAVEN_REPOSITORY_URL or -Preallyme.maven.repositoryUrl")
193+
}
194+
if (remoteMavenUsernameValue == null) {
195+
add("REALLYME_MAVEN_USERNAME or -Preallyme.maven.username")
196+
}
197+
if (remoteMavenPasswordValue == null) {
198+
add("REALLYME_MAVEN_PASSWORD or -Preallyme.maven.password")
199+
}
200+
if (signingKeyValue == null) {
201+
add("MAVEN_SIGNING_KEY or -PsigningInMemoryKey")
202+
}
203+
if (signingPasswordValue == null) {
204+
add("MAVEN_SIGNING_PASSWORD or -PsigningInMemoryKeyPassword")
205+
}
206+
}
207+
if (missing.isNotEmpty()) {
208+
throw GradleException(
209+
"remote Maven publishing is not configured; missing non-empty ${missing.joinToString(", ")}"
210+
)
211+
}
212+
}
213+
}
214+
215+
tasks.named("publish") {
216+
dependsOn(verifyRemoteMavenPublishingConfigured)
217+
}
218+
219+
tasks.withType<PublishToMavenRepository>().configureEach {
220+
dependsOn(verifyRemoteMavenPublishingConfigured)
221+
}
222+
174223
publishing {
175224
publications {
176225
create<MavenPublication>("maven") {
@@ -208,22 +257,22 @@ publishing {
208257
name = "localRelease"
209258
url = layout.buildDirectory.dir("repos/releases").get().asFile.toURI()
210259
}
211-
if (remoteMavenRepositoryUrl.isPresent) {
260+
if (remoteMavenRepositoryUrlValue != null) {
212261
maven {
213262
name = "remoteRelease"
214-
url = uri(remoteMavenRepositoryUrl.get())
263+
url = uri(remoteMavenRepositoryUrlValue)
215264
credentials {
216-
username = remoteMavenUsername.orNull
217-
password = remoteMavenPassword.orNull
265+
username = remoteMavenUsernameValue
266+
password = remoteMavenPasswordValue
218267
}
219268
}
220269
}
221270
}
222271
}
223272

224273
signing {
225-
if (signingKey.isPresent) {
226-
useInMemoryPgpKeys(signingKey.get(), signingPassword.orNull)
274+
if (signingKeyValue != null) {
275+
useInMemoryPgpKeys(signingKeyValue, signingPasswordValue)
227276
sign(publishing.publications["maven"])
228277
}
229278
}

scripts/check_release_readiness.mjs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ assertContains(
160160
"System.loadLibrary(ANDROID_LIBRARY_NAME)",
161161
);
162162
assertContains("packages/kotlin-codec/src/main/kotlin/me/really/codec/ReallyMeCodec.kt", "@JvmStatic");
163+
assertContains("packages/kotlin-codec/build.gradle.kts", "fun nonBlank(value: String?): String?");
164+
assertContains("packages/kotlin-codec/build.gradle.kts", "verifyRemoteMavenPublishingConfigured");
165+
assertContains("packages/kotlin-codec/build.gradle.kts", "remote Maven publishing is not configured");
166+
assertContains("packages/kotlin-codec/build.gradle.kts", "remoteMavenRepositoryUrlValue != null");
167+
assertContains(".github/workflows/package-release.yml", "-Preallyme.maven.requireRemote=true");
163168
assertContains("packages/kotlin-codec/src/main/kotlin/me/really/codec/ReallyMeCodec.kt", "public fun tryParseCid(cid: String): String?");
164169
assertContains("packages/kotlin-codec/src/main/kotlin/me/really/codec/ReallyMeCodec.kt", "public fun dagCborCodecCode(): Int");
165170
assertContains("packages/kotlin-codec/src/test/kotlin/me/really/codec/ReallyMeCodecTest.kt", 'assertNull(codec.tryParseCid("not-a-cid"))');
@@ -247,6 +252,10 @@ assertContains("packages/android-codec/build.gradle.kts", "inputs.dir(jniLibsDir
247252
assertContains("packages/android-codec/build.gradle.kts", "verifyAndroidJniLibs");
248253
assertContains("packages/android-codec/build.gradle.kts", "verifyReleaseAarContainsJniLibs");
249254
assertContains("packages/android-codec/build.gradle.kts", "PublishToMavenRepository");
255+
assertContains("packages/android-codec/build.gradle.kts", "fun nonBlank(value: String?): String?");
256+
assertContains("packages/android-codec/build.gradle.kts", "verifyRemoteMavenPublishingConfigured");
257+
assertContains("packages/android-codec/build.gradle.kts", "remote Maven publishing is not configured");
258+
assertContains("packages/android-codec/build.gradle.kts", "remoteMavenRepositoryUrlValue != null");
250259
assertContains("packages/android-codec/consumer-rules.pro", "ReallyMeCodecException$*");
251260
assertContains("packages/android-codec/README.md", "me.really:codec-android:0.1.20");
252261
assertContains("scripts/build_android_native_resources.sh", "aarch64-linux-android");

0 commit comments

Comments
 (0)