diff --git a/.github/actions/android/action.yml b/.github/actions/android/action.yml new file mode 100644 index 0000000..f973471 --- /dev/null +++ b/.github/actions/android/action.yml @@ -0,0 +1,62 @@ +name: "Build Android library" +description: "Create artifact for Android library" +inputs: + sign-publication: + description: "Whether to sign the built library" + default: '1' + gpg-key: + required: false + description: "The GPG key to use when signing the publication" + gpg-password: + required: false + description: "Password for the GPG key." + +runs: + using: "composite" + steps: + - uses: actions/setup-java@v4 + with: + distribution: "temurin" + java-version: "17" + + - name: Validate Gradle wrapper + uses: gradle/actions/wrapper-validation@v4 + + - name: Setup + shell: bash + run: | + rustup toolchain install nightly-2025-04-15-x86_64-unknown-linux-gnu + rustup component add rust-src --toolchain nightly-2025-04-15-x86_64-unknown-linux-gnu + rustup target add \ + aarch64-linux-android \ + armv7-linux-androideabi \ + x86_64-linux-android \ + i686-linux-android + cargo install cargo-ndk + + - name: Build signed library + shell: bash + if: ${{ inputs.sign-publication == '1' }} + run: | + cd android + ./gradlew build zipPublication -PgpgKey=${{ inputs.gpg-key }} -PgpgPassword=${{ inputs.gpg-password }} + ls -lh build/outputs/aar + find build/repository + + - name: Build library without signing + shell: bash + if: ${{ inputs.sign-publication == '0' }} + run: | + cd android + ./gradlew build zipPublication -PsignPublication=0 + ls -lh build/outputs/aar + find build/repository + + - name: Upload binary + uses: actions/upload-artifact@v4 + with: + name: android-library + retention-days: 1 + compression-level: 0 # We're uploading a zip, no need to compress again + path: android/build/distributions/powersync_android.zip + if-no-files-found: error diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 5c09328..12ca5ce 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -8,31 +8,10 @@ jobs: if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name != github.repository) runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - - - uses: actions/setup-java@v3 + - name: Build Android + uses: ./.github/actions/android with: - distribution: "temurin" - java-version: "17" - - - name: Validate Gradle wrapper - uses: gradle/actions/wrapper-validation@v4 - - - name: Setup - run: | - rustup toolchain install nightly-2025-04-15-x86_64-unknown-linux-gnu - rustup component add rust-src --toolchain nightly-2025-04-15-x86_64-unknown-linux-gnu - rustup target add \ - aarch64-linux-android \ - armv7-linux-androideabi \ - x86_64-linux-android \ - i686-linux-android - cargo install cargo-ndk - - - name: Build for Android - run: | - cd android - ./gradlew build - ls -lh build/outputs/aar + sign-publication: '0' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9c9564b..481bd88 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,45 +33,48 @@ jobs: body="Release $tag" gh release create --draft "$tag" --title "$tag" --notes "$body" + build_android: + name: Build Android + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - name: Build Android + uses: ./.github/actions/android + with: + gpg-key: ${{ secrets.GPG_PRIVATE_KEY }} + gpg-password: ${{ secrets.GPG_PASSWORD }} + publish_android: permissions: contents: read packages: write name: Publish Android - needs: [draft_release] + needs: [draft_release, build_android] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - with: - submodules: true - - - uses: actions/setup-java@v3 + - uses: actions/checkout@v4 with: - distribution: "temurin" - java-version: "17" + fetch-depth: 0 - - name: Setup - run: | - rustup toolchain install nightly-2025-04-15-x86_64-unknown-linux-gnu - rustup component add rust-src --toolchain nightly-2025-04-15-x86_64-unknown-linux-gnu - rustup target add \ - aarch64-linux-android \ - armv7-linux-androideabi \ - x86_64-linux-android \ - i686-linux-android - cargo install cargo-ndk + - uses: actions/download-artifact@v4 + name: android-library - - name: Publish for Android + - name: Publish to Maven Central if: ${{ inputs.publish }} run: | - cd android - ./gradlew publish - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} - OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} - GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} - GPG_PASSWORD: ${{ secrets.GPG_PASSWORD }} + curl --request POST \ + --header 'Authorization: Bearer ${{ secrets.CENTRAL_AUTH }}' \ + --form bundle=@powersync-android.zip \ + https://central.sonatype.com/api/v1/publisher/upload + + - name: Upload binary + uses: ./.github/actions/upload + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + file-name: powersync-android.zip + tag: ${{ needs.draft_release.outputs.tag }} publish_ios_pod_and_spm_package: name: Publish iOS diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 7247336..bc2e504 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -5,10 +5,12 @@ plugins { id("signing") } -group = "co.powersync" +group = "com.powersync" version = "0.3.14" description = "PowerSync Core SQLite Extension" +val localRepo = uri("build/repository/") + repositories { mavenCentral() google() @@ -119,45 +121,42 @@ publishing { } repositories { - if (System.getenv("OSSRH_USERNAME") != null) { - maven { - name = "sonatype" - url = uri("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") - credentials { - username = System.getenv("OSSRH_USERNAME") - password = System.getenv("OSSRH_PASSWORD") - } - } - } - - if (System.getenv("GITHUB_ACTOR") != null) { - maven { - name = "GitHubPackages" - url = uri("https://maven.pkg.github.com/powersync-ja/powersync-sqlite-core") - credentials { - username = System.getenv("GITHUB_ACTOR") - password = System.getenv("GITHUB_TOKEN") - } - } + maven { + name = "here" + url = localRepo } } } signing { - if (System.getenv("GPG_PRIVATE_KEY") == null) { - useGpgCmd() - } else { - var signingKey = String(Base64.getDecoder().decode(System.getenv("GPG_PRIVATE_KEY"))).trim() - var signingPassword = System.getenv("GPG_PASSWORD") - useInMemoryPgpKeys(signingKey, signingPassword) + val sign = providers.gradleProperty("signPublication").getOrElse("1") + + if (sign != "0") { + val key = providers.gradleProperty("gpgKey") + val password = providers.gradleProperty("gpgPassword") + + if (key.isPresent()) { + val signingKey = String(Base64.getDecoder().decode(key.get())).trim() + useInMemoryPgpKeys(signingKey, password.get()) + } else { + useGpgCmd() + } + + sign(publishing.publications) } - sign(publishing.publications) } tasks.withType() { dependsOn(prefabAar) } +val zipPublication by tasks.registering(Zip::class) { + dependsOn(tasks.named("publishAllPublicationsToHereRepository")) + + archiveFileName.set("powersync_android.zip") + from(localRepo) +} + tasks.named("build") { dependsOn(prefabAar) } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index b82aa23..ca025c8 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME