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

Commit adca1cde authored by Nishith  Khanna's avatar Nishith Khanna
Browse files

refactor ci and also remove unneeded build types

parent 9419b337
Loading
Loading
Loading
Loading
+94 −251
Original line number Diff line number Diff line
image: registry.gitlab.e.foundation/e/os/docker-android-apps-cicd:java21
image: registry.gitlab.e.foundation/e/os/docker-android-apps-cicd:latest

variables:
  SENTRY_DSN: $SENTRY_DSN
  PROJECT_ID: "355" # under Settings -> General
  APK_PATH: "apks"
  APK_PATH: "app/build/outputs/apk/release"
  UNSIGNED_APK: "AppLounge_release.apk"
  COMMUNITY_APK: "AppLounge_release_community.apk"
  OFFICIAL_APK: "AppLounge_release_official.apk"
  TEST_APK: "AppLounge_release_test.apk"

stages:
  - debug
  - release
  - build
  - test-coverage
  - publish
  - gitlab_release

.default_before_script: &default_before_script
  - export GRADLE_USER_HOME=$(pwd)/.gradle
  - chmod +x ./gradlew
before_script:
  - export JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
  - echo user_agent=$USER_AGENT > local.properties

before_script:
  - *default_before_script
.rules_merge_request_ref:
  rules: &rules_merge_request_ref
    - if: "$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS"
      when: never
    - when: always

cache:
  key: ${CI_PROJECT_ID}
  paths:
    - .gradle/

# Debug build related jobs
buildDebug:
  stage: debug
  script:
    - ./gradlew assembleDebug
  artifacts:
    paths:
      - app/build/outputs/apk/debug/
.rules_protected_ref:
  rules: &rules_protected_ref
    - if: '$CI_COMMIT_REF_PROTECTED == "true"'
      when: always
    - if: "$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS"
      when: never
    - when: manual

test:
  stage: release
  rules:
    - if: $CI_MERGE_REQUEST_ID
.rules_protected_tag:
  rules: &rules_protected_tag
    - if: '$CI_COMMIT_TAG && $CI_COMMIT_REF_PROTECTED == "true"'
      when: always
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
    - when: never

.rules_protected_tag_manual:
  rules: &rules_protected_tag_manual
    - if: '$CI_COMMIT_TAG && $CI_COMMIT_REF_PROTECTED == "true"'
      when: manual
    - when: never

.rules_publish:
  rules: &rules_publish
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: manual
    - if: '$CI_COMMIT_TAG !~ "/^$/"'
      when: always

test:
  stage: test-coverage
  rules: *rules_merge_request_ref
  needs:
    - job: build
  script:
    - ./gradlew testReleaseUnitTest jacocoReleaseReport -PtestAccountName="$testAccountName" -PtestAccountPwd="$testAccountPwd" -PtestServerUrl="$testServerUrl"
    - python3 scripts/print_instruction_coverage.py app/build/reports/jacoco/jacocoReleaseReport/jacocoReleaseReport.xml
  coverage: '/Total.*?([0-9]{1,3})%/'
  coverage: "/Total.*?([0-9]{1,3})%/"
  artifacts:
    when: always
    paths:
@@ -60,252 +71,68 @@ test:
        coverage_format: jacoco
        path: app/build/reports/jacoco/jacocoReleaseReport/jacocoReleaseReport.xml

# Default lint configuration for debug builds
# Manual as we don't want to run them generally for debug builds
.lintDebugDefault:
  stage: debug
  when: manual
  allow_failure: true

lintDebug:
  extends: .lintDebugDefault
  script:
    - ./gradlew lintDebug
  artifacts:
    paths:
      - app/build/reports/

# Release build related jobs

# Default configuration for release builds
# Only on "master", "merge_request_event" and protected branches
buildRelease:
  stage: release
  allow_failure: false
  rules:
    - if: $CI_MERGE_REQUEST_ID 
      when: always
    - if: '$CI_COMMIT_REF_PROTECTED == "true"'
      when: always
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
      when: always
    - if: '$CI_COMMIT_TAG !~ "/^$/"'
      when: always
  script:
    - ./gradlew assembleRelease
  artifacts:
    paths:
      - app/build/outputs/apk/release/

