Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 91e1d244 authored by Ellen Poe's avatar Ellen Poe
Browse files

feat: set up android build in gitlab ci/cd

parent 6377cedc
Loading
Loading
Loading
Loading
Loading
+99 −1
Original line number Diff line number Diff line
@@ -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