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

Commit 6f645eae authored by Ellen Poe's avatar Ellen Poe
Browse files

Merge branch 'ellenhp/gitlab_cicd_release' into 'main'

Gitlab CI/CD release pipeline

See merge request e/os/cardinal!7
parents 89f87379 f7712ac6
Loading
Loading
Loading
Loading
Loading
+135 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ default:
stages:
  - lint
  - build
  - release

# Detekt static analysis job
detekt:
@@ -163,3 +164,137 @@ 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
    - 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:
          - 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
    - |
      # 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'