# Release jobs to generate signed artifacts
.releaseSigned:
  stage: release
  allow_failure: false
  before_script:
    - *default_before_script
    - echo "${KEYSTORE}" | base64 -d > keystore/proprietary.keystore
  rules:
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
      when: always
    - if: '$CI_COMMIT_REF_PROTECTED == "true"'
      when: always

.releaseSignedRules:
  rules: &releaseSignedRules
    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_REF_PROTECTED == "true"'
      when: always
    - when: manual

buildReleaseTest:
  extends: .releaseSigned
  script:
    - ./gradlew assembleReleaseTest
  artifacts:
    paths:
      - app/build/outputs/apk/releaseTest/

buildReleaseCommunity:
  extends: .releaseSigned
  allow_failure: true
  rules: *releaseSignedRules
  script:
    - ./gradlew assembleReleaseCommunity
  artifacts:
    paths:
      - app/build/outputs/apk/releaseCommunity/

buildReleaseOfficial:
  extends: .releaseSigned
  allow_failure: true
  rules: *releaseSignedRules
  script:
    - ./gradlew assembleReleaseOfficial
  artifacts:
    paths:
      - app/build/outputs/apk/releaseOfficial/

# Default lint configuration for release jobs
.lintReleaseDefault:
  stage: release
  when: always
build:
  stage: build
  allow_failure: false

lintRelease:
  extends: .lintReleaseDefault
  rules:
    - if: $CI_MERGE_REQUEST_ID
      when: always
  rules: *rules_merge_request_ref
  script:
    - ./gradlew lintRelease
    - ./gradlew detekt
    - ./gradlew lint detekt assemble --parallel
  artifacts:
    paths:
      - app/build/outputs/apk/
      - app/build/reports/
      - build/reports/


publish-authdatalib:
  stage: publish
  needs: ["buildRelease"]
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: manual
    - if: '$CI_COMMIT_TAG !~ "/^$/"'
      when: always
  script:
    - ./gradlew :auth-data-lib:build
    - ./gradlew :auth-data-lib:publish
  allow_failure: true


pushToPrebuilt:
  stage: publish
  needs: ["buildRelease"]
  rules:
    - if: '$CI_COMMIT_TAG !~ "/^$/"'
      when: manual
    - when: never
  variables:
    NEW_APK_PATH: "app/build/outputs/apk/release/"
  before_script:
    - eval $(ssh-agent -s)
    - echo "$SSH_E_ROBOT_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
    - chmod 644 ~/.ssh/known_hosts
    - git config --global user.email "gitlab@e.foundation"
    - git config --global user.name "gitlab"
  script:
    - NEW_APK_NAME=$(basename ${NEW_APK_PATH}*-release.apk)
    - NEW_APK_VERSION=$(awk -F '-' '{print $2}' <<< "$NEW_APK_NAME")
    - echo $NEW_APK_NAME
    - echo $NEW_APK_VERSION
    - git lfs clone git@gitlab.e.foundation:e/os/android_prebuilts_prebuiltapks_lfs.git
    - cd android_prebuilts_prebuiltapks_lfs
    - rm Apps/*-release.apk
    - mv ../${NEW_APK_PATH}/${NEW_APK_NAME} Apps/
    # todo: improve to replace sed command, by a new one based on REGEXP (instead of using line number)
    - sed -i "6s/.*/LOCAL_SRC_FILES := ${NEW_APK_NAME}/" Apps/Android.mk
    - git add Apps
    - git status
    - git commit -m "App Lounge - ${NEW_APK_VERSION}, ${CI_COMMIT_TAG}" -m "From ${CI_COMMIT_SHA}, pipeline ${CI_PIPELINE_ID}"
    - git push
    # Sometimes a single push doesn't do all the job, so we have to push twice
    - git push
  allow_failure: true

publish-contracts:
  stage: publish
  needs: ["buildRelease"]
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
      when: manual
    - if: '$CI_COMMIT_TAG !~ "/^$/"'
      when: always
  script:
    - ./gradlew :parental-control-data:build
    - ./gradlew :parental-control-data:publish
  allow_failure: true

init-submodules:
  stage: gitlab_release
  needs: []
  rules:
    - if: '$CI_COMMIT_TAG && $CI_COMMIT_REF_PROTECTED == "true"'
      when: on_success
