From 91e1d244ed1b73d11f820812b7b37fd9fbd226f7 Mon Sep 17 00:00:00 2001 From: Ellen Poe Date: Thu, 2 Oct 2025 09:46:00 -0700 Subject: [PATCH] feat: set up android build in gitlab ci/cd --- .gitlab-ci.yml | 100 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fe7ae15..9c867c3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,6 +21,7 @@ default: # Define pipeline stages stages: - lint + - build # Detekt static analysis job detekt: @@ -55,7 +56,6 @@ detekt: # Run detekt - cd cardinal-android - touch local.properties - - chmod +x ./gradlew - ./gradlew detekt # Optional: Upload detekt reports as artifacts artifacts: @@ -65,3 +65,101 @@ detekt: paths: - cardinal-android/app/build/reports/detekt/ expire_in: 1 week + +# Android build job with Rust support +build: + stage: build + # Use an image with Android SDK pre-installed for better performance + image: cimg/android:2024.01.1-ndk + # Only run on pushes to main and merge requests to main + rules: + - if: '$CI_COMMIT_BRANCH == "main"' + - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "main"' + # Allow newer pipelines to cancel older ones + interruptible: true + # Resource group for concurrency control + resource_group: android-build-${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: + # 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 + # Verify setup + - | + echo "=== Environment Variables ===" + echo "ANDROID_HOME: $ANDROID_HOME" + echo "ANDROID_NDK_HOME: $ANDROID_NDK_HOME" + echo "ANDROID_NDK_ROOT: $ANDROID_NDK_ROOT" + echo "NDK_HOME: $NDK_HOME" + echo "" + echo "=== Android SDK Structure ===" + ls -la $ANDROID_HOME || echo "ANDROID_HOME not found" + echo "" + echo "=== NDK Installation ===" + ls -la $ANDROID_NDK_HOME || echo "NDK not found at $ANDROID_NDK_HOME" + echo "" + echo "=== Rust Targets ===" + rustup target list --installed | grep android || echo "No Android targets found" + echo "" + echo "=== Cargo NDK Version ===" + cargo ndk --version || echo "cargo-ndk not found" + 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 debug APKs for each architecture + - cd cardinal-android + - touch local.properties + - ./gradlew assembleArm64Debug assembleX86_64Debug --info --stacktrace --no-daemon -- GitLab