diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 16871ee4..91e1f8b1 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -152,9 +152,27 @@ steps: ./gradlew detektMain detektTest agents: queue: android + - label: ":kotlin: Publish `rs.wordpress.api:bindings`" + key: "publish-wp-api-kotlin-bindings" + plugins: [$CI_TOOLKIT] + command: | + echo "--- :rust: Installing Rust" + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -v -y + + source "$$HOME/.cargo/env" + + echo "--- :package: Installing Rust Toolchains" + make setup-rust + + echo "--- :kotlin: Publishing `rs.wordpress.api:bindings`" + .buildkite/publish-wp-api-kotlin-bindings.sh + agents: + queue: android - label: ":kotlin: Publish `rs.wordpress.api:kotlin`" key: "publish-wp-api-kotlin" plugins: [$CI_TOOLKIT] + depends_on: + - "publish-wp-api-kotlin-bindings" command: | echo "--- :rust: Installing Rust" curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -v -y diff --git a/.buildkite/publish-wp-api-kotlin-bindings.sh b/.buildkite/publish-wp-api-kotlin-bindings.sh new file mode 100755 index 00000000..61d347df --- /dev/null +++ b/.buildkite/publish-wp-api-kotlin-bindings.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -euo pipefail + +cd ./native/kotlin +./gradlew \ + :api:bindings:prepareToPublishToS3 $(prepare_to_publish_to_s3_params) \ + :api:bindings:publish + +# Add meta-data for the published version so we can use it in subsequent steps +buildkite-agent meta-data set "PUBLISHED_WP_API_BINDINGS_VERSION" < ./api/bindings/build/published-version.txt diff --git a/.buildkite/publish-wp-api-kotlin.sh b/.buildkite/publish-wp-api-kotlin.sh index 82730c49..a014dcc7 100755 --- a/.buildkite/publish-wp-api-kotlin.sh +++ b/.buildkite/publish-wp-api-kotlin.sh @@ -2,8 +2,12 @@ set -euo pipefail +# Retrieve data from previous steps +PUBLISHED_WP_API_BINDINGS_VERSION=$(buildkite-agent meta-data get "PUBLISHED_WP_API_BINDINGS_VERSION") + cd ./native/kotlin ./gradlew \ + -PwpApiBindingsVersion="$PUBLISHED_WP_API_BINDINGS_VERSION" \ :api:kotlin:prepareToPublishToS3 $(prepare_to_publish_to_s3_params) \ :api:kotlin:publish diff --git a/native/kotlin/api/bindings/build.gradle.kts b/native/kotlin/api/bindings/build.gradle.kts new file mode 100644 index 00000000..d651143e --- /dev/null +++ b/native/kotlin/api/bindings/build.gradle.kts @@ -0,0 +1,78 @@ +plugins { + alias(libs.plugins.rustAndroid) + alias(libs.plugins.kotlinJvm) + alias(libs.plugins.publishToS3) + id("java-library") +} + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + toolchain { + languageVersion.set(JavaLanguageVersion.of(17)) + } +} + +dependencies { + implementation(libs.jna) + implementation(libs.kotlinx.coroutines.core) +} + +sourceSets { + main { + java { + srcDir("${layout.buildDirectory.get()}/generated/source/uniffi/java/uniffi") + } + } +} + +val generateUniFFIBindingsTask = tasks.register("generateUniFFIBindings") { + val cargoProjectRoot = rootProject.ext.get("cargoProjectRoot") + val uniffiGeneratedPath = "${layout.buildDirectory.get()}/generated/source/uniffi/java" + val nativeLibraryPath = rootProject.ext.get("nativeLibraryPath")!! + val rustModuleName = rootProject.ext.get("rustModuleName") + + dependsOn(rootProject.tasks.named("cargoBuildLibraryRelease")) + workingDir(project.rootDir) + commandLine( + "cargo", + "run", + "--release", + "--bin", + "wp_uniffi_bindgen", + "generate", + "--library", + nativeLibraryPath, + "--out-dir", + uniffiGeneratedPath, + "--language", + "kotlin" + ) + outputs.dir(uniffiGeneratedPath) + // Re-generate if the interface definition changes. + inputs.file(nativeLibraryPath) + // Re-generate if our uniffi-bindgen tooling changes. + inputs.dir("$cargoProjectRoot/wp_uniffi_bindgen/") + // Re-generate if our uniffi-bindgen version changes. + inputs.file("$cargoProjectRoot/Cargo.lock") + // Re-generate if the module source code changes + inputs.dir("$cargoProjectRoot/$rustModuleName/") +} + +tasks.named("compileKotlin").configure { + dependsOn(generateUniFFIBindingsTask) +} + +project.afterEvaluate { + publishing { + publications { + create("maven") { + from(components["java"]) + + groupId = "rs.wordpress.api" + artifactId = "bindings" + // version is set by "publish-to-s3" plugin + } + } + } +} diff --git a/native/kotlin/api/kotlin/build.gradle.kts b/native/kotlin/api/kotlin/build.gradle.kts index 5d2a773b..51d80a06 100644 --- a/native/kotlin/api/kotlin/build.gradle.kts +++ b/native/kotlin/api/kotlin/build.gradle.kts @@ -1,5 +1,4 @@ plugins { - alias(libs.plugins.rustAndroid) alias(libs.plugins.kotlinJvm) alias(libs.plugins.kotlinSerialization) alias(libs.plugins.publishToS3) @@ -70,53 +69,17 @@ dependencies { implementation(libs.okhttp) implementation(libs.jna) implementation(libs.kotlinx.coroutines.core) -} - -sourceSets { - main { - java { - srcDir("${layout.buildDirectory.get()}/generated/source/uniffi/java/uniffi") + if (project.hasProperty("wpApiBindingsVersion")) { + api("rs.wordpress.api:bindings:${project.properties["wpApiBindingsVersion"]}") { + exclude(group = "net.java.dev.jna") + } + } else { + api(project(":api:bindings")) { + exclude(group = "net.java.dev.jna") } } } -val generateUniFFIBindingsTask = tasks.register("generateUniFFIBindings") { - val cargoProjectRoot = rootProject.ext.get("cargoProjectRoot") - val uniffiGeneratedPath = "${layout.buildDirectory.get()}/generated/source/uniffi/java" - val nativeLibraryPath = rootProject.ext.get("nativeLibraryPath")!! - val rustModuleName = rootProject.ext.get("rustModuleName") - - dependsOn(rootProject.tasks.named("cargoBuildLibraryRelease")) - workingDir(project.rootDir) - commandLine( - "cargo", - "run", - "--release", - "--bin", - "wp_uniffi_bindgen", - "generate", - "--library", - nativeLibraryPath, - "--out-dir", - uniffiGeneratedPath, - "--language", - "kotlin" - ) - outputs.dir(uniffiGeneratedPath) - // Re-generate if the interface definition changes. - inputs.file(nativeLibraryPath) - // Re-generate if our uniffi-bindgen tooling changes. - inputs.dir("$cargoProjectRoot/wp_uniffi_bindgen/") - // Re-generate if our uniffi-bindgen version changes. - inputs.file("$cargoProjectRoot/Cargo.lock") - // Re-generate if the module source code changes - inputs.dir("$cargoProjectRoot/$rustModuleName/") -} - - -tasks.named("compileKotlin").configure { - dependsOn(generateUniFFIBindingsTask) -} tasks.named("processIntegrationTestResources").configure { dependsOn(rootProject.tasks.named("copyDesktopJniLibs")) dependsOn(rootProject.tasks.named("copyTestCredentials")) diff --git a/native/kotlin/settings.gradle.kts b/native/kotlin/settings.gradle.kts index 37885ae9..ccde1fc3 100644 --- a/native/kotlin/settings.gradle.kts +++ b/native/kotlin/settings.gradle.kts @@ -28,6 +28,7 @@ dependencyResolutionManagement { } } +include(":api:bindings") include(":api:kotlin") include(":api:android") include(":example:composeApp")