init_submodules:
  stage: build
  rules: *rules_protected_ref
  script:
    - git clone https://gitlab.e.foundation/e/os/system-apps-update-info.git systemAppsUpdateInfo
    - |
      git clone https://gitlab.e.foundation/e/os/system-apps-update-info.git systemAppsUpdateInfo
  artifacts:
    paths:
      - systemAppsUpdateInfo/scripts/

generate-apks:
  stage: gitlab_release
  rules:
    - if: '$CI_COMMIT_TAG && $CI_COMMIT_REF_PROTECTED == "true"'
      when: on_success
  stage: build
  rules: *rules_merge_request_ref
  needs:
    - init-submodules
    - buildRelease
    - buildReleaseTest
    - buildReleaseCommunity
    - buildReleaseOfficial
  dependencies:
    - init-submodules
    - buildRelease
    - buildReleaseTest
    - buildReleaseCommunity
    - buildReleaseOfficial
    - job: build
    - job: init_submodules
  script:
    - mkdir -p $APK_PATH
    - unsignedApk=$(ls app/build/outputs/apk/release/*.apk | grep "release")
    - testApk=$(ls app/build/outputs/apk/releaseTest/*.apk | grep "releaseTest")
    - communityApk=$(ls app/build/outputs/apk/releaseCommunity/*.apk | grep "releaseCommunity")
    - officialApk=$(ls app/build/outputs/apk/releaseOfficial/*.apk | grep "releaseOfficial")
    - cp "$unsignedApk" "$APK_PATH/$UNSIGNED_APK"
    - cp "$testApk" "$APK_PATH/$TEST_APK"
    - cp "$communityApk" "$APK_PATH/$COMMUNITY_APK"
    - cp "$officialApk" "$APK_PATH/$OFFICIAL_APK"
    - |
      ./systemAppsUpdateInfo/scripts/generate-apks.sh \
      "$APK_PATH" "$UNSIGNED_APK" "$COMMUNITY_APK" "$OFFICIAL_APK" "$TEST_APK"
  artifacts:
    paths:
      - $APK_PATH/$UNSIGNED_APK
      - $APK_PATH/$TEST_APK
      - $APK_PATH/$COMMUNITY_APK
      - $APK_PATH/$OFFICIAL_APK
      - $APK_PATH/$TEST_APK

create-json-files:
  stage: gitlab_release
  dependencies:
    - init-submodules
    - generate-apks
  stage: publish
  rules: *rules_protected_tag
  needs:
    - init-submodules
    - generate-apks
  rules:
    - if: '$CI_COMMIT_TAG && $CI_COMMIT_REF_PROTECTED == "true"'
      when: on_success
    - job: init_submodules
    - job: generate-apks
  script:
    - |
      ./systemAppsUpdateInfo/scripts/create-json-files.sh \
      "$APK_PATH" "$UNSIGNED_APK" "$COMMUNITY_APK" "$OFFICIAL_APK" "$TEST_APK"
  artifacts:
    paths:
      - test.json
      - community.json
      - official.json
      - test.json

create-test-release:
  stage: gitlab_release
  dependencies:
    - init-submodules
  stage: publish
  rules: *rules_protected_tag_manual
  needs:
    - init-submodules
    - create-json-files
    - generate-apks
  rules:
    - if: '$CI_COMMIT_TAG && $CI_COMMIT_REF_PROTECTED == "true"'
      when: manual
    - job: init_submodules
    - job: create-json-files
      artifacts: false
  script:
    - |
      ./systemAppsUpdateInfo/scripts/create-test-release.sh \
@@ -313,18 +140,34 @@ create-test-release:
  allow_failure: true

create-release:
  stage: gitlab_release
  dependencies:
    - init-submodules
  stage: publish
  rules: *rules_protected_tag_manual
  needs:
    - init-submodules
    - create-json-files
    - generate-apks
  rules:
    - if: '$CI_COMMIT_TAG && $CI_COMMIT_REF_PROTECTED == "true"'
      when: manual
    - job: init_submodules
    - job: create-json-files
      artifacts: false
  script:
    - |
      ./systemAppsUpdateInfo/scripts/create-release.sh \
      "$APK_PATH" "$UNSIGNED_APK" "$COMMUNITY_APK" "$OFFICIAL_APK"
  allow_failure: true

publish-authdatalib:
  stage: publish
  needs:
    - job: build
  rules: *rules_publish
  script:
    - ./gradlew :auth-data-lib:build
    - ./gradlew :auth-data-lib:publish
  allow_failure: true

publish-contracts:
  stage: publish
  needs:
    - job: build
  rules: *rules_publish
  script:
    - ./gradlew :parental-control-data:build
    - ./gradlew :parental-control-data:publish
  allow_failure: true
+5 −20
Original line number Diff line number Diff line
@@ -151,26 +151,11 @@ generate-apks:
      when: on_success
  needs:
    - init-submodules
    - buildRelease
    - buildReleaseTest
    - buildReleaseCommunity
    - buildReleaseOfficial
  dependencies:
    - init-submodules
    - buildRelease
    - buildReleaseTest
    - buildReleaseCommunity
    - buildReleaseOfficial
    - build
  script:
    - mkdir -p $APK_PATH
    - unsignedApk=$(ls app/build/outputs/apk/release/*.apk | grep "release")
    - testApk=$(ls app/build/outputs/apk/releaseTest/*.apk | grep "releaseTest")
    - communityApk=$(ls app/build/outputs/apk/releaseCommunity/*.apk | grep "releaseCommunity")
    - officialApk=$(ls app/build/outputs/apk/releaseOfficial/*.apk | grep "releaseOfficial")
    - cp "$unsignedApk" "$APK_PATH/$UNSIGNED_APK"
    - cp "$testApk" "$APK_PATH/$TEST_APK"
    - cp "$communityApk" "$APK_PATH/$COMMUNITY_APK"
    - cp "$officialApk" "$APK_PATH/$OFFICIAL_APK"
    - |
      ./systemAppsUpdateInfo/scripts/generate-apks.sh \
      "$APK_PATH" "$UNSIGNED_APK" "$COMMUNITY_APK" "$OFFICIAL_APK" "$TEST_APK"
  artifacts:
    paths:
      - $APK_PATH/$UNSIGNED_APK
+4 −58
Original line number Diff line number Diff line
@@ -97,82 +97,28 @@ android {
    }

    signingConfigs {
        def keystore_password = System.getenv('KEYSTORE_PASSWORD')
        debugConfig {
        platformConfig {
            storeFile file("keystore/platform.jks")
            storePassword "platform"
            keyAlias "platform"
            keyPassword "platform"
        }
        releaseTestConfig {
            storeFile = file("../keystore/proprietary.keystore")
            storePassword = keystore_password
            keyAlias = 'platform.test'
            keyPassword = keystore_password
        }
        releaseCommunityConfig {
            storeFile = file("../keystore/proprietary.keystore")
            storePassword = keystore_password
            keyAlias = 'platform.dev'
            keyPassword = keystore_password
        }
        releaseOfficialConfig {
            storeFile = file("../keystore/proprietary.keystore")
            storePassword = keystore_password
            keyAlias = 'platform.stable'
            keyPassword = keystore_password
        }
    }

    sourceSets {
        debug {
            manifest.srcFile 'src/debug/AndroidManifest.xml'
        }
        releaseTest {
            manifest.srcFile 'src/release/AndroidManifest.xml'
            java.srcDirs = ['src/release/java']
        }
        releaseCommunity {
            manifest.srcFile 'src/release/AndroidManifest.xml'
            java.srcDirs = ['src/release/java']
        }
        releaseOfficial {
            manifest.srcFile 'src/release/AndroidManifest.xml'
            java.srcDirs = ['src/release/java']
        }
    }

    buildTypes {
        debug {
            signingConfig = signingConfigs.debugConfig
            signingConfig = signingConfigs.platformConfig
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled = false
            signingConfig = signingConfigs.debugConfig
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        releaseTest {
            minifyEnabled = false
            signingConfig = signingConfigs.releaseTestConfig
            sourceSets
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        releaseCommunity {
            minifyEnabled = false
            signingConfig = signingConfigs.releaseCommunityConfig
            sourceSets
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        releaseOfficial {
            minifyEnabled = false
            signingConfig = signingConfigs.releaseOfficialConfig
            signingConfig = signingConfigs.platformConfig
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        applicationVariants.all { variant ->
            variant.outputs.all { output ->
                outputFileName = "AppLounge-${variant.versionName}-${variant.buildType.name}.apk"
                outputFileName = "AppLounge_${variant.buildType.name}.apk"
            }
        }
    }