From 17c1920a8b9e8b099bbbb060516ec6bb228b2ef0 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Jul 2025 16:28:58 +0200 Subject: [PATCH 01/11] Update --- buildSrc/src/main/java/Publication.kt | 250 ++++---------------------- 1 file changed, 35 insertions(+), 215 deletions(-) diff --git a/buildSrc/src/main/java/Publication.kt b/buildSrc/src/main/java/Publication.kt index 68fddaeb..e39c122d 100644 --- a/buildSrc/src/main/java/Publication.kt +++ b/buildSrc/src/main/java/Publication.kt @@ -1,228 +1,48 @@ +import org.gradle.api.GradleException import org.gradle.api.Project import org.gradle.api.distribution.DistributionContainer -import org.gradle.api.file.CopySpec import java.io.File -val sep: String = File.separator +private val sep: String = File.separator -// configure distZip tasks for multiplatform fun DistributionContainer.configureForMultiplatform(project: Project) { - val version = project.properties["versionName"].toString() - this.getByName("main").contents { - from("build${sep}publications${sep}kotlinMultiplatform") { - renameModule(project.name, version = version) - } - // The current Kotlin version doesn't generate this *-all.jar anymore. - // This is a placeholder for backwards compatibility with craft until we fix it there directly. - from("build${sep}libs") { - include("${project.name}-metadata-$version*") - rename { - it.replace("metadata-$version", "$version-all") - } - } - from("build${sep}kotlinToolingMetadata") { - rename { - it.replace( - "kotlin-tooling-metadata.json", - "${project.name}-$version-kotlin-tooling-metadata.json" - ) - } - } - from("build${sep}libs") { - include("${project.name}-kotlin*") - include("${project.name}-metadata*") - withJavadoc(project.name) - rename { - it.replace("multiplatform-kotlin", "multiplatform").replace("-metadata", "") - } - } - } - this.maybeCreate("android").contents { - from("build${sep}publications${sep}androidRelease") { - renameModule(project.name, "android", version) - } - from("build${sep}outputs${sep}aar${sep}${project.name}-release.aar") { - rename { - it.replace("-release", "-android-release") - } - } - from("build${sep}libs") { - include("*android*") - withJavadoc(project.name, "android") - } - } - this.maybeCreate("jvm").contents { - from("build${sep}publications${sep}jvm") { - renameModule(project.name, "jvm", version) - } - from("build${sep}libs$sep") { - include("*jvm*") - withJavadoc(project.name, "jvm") - } - } - this.maybeCreate("iosarm64").contents { - from("build${sep}publications${sep}iosArm64") { - renameModule(project.name, "iosarm64", version) - } - from("build${sep}libs$sep") { - include("${project.name}-iosarm64*") - withJavadoc(project.name, "iosarm64") - } - fromKlib(project.name, "iosArm64", version) - } - this.maybeCreate("iosx64").contents { - from("build${sep}publications${sep}iosX64") { - renameModule(project.name, "iosx64", version) - } - from("build${sep}libs$sep") { - include("${project.name}-iosx64*") - withJavadoc(project.name, "iosx64") - } - fromKlib(project.name, "iosX64", version) - } - this.maybeCreate("iossimulatorarm64").contents { - from("build${sep}publications${sep}iosSimulatorArm64") { - renameModule(project.name, "iossimulatorarm64", version) - } - from("build${sep}libs$sep") { - include("${project.name}-iossimulatorarm64*") - withJavadoc(project.name, "iossimulatorarm64") - } - fromKlib(project.name, "iosSimulatorArm64", version) - } - this.maybeCreate("macosarm64").contents { - from("build${sep}publications${sep}macosArm64") { - renameModule(project.name, "macosarm64", version) - } - from("build${sep}libs$sep") { - include("${project.name}-macosarm64*") - withJavadoc(project.name, "macosarm64") - } - fromKlib(project.name, "macosArm64", version) - } - this.maybeCreate("macosx64").contents { - from("build${sep}publications${sep}macosX64") { - renameModule(project.name, "macosx64", version) - } - from("build${sep}libs$sep") { - include("${project.name}-macosx64*") - withJavadoc(project.name, "macosx64") - } - fromKlib(project.name, "macosX64", version) - } - this.maybeCreate("watchosx64").contents { - from("build${sep}publications${sep}watchosX64") { - renameModule(project.name, "watchosx64", version) - } - from("build${sep}libs$sep") { - include("${project.name}-watchosx64*") - withJavadoc(project.name, "watchosx64") - } - fromKlib(project.name, "watchosX64", version) - } - this.maybeCreate("watchosarm32").contents { - from("build${sep}publications${sep}watchosArm32") { - renameModule(project.name, "watchosarm32", version) - } - from("build${sep}libs$sep") { - include("${project.name}-watchosarm32*") - withJavadoc(project.name, "watchosarm32") - } - fromKlib(project.name, "watchosArm32", version) - } - this.maybeCreate("watchosarm64").contents { - from("build${sep}publications${sep}watchosArm64") { - renameModule(project.name, "watchosarm64", version) - } - from("build${sep}libs$sep") { - include("${project.name}-watchosarm64*") - withJavadoc(project.name, "watchosarm64") - } - fromKlib(project.name, "watchosArm64", version) - } - this.maybeCreate("watchossimulatorarm64").contents { - from("build${sep}publications${sep}watchosSimulatorArm64") { - renameModule(project.name, "watchossimulatorarm64", version) - } - from("build${sep}libs$sep") { - include("${project.name}-watchossimulatorarm64*") - withJavadoc(project.name, "watchossimulatorarm64") - } - fromKlib(project.name, "watchosSimulatorArm64", version) - } - this.maybeCreate("tvosarm64").contents { - from("build${sep}publications${sep}tvosArm64") { - renameModule(project.name, "tvosarm64", version) - } - from("build${sep}libs$sep") { - include("${project.name}-tvosarm64*") - withJavadoc(project.name, "tvosarm64") - } - fromKlib(project.name, "tvosArm64", version) - } - this.maybeCreate("tvosx64").contents { - from("build${sep}publications${sep}tvosX64") { - renameModule(project.name, "tvosx64", version) - } - from("build${sep}libs$sep") { - include("${project.name}-tvosx64*") - withJavadoc(project.name, "tvosx64") - } - fromKlib(project.name, "tvosX64", version) - } - this.maybeCreate("tvossimulatorarm64").contents { - from("build${sep}publications${sep}tvosSimulatorArm64") { - renameModule(project.name, "tvossimulatorarm64", version) - } - from("build${sep}libs$sep") { - include("${project.name}-tvossimulatorarm64*") - withJavadoc(project.name, "tvossimulatorarm64") - } - fromKlib(project.name, "tvosSimulatorArm64", version) - } -} + val version = project.property("versionName").toString() + if (version.isEmpty()) { + throw GradleException("DistZip: version name is empty") + } + val projectName = project.name + val baseDir = "build${sep}test${sep}io${sep}sentry" + val platforms = mapOf( + "main" to projectName, + "android" to "$projectName-android", + "jvm" to "$projectName-jvm", + "iosarm64" to "$projectName-iosarm64", + "iossimulatorarm64" to "$projectName-iossimulatorarm64", + "iosx64" to "$projectName-iosx64", + "macosarm64" to "$projectName-macosarm64", + "macosx64" to "$projectName-macosx64", + "tvosarm64" to "$projectName-tvosarm64", + "tvossimulatorarm64" to "$projectName-tvossimulatorarm64", + "tvosx64" to "$projectName-tvosx64", + "watchosarm32" to "$projectName-watchosarm32", + "watchosarm64" to "$projectName-watchosarm64", + "watchossimulatorarm64" to "$projectName-watchossimulatorarm64", + "watchosx64" to "$projectName-watchosx64" + ) -private fun CopySpec.fromKlib(projectName: String, target: String, version: String) { - val pos = projectName.length - from("build${sep}classes${sep}kotlin${sep}${target}${sep}main${sep}cinterop") { - include("*.klib") - rename { - it.replaceRange(pos, pos, "-${target.lowercase()}-$version") - } - } - from("build${sep}classes${sep}kotlin${sep}${target}${sep}main${sep}klib") { - rename { - "$projectName-${target.lowercase()}-$version.klib" - } - } -} + platforms.forEach { (distName, projectName) -> + val distribution = if (distName == "main") getByName("main") else maybeCreate(distName) + distribution.contents { + val basePath = "$baseDir$sep$projectName$sep$version" -private fun CopySpec.renameModule(projectName: String, renameTo: String = "", version: String) { - var target = "" - if (renameTo.isNotEmpty()) { - target = "-$renameTo" - } - rename { - it.replace("module.json", "$projectName$target-$version.module") - } -} + // Rename the POM since craft looks for pom-default.xml + from("$basePath/$projectName-$version.pom") { + rename { "pom-default.xml" } + } -private fun CopySpec.withJavadoc(projectName: String, renameTo: String = "") { - include("*javadoc*") - rename { fileName -> - when { - "javadoc" in fileName -> { - val newName = buildString { - append(fileName.substring(0, projectName.length)) - if (renameTo.isNotEmpty()) { - append('-') - append(renameTo) - } - append(fileName.substring(projectName.length)) - } - newName + from(basePath) { + exclude("*.pom") } - else -> fileName } } } From d523c681f857847ce54a8e6f860ada364610fe99 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Jul 2025 16:41:43 +0200 Subject: [PATCH 02/11] Update --- build.gradle.kts | 7 +++++-- buildSrc/src/main/java/Config.kt | 13 +++++++------ buildSrc/src/main/java/Publication.kt | 5 ++--- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index c794d01c..4fcc835e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,16 +31,19 @@ subprojects { apply() val sep = File.separator + // The path where we want publishToMavenLocal to output the artifacts to + val buildPublishDir = "${project.layout.buildDirectory.get().asFile.path}${sep}sentry-local-publish" configure { - this.configureForMultiplatform(this@subprojects) + this.configureForMultiplatform(this@subprojects, buildPublishDir) } tasks.named("distZip").configure { + System.setProperty("maven.repo.local", buildPublishDir) this.dependsOn("publishToMavenLocal") this.doLast { val distributionFilePath = - "${this.project.buildDir}${sep}distributions${sep}${this.project.name}-${this.project.version}.zip" + "${project.layout.buildDirectory}${sep}distributions${sep}${this.project.name}-${this.project.version}.zip" val file = File(distributionFilePath) if (!file.exists()) throw GradleException("Distribution file: $distributionFilePath does not exist") if (file.length() == 0L) throw GradleException("Distribution file: $distributionFilePath is empty") diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index e0c14d49..59684bad 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -1,12 +1,13 @@ object Config { val agpVersion = "7.4.2" - val kotlinVersion = "1.9.23" - val composeVersion = "1.6.1" + val kotlinVersion = "2.1.21" + val composePluginVersion = "1.8.0" val gradleMavenPublishPluginVersion = "0.18.0" val multiplatform = "multiplatform" val cocoapods = "native.cocoapods" val jetpackCompose = "org.jetbrains.compose" + val kotlinCompose = "org.jetbrains.kotlin.plugin.compose" val gradleMavenPublishPlugin = "com.vanniktech.maven.publish" val androidGradle = "com.android.library" val kotlinSerializationPlugin = "plugin.serialization" @@ -26,7 +27,7 @@ object Config { val detekt = "io.gitlab.arturbosch.detekt" val detektVersion = "1.22.0" val binaryCompatibility = "org.jetbrains.kotlinx.binary-compatibility-validator" - val binaryCompatibilityVersion = "0.13.1" + val binaryCompatibilityVersion = "0.18.0" } object Libs { @@ -59,9 +60,9 @@ object Config { val ktorClientOkHttp = "io.ktor:ktor-client-okhttp:2.3.6" val ktorClientDarwin = "io.ktor:ktor-client-darwin:2.3.6" - val roboelectric = "org.robolectric:robolectric:4.9" - val junitKtx = "androidx.test.ext:junit-ktx:1.1.5" - val mockitoCore = "org.mockito:mockito-core:5.4.0" + val roboelectric = "org.robolectric:robolectric:4.15.1" + val junitKtx = "androidx.test.ext:junit-ktx:1.2.1" + val mockitoCore = "org.mockito:mockito-core:5.18.0" } object Android { diff --git a/buildSrc/src/main/java/Publication.kt b/buildSrc/src/main/java/Publication.kt index e39c122d..d510f740 100644 --- a/buildSrc/src/main/java/Publication.kt +++ b/buildSrc/src/main/java/Publication.kt @@ -5,13 +5,12 @@ import java.io.File private val sep: String = File.separator -fun DistributionContainer.configureForMultiplatform(project: Project) { +fun DistributionContainer.configureForMultiplatform(project: Project, buildPublishDir: String) { val version = project.property("versionName").toString() if (version.isEmpty()) { throw GradleException("DistZip: version name is empty") } val projectName = project.name - val baseDir = "build${sep}test${sep}io${sep}sentry" val platforms = mapOf( "main" to projectName, "android" to "$projectName-android", @@ -33,7 +32,7 @@ fun DistributionContainer.configureForMultiplatform(project: Project) { platforms.forEach { (distName, projectName) -> val distribution = if (distName == "main") getByName("main") else maybeCreate(distName) distribution.contents { - val basePath = "$baseDir$sep$projectName$sep$version" + val basePath = "$buildPublishDir${sep}io${sep}sentry$projectName$sep$version" // Rename the POM since craft looks for pom-default.xml from("$basePath/$projectName-$version.pom") { From 4c6b9c3994b90309b0dee4fdb0eccf4b88365ca7 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Jul 2025 16:58:27 +0200 Subject: [PATCH 03/11] Update --- build.gradle.kts | 4 ++-- buildSrc/src/main/java/Publication.kt | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4fcc835e..47a540d4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -32,7 +32,7 @@ subprojects { val sep = File.separator // The path where we want publishToMavenLocal to output the artifacts to - val buildPublishDir = "${project.layout.buildDirectory.get().asFile.path}${sep}sentry-local-publish" + val buildPublishDir = "${project.layout.buildDirectory.get().asFile.path}${sep}sentry-local-publish$sep" configure { this.configureForMultiplatform(this@subprojects, buildPublishDir) @@ -43,7 +43,7 @@ subprojects { this.dependsOn("publishToMavenLocal") this.doLast { val distributionFilePath = - "${project.layout.buildDirectory}${sep}distributions${sep}${this.project.name}-${this.project.version}.zip" + "${project.layout.buildDirectory.get().asFile.path}${sep}distributions${sep}${this.project.name}-${this.project.version}.zip" val file = File(distributionFilePath) if (!file.exists()) throw GradleException("Distribution file: $distributionFilePath does not exist") if (file.length() == 0L) throw GradleException("Distribution file: $distributionFilePath is empty") diff --git a/buildSrc/src/main/java/Publication.kt b/buildSrc/src/main/java/Publication.kt index d510f740..1023e741 100644 --- a/buildSrc/src/main/java/Publication.kt +++ b/buildSrc/src/main/java/Publication.kt @@ -11,6 +11,7 @@ fun DistributionContainer.configureForMultiplatform(project: Project, buildPubli throw GradleException("DistZip: version name is empty") } val projectName = project.name + println("proj name: $projectName") val platforms = mapOf( "main" to projectName, "android" to "$projectName-android", @@ -32,7 +33,10 @@ fun DistributionContainer.configureForMultiplatform(project: Project, buildPubli platforms.forEach { (distName, projectName) -> val distribution = if (distName == "main") getByName("main") else maybeCreate(distName) distribution.contents { - val basePath = "$buildPublishDir${sep}io${sep}sentry$projectName$sep$version" + val basePath = "${buildPublishDir}io${sep}sentry${sep}$projectName$sep$version" + if (File(basePath).exists().not()) { + throw GradleException("Artifact $distName does not exist: $basePath") + } // Rename the POM since craft looks for pom-default.xml from("$basePath/$projectName-$version.pom") { From d48b16db568cb683a91a0a0be283f34a2e1f86e5 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Jul 2025 17:09:20 +0200 Subject: [PATCH 04/11] Let CI run for testing --- .github/workflows/upload-artifacts.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/upload-artifacts.yml b/.github/workflows/upload-artifacts.yml index 78c09592..ad13f92c 100644 --- a/.github/workflows/upload-artifacts.yml +++ b/.github/workflows/upload-artifacts.yml @@ -1,8 +1,6 @@ name: "Generate and upload distributions" on: - push: - branches: - - release/** + pull_request: concurrency: group: ${{ github.workflow }}-${{ github.ref }} From 3a7acf71c66cb37d5b3859626b25849bdeb0fcce Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Jul 2025 17:09:56 +0200 Subject: [PATCH 05/11] Update --- buildSrc/src/main/java/Publication.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/buildSrc/src/main/java/Publication.kt b/buildSrc/src/main/java/Publication.kt index 1023e741..743bcaca 100644 --- a/buildSrc/src/main/java/Publication.kt +++ b/buildSrc/src/main/java/Publication.kt @@ -11,7 +11,6 @@ fun DistributionContainer.configureForMultiplatform(project: Project, buildPubli throw GradleException("DistZip: version name is empty") } val projectName = project.name - println("proj name: $projectName") val platforms = mapOf( "main" to projectName, "android" to "$projectName-android", From 30484fa9802055cadeee7c7d32c604ee89287eb6 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Jul 2025 17:21:16 +0200 Subject: [PATCH 06/11] Update --- build.gradle.kts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 47a540d4..28338309 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -35,15 +35,15 @@ subprojects { val buildPublishDir = "${project.layout.buildDirectory.get().asFile.path}${sep}sentry-local-publish$sep" configure { - this.configureForMultiplatform(this@subprojects, buildPublishDir) + configureForMultiplatform(this@subprojects, buildPublishDir) } tasks.named("distZip").configure { System.setProperty("maven.repo.local", buildPublishDir) - this.dependsOn("publishToMavenLocal") - this.doLast { + dependsOn("publishToMavenLocal") + doLast { val distributionFilePath = - "${project.layout.buildDirectory.get().asFile.path}${sep}distributions${sep}${this.project.name}-${this.project.version}.zip" + "${project.layout.buildDirectory.get().asFile.path}${sep}distributions${sep}${project.name}-${project.version}.zip" val file = File(distributionFilePath) if (!file.exists()) throw GradleException("Distribution file: $distributionFilePath does not exist") if (file.length() == 0L) throw GradleException("Distribution file: $distributionFilePath is empty") From 973fe5ee8af4995a1723e56315b68e1feaab9112 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Jul 2025 22:02:43 +0200 Subject: [PATCH 07/11] Update --- buildSrc/src/main/java/Publication.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/buildSrc/src/main/java/Publication.kt b/buildSrc/src/main/java/Publication.kt index 743bcaca..4bf1867e 100644 --- a/buildSrc/src/main/java/Publication.kt +++ b/buildSrc/src/main/java/Publication.kt @@ -33,9 +33,6 @@ fun DistributionContainer.configureForMultiplatform(project: Project, buildPubli val distribution = if (distName == "main") getByName("main") else maybeCreate(distName) distribution.contents { val basePath = "${buildPublishDir}io${sep}sentry${sep}$projectName$sep$version" - if (File(basePath).exists().not()) { - throw GradleException("Artifact $distName does not exist: $basePath") - } // Rename the POM since craft looks for pom-default.xml from("$basePath/$projectName-$version.pom") { From 3b031f50cb22d31807c1c7e794356911cf100cfe Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Jul 2025 22:15:21 +0200 Subject: [PATCH 08/11] Update --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dcbf90d..742fba85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Internal + +- Update `distZip` task to use the locally published artifacts via `publishToMavenLocal` ([#425](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/425)) + ## 0.15.0 ### Enhancements From 09b194a7a51bc7a8b63a59d3797dd17d12b4d023 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Jul 2025 22:31:16 +0200 Subject: [PATCH 09/11] Update --- .github/workflows/upload-artifacts.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/upload-artifacts.yml b/.github/workflows/upload-artifacts.yml index ad13f92c..78c09592 100644 --- a/.github/workflows/upload-artifacts.yml +++ b/.github/workflows/upload-artifacts.yml @@ -1,6 +1,8 @@ name: "Generate and upload distributions" on: - pull_request: + push: + branches: + - release/** concurrency: group: ${{ github.workflow }}-${{ github.ref }} From d9f06ca9bf19b4110370acccc3aba25ad8f641d5 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Jul 2025 22:39:42 +0200 Subject: [PATCH 10/11] Clean up --- buildSrc/src/main/java/Publication.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/Publication.kt b/buildSrc/src/main/java/Publication.kt index 4bf1867e..79c53bc2 100644 --- a/buildSrc/src/main/java/Publication.kt +++ b/buildSrc/src/main/java/Publication.kt @@ -35,7 +35,7 @@ fun DistributionContainer.configureForMultiplatform(project: Project, buildPubli val basePath = "${buildPublishDir}io${sep}sentry${sep}$projectName$sep$version" // Rename the POM since craft looks for pom-default.xml - from("$basePath/$projectName-$version.pom") { + from("$basePath$sep$projectName-$version.pom") { rename { "pom-default.xml" } } From 2de644e840ef5bf214e2781af88ca946226fc61e Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 18 Jul 2025 12:25:42 +0200 Subject: [PATCH 11/11] Update use maybeCreate always --- buildSrc/src/main/java/Publication.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/java/Publication.kt b/buildSrc/src/main/java/Publication.kt index 79c53bc2..a983c071 100644 --- a/buildSrc/src/main/java/Publication.kt +++ b/buildSrc/src/main/java/Publication.kt @@ -30,7 +30,7 @@ fun DistributionContainer.configureForMultiplatform(project: Project, buildPubli ) platforms.forEach { (distName, projectName) -> - val distribution = if (distName == "main") getByName("main") else maybeCreate(distName) + val distribution = maybeCreate(distName) distribution.contents { val basePath = "${buildPublishDir}io${sep}sentry${sep}$projectName$sep$version"