From 0bf6ac9ee17aadc79ea8ea909c0c12f0845a2d30 Mon Sep 17 00:00:00 2001 From: Ellen Poe Date: Thu, 2 Oct 2025 10:56:46 -0700 Subject: [PATCH 1/2] feat: gitlab release pipeline --- .gitlab-ci.yml | 134 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9c867c3..54ef6a0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -22,6 +22,7 @@ default: stages: - lint - build + - release # Detekt static analysis job detekt: @@ -163,3 +164,136 @@ build: - cd cardinal-android - touch local.properties - ./gradlew assembleArm64Debug assembleX86_64Debug --info --stacktrace --no-daemon + artifacts: + when: always + paths: + - cardinal-android/app/build/outputs/ + expire_in: 7 days + +# Android release job - builds signed APKs and AABs for release +release: + stage: release + # Use an image with Android SDK pre-installed + image: cimg/android:2024.01.1-ndk + # Only run on version tags (v*) + rules: + - if: '$CI_COMMIT_TAG =~ /^v.*/' + # Resource group for concurrency control + resource_group: android-release-${CI_COMMIT_REF_SLUG} + variables: + # Android SDK and NDK paths + ANDROID_HOME: /home/circleci/android-sdk + ANDROID_NDK_VERSION: "26.1.10909125" + ANDROID_SDK_ROOT: /home/circleci/android-sdk + before_script: + # Extract version from tag + - export TAG=$CI_COMMIT_TAG + - export VERSION=${TAG#v} + - export VERSION_CODE=$(date +%s) + - echo "Extracted version=$VERSION from tag=$TAG" + - echo "VERSION_CODE=$VERSION_CODE" + # Install git-lfs and additional dependencies + - sudo apt-get update -qq + - sudo apt-get install -y -qq git-lfs curl unzip protobuf-compiler + - git lfs install + # Install specific NDK version if not present + - | + if [ ! -d "$ANDROID_HOME/ndk/$ANDROID_NDK_VERSION" ]; then + echo "Installing NDK $ANDROID_NDK_VERSION..." + yes | sdkmanager "ndk;$ANDROID_NDK_VERSION" || true + fi + # Configure Android NDK environment + - export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/$ANDROID_NDK_VERSION + - export ANDROID_NDK_ROOT=$ANDROID_HOME/ndk/$ANDROID_NDK_VERSION + - export NDK_HOME=$ANDROID_HOME/ndk/$ANDROID_NDK_VERSION + # Install Rust if not present + - | + if ! command -v rustc &> /dev/null; then + echo "Installing Rust..." + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable + source $HOME/.cargo/env + fi + # Add Rust to PATH + - export PATH="$HOME/.cargo/bin:$PATH" + # Install Rust Android targets + - rustup target add aarch64-linux-android + - rustup target add x86_64-linux-android + # Install cargo-ndk + - cargo install cargo-ndk || true + # Set up keystore from CI/CD variable + - echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > cardinal-android/app/release.keystore + cache: + - key: + files: + - cardinal-android/**/*.gradle* + - cardinal-android/gradle/wrapper/gradle-wrapper.properties + prefix: gradle-${CI_JOB_NAME} + paths: + - .gradle/caches + - .gradle/wrapper + - cardinal-android/.gradle + policy: pull-push + - key: + files: + - Cargo.lock + prefix: cargo-${CI_JOB_NAME} + paths: + - .cargo/registry + - .cargo/git + - ./target + policy: pull-push + script: + # Configure Gradle for CI + - mkdir -p ~/.gradle + - echo "org.gradle.daemon=false" >> ~/.gradle/gradle.properties + - echo "org.gradle.parallel=true" >> ~/.gradle/gradle.properties + - echo "org.gradle.configureondemand=true" >> ~/.gradle/gradle.properties + - echo "org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=1g -XX:+HeapDumpOnOutOfMemoryError" >> ~/.gradle/gradle.properties + # Build release APKs and AABs for each architecture + - cd cardinal-android + - touch local.properties + - | + export VERSION=${CI_COMMIT_TAG#v} + export VERSION_CODE=$(date +%s) + # Build APKs for each architecture + ./gradlew assembleArm64Release assembleX86_64Release --info --stacktrace --no-daemon + # Build AABs for each architecture + ./gradlew bundleArm64Release bundleX86_64Release --info --stacktrace --no-daemon + artifacts: + paths: + - cardinal-android/app/build/outputs/apk/arm64/release/app-arm64-release.apk + - cardinal-android/app/build/outputs/apk/x86_64/release/app-x86_64-release.apk + - cardinal-android/app/build/outputs/bundle/arm64Release/app-arm64-release.aab + - cardinal-android/app/build/outputs/bundle/x86_64Release/app-x86_64-release.aab + expire_in: 30 days + release: + tag_name: $CI_COMMIT_TAG + name: 'Cardinal Maps ${CI_COMMIT_TAG#v}' + description: | + ## Cardinal Maps ${CI_COMMIT_TAG#v} + + This release includes separate builds for different architectures: + + ### APK Files (for sideloading) + - `app-arm64-release.apk` - For ARM64 devices (most modern Android phones) + - `app-x86_64-release.apk` - For x86_64 devices (emulators, some tablets) + + ### AAB Files (for Google Play Store) + - `app-arm64-release.aab` - ARM64 Android App Bundle for Google Play + - `app-x86_64-release.aab` - x86_64 Android App Bundle for Google Play + + Choose the appropriate file for your device architecture. If unsure, try the ARM64 version first as it works on most modern Android devices. + assets: + links: + - name: 'app-arm64-release.apk' + url: '${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/file/cardinal-android/app/build/outputs/apk/arm64/release/app-arm64-release.apk' + link_type: 'package' + - name: 'app-x86_64-release.apk' + url: '${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/file/cardinal-android/app/build/outputs/apk/x86_64/release/app-x86_64-release.apk' + link_type: 'package' + - name: 'app-arm64-release.aab' + url: '${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/file/cardinal-android/app/build/outputs/bundle/arm64Release/app-arm64-release.aab' + link_type: 'package' + - name: 'app-x86_64-release.aab' + url: '${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}/artifacts/file/cardinal-android/app/build/outputs/bundle/x86_64Release/app-x86_64-release.aab' + link_type: 'package' -- GitLab From f7712ac66369d2c903a04718be0664845c0f8c24 Mon Sep 17 00:00:00 2001 From: Ellen Poe Date: Thu, 2 Oct 2025 11:17:10 -0700 Subject: [PATCH 2/2] feat: release pipeline --- .gitlab-ci.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 54ef6a0..b3eb8c1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -221,7 +221,10 @@ release: # Install cargo-ndk - cargo install cargo-ndk || true # Set up keystore from CI/CD variable - - echo "$ANDROID_KEYSTORE_BASE64" | base64 --decode > cardinal-android/app/release.keystore + - export KEYSTORE_PASSWORD="$LEGACY_KEYSTORE_PASSWORD" + - export KEY_ALIAS="$LEGACY_KEY_ALIAS" + - export KEY_PASSWORD="$LEGACY_KEY_PASSWORD" + - echo "$LEGACY_ANDROID_KEYSTORE_BASE64" | base64 --decode > cardinal-android/app/release.keystore cache: - key: files: @@ -253,8 +256,6 @@ release: - cd cardinal-android - touch local.properties - | - export VERSION=${CI_COMMIT_TAG#v} - export VERSION_CODE=$(date +%s) # Build APKs for each architecture ./gradlew assembleArm64Release assembleX86_64Release --info --stacktrace --no-daemon # Build AABs for each architecture -- GitLab