image: $CI_REGISTRY_IMAGE/flutter:1.1.2

variables:
  ANDROID_APK_PATH: build/app/outputs/apk/debug/
  ANDROID_AAB_PATH: build/app/outputs/bundle/release/

check_internet:
  allow_failure: true
  stage: .pre
  image: rancher/curlimages-curl:7.73.0
  script:
    - curl --connect-timeout 1 google.com
  after_script:
    - echo "CI_JOB_STATUS_CHECK_INTERNET=$CI_JOB_STATUS" >> build.env
  artifacts:
    when: always
    reports:
      dotenv: build.env

set_mirror:
  stage: .pre
  image: rancher/curlimages-curl:7.73.0
  allow_failure: true
  before_script:
    - if [ "$CI_JOB_STATUS_CHECK_INTERNET" == "success" ]; then exit 1; fi
  script:
    - echo "PUB_HOSTED_URL=https://pub.flutter-io.cn" >> build.env
    - echo "FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn" >> build.env
  needs: [ "check_internet" ]
  artifacts:
    when: always
    reports:
      dotenv: build.env

code_quality:
  stage: build
  before_script:
    - if [ "$CI_JOB_STATUS_CHECK_INTERNET" == "success" ]; then exit 0; fi
    - sh ./scripts/generate_intl.sh
  script:
    - flutter analyze --no-fatal-infos
    - dart pub global activate flutter_analyze_reporter
    - dart pub global run flutter_analyze_reporter --output=gl-code-quality-report.json --reporter=gitlab
  artifacts:
    reports:
      codequality: gl-code-quality-report.json

unit_test:
  stage: build
  before_script:
    - if [ "$CI_JOB_STATUS_CHECK_INTERNET" == "success" ]; then exit 0; fi
    - sh ./scripts/generate_intl.sh
  script:
    - sh ./scripts/check-all
  coverage: '/lines\.*: \d+\.\d+\%/'
  artifacts:
    name: "test-coverage-report-$CI_COMMIT_SHORT_SHA"
    paths:
      - coverage
    expire_in: 5 days

build_apk:
  stage: build
  allow_failure: true
  before_script:
    - if [ "$CI_JOB_STATUS_CHECK_INTERNET" == "success" ]; then exit 1; fi
    - sh ./scripts/generate_intl.sh
  script:
    - VERSION_NAME=$(cat pubspec.yaml | grep version | head -1 | awk '{print $2}' | awk -F+ '{print $1}')
    - VERSION_CODE=$(cat pubspec.yaml | grep version | head -1 | awk '{print $2}' | awk -F+ '{print $1}')
    - VERSION_CODE_NEW=$(date +%s)
    - VERSION_NEW=$VERSION_NAME+$VERSION_CODE_NEW
    - 'sed -i "s/version:.*/version: $VERSION_NEW/g" pubspec.yaml'
    - 'sed -i "s/\"versionCode\":.*/\"versionCode\": $VERSION_CODE_NEW,/g" updater.json'
    - 'sed -i "s/\"versionName\":.*/\"versionName\": \"$VERSION_NAME\",/g" updater.json'
    - echo $TEST_STORE_FILE | base64 -d > test-keystore.jks
    - flutter build apk --debug --dart-define=REQUEST_ENV=prod_env --dart-define=KEY_ALIAS=$TEST_KEY_ALIAS --dart-define=KEY_PASSWORD=$TEST_KEY_PASSWORD --dart-define=STORE_FILE=$(pwd)/test-keystore.jks --dart-define=STORE_PASSWORD=$TEST_STORE_PASSWORD --dart-define=OCP_APIM_SUBSCURIPTION_KEY=$OCP_APIM_SUBSCURIPTION_KEY --dart-define=ANDROID_BUILD_TYPE=debug
    - echo "VERSION_NAME=$VERSION_NAME" >> build.env
  artifacts:
    name: "android-apk"
    paths:
      - ${ANDROID_APK_PATH}
      - updater.json
    expire_in: 2 days
    reports:
      dotenv: build.env

upload_apk:
  stage: deploy
  environment: testing
  needs: [ "build_apk" ]
  image: rancher/curlimages-curl:7.73.0
  allow_failure: true
  before_script:
    - if [ "$CI_JOB_STATUS_CHECK_INTERNET" == "success" ]; then exit 1; fi
  script:
    - echo $VERSION_NAME
    - APK_FILENAME=$(basename build/app/outputs/apk/debug/*.apk)
    - echo $APK_FILENAME
    - APK_URL_PATH="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/jihu-gitlab-app/${VERSION_NAME}/"
    - echo $APK_URL_PATH
    - 'curl -i --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${ANDROID_APK_PATH}/${APK_FILENAME} "${APK_URL_PATH}"'
    - APK_URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/jihu-gitlab-app/${VERSION_NAME}/${APK_FILENAME}"
    - echo $APK_URL
    - 'sed -i "s#\"url\":.*#\"url\": \"$APK_URL\"#g" updater.json'
    - 'curl -i --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file updater.json "${APK_URL_PATH}"'
  only:
    - main

build_aab:
  stage: build
  allow_failure: true
  before_script:
    - if [ "$CI_JOB_STATUS_CHECK_INTERNET" == "success" ]; then exit 1; fi
    - sh ./scripts/generate_intl.sh
    - 'sed -i "/android.permission.REQUEST_INSTALL_PACKAGES/d"  $(find . -name AndroidManifest.xml) $(find /home/gitlab-runner/snap/flutter/common/flutter/.pub-cache -name AndroidManifest.xml)'
  script:
    - echo $PROD_STORE_FILE | base64 -d > prod-keystore.jks
    - flutter build appbundle --dart-define=KEY_ALIAS=$PROD_KEY_ALIAS --dart-define=KEY_PASSWORD=$PROD_KEY_PASSWORD --dart-define=STORE_FILE=$(pwd)/prod-keystore.jks --dart-define=STORE_PASSWORD=$PROD_STORE_PASSWORD --dart-define=OCP_APIM_SUBSCURIPTION_KEY=$OCP_APIM_SUBSCURIPTION_KEY --dart-define=ANDROID_BUILD_TYPE=release
  artifacts:
    name: "android-aab"
    paths:
      - ${ANDROID_AAB_PATH}
    expire_in: 2 days
  only:
    - main

upload_aab:
  stage: deploy
  environment: production
  needs: [ "build_aab" ]
  image: rancher/curlimages-curl:7.73.0
  allow_failure: true
  before_script:
    - if [ "$CI_JOB_STATUS_CHECK_INTERNET" != "success" ]; then exit 1; fi
  script:
    - curl -i google.com
    - ls -lh ${ANDROID_AAB_PATH}
  only:
    - main

pages:
  stage: deploy
  image: rancher/curlimages-curl:7.73.0
  allow_failure: true
  before_script:
    - if [ "$CI_JOB_STATUS_CHECK_INTERNET" != "success" ]; then exit 1; fi
  script:
    - cp assets/images/icon.png public/assets/icon.png
  artifacts:
    paths:
      - public
  only:
    - main