Skip to content
Snippets Groups Projects
.gitlab-ci.yml 4.91 KiB
Newer Older
Benoît Harrault's avatar
Benoît Harrault committed
image: ghcr.io/cirruslabs/flutter:latest

stages:
  - build-debug
  - build-release
  - release
  - deploy

android:build-debug:
  stage: build-debug
  except:
    - tags
    - master
  script:
    # Flutter local configuration
    - echo flutter.sdk=$FLUTTER_PATH > android/local.properties
    - echo sdk.dir=$ANDROID_SDK_PATH >> android/local.properties
    - echo flutter.buildMode=debug >> android/local.properties
    # Android signing
    - echo "$ANDROID_DEBUG_KEYSTORE_FILE" | base64 -d > android/app/my.keystore
    - echo storeFile=my.keystore > android/key.properties
    - echo storePassword=$ANDROID_DEBUG_KEYSTORE_PASSWORD >> android/key.properties
    - echo keyAlias=$ANDROID_DEBUG_KEY_ALIAS >> android/key.properties
    - echo keyPassword=$ANDROID_DEBUG_KEY_PASSWORD >> android/key.properties
    # build flutter app
    - VERSION_NAME="$(grep '^version:' pubspec.yaml | cut -d' ' -f2 | cut -d'+' -f1)"
    - echo "${VERSION_NAME}"
    - VERSION_CODE="$(grep '^version:' pubspec.yaml | cut -d' ' -f2 | cut -d'+' -f2)"
    - echo "${VERSION_CODE}"
    - flutter packages get
    - flutter clean
    - flutter build apk --debug --split-per-abi
    - flutter build apk --debug
    # prepare artifact
    - BASE_APK_FOLDER="build/app/outputs/flutter-apk"
    - APP_NAME="$(grep 'namespace' android/app/build.gradle | cut -d'"' -f2)"
    - >
      if [ "$(find "${BASE_APK_FOLDER}" -name "*.apk")" != "" ]; then
        for APK in ${BASE_APK_FOLDER}/*.apk; do
          mv -v "${APK}" "$(echo "${APK}" | sed "s|\.apk|_${VERSION_CODE}.apk|" | sed "s|/app-|/${APP_NAME}-|")"
        done
      fi
    - find "${BASE_APK_FOLDER}" -name "*.apk" # where are my apk?
  artifacts:
    paths:
      - build/app/outputs/flutter-apk
    expire_in: 1 week
  interruptible: true

android:build-release:
  stage: build-release
  only:
    - master
  except:
    - tags
  script:
    # Flutter local configuration
    - echo flutter.sdk=$FLUTTER_PATH > android/local.properties
    - echo sdk.dir=$ANDROID_SDK_PATH >> android/local.properties
    - echo flutter.buildMode=release >> android/local.properties
    # Android signing
    - echo "$ANDROID_KEYSTORE_FILE" | base64 -d > android/app/my.keystore
    - echo storeFile=my.keystore > android/key.properties
    - echo storePassword=$ANDROID_KEYSTORE_PASSWORD >> android/key.properties
    - echo keyAlias=$ANDROID_KEY_ALIAS >> android/key.properties
    - echo keyPassword=$ANDROID_KEY_PASSWORD >> android/key.properties
    # build flutter app
    - BASE_APK_FOLDER="build/app/outputs/flutter-apk"
    - echo "${BASE_APK_FOLDER}"
    - mkdir -p "${BASE_APK_FOLDER}"
    - VERSION_NAME="$(grep '^version:' pubspec.yaml | cut -d' ' -f2 | cut -d'+' -f1)"
    - VERSION_CODE="$(grep '^version:' pubspec.yaml | cut -d' ' -f2 | cut -d'+' -f2)"
    - APP_NAME="$(grep 'namespace' android/app/build.gradle | cut -d'"' -f2)"
    - TAG_NAME="Release_${VERSION_NAME}_${VERSION_CODE}"
    - echo "${TAG_NAME}"
    - >
      if [ $(git tag -l "${TAG_NAME}") ]; then
        echo "Tag ${TAG_NAME} already exists. Skipping build release."
      else
        flutter packages get
        flutter clean
        flutter build apk --release --split-per-abi
        flutter build apk --release
      fi
    # prepare artifact
    - >
      if [ "$(find "${BASE_APK_FOLDER}" -name "*.apk")" != "" ]; then
        for APK in ${BASE_APK_FOLDER}/*.apk; do
          mv -v "${APK}" "$(echo "${APK}" | sed "s|\.apk|_${VERSION_CODE}.apk|" | sed "s|/app-|/${APP_NAME}-|")"
        done
      fi
    - find "${BASE_APK_FOLDER}" -name "*.apk" # where are my apk?
  artifacts:
    paths:
      - build/app/outputs/flutter-apk
    expire_in: 1 week
  interruptible: true

application:release:
  stage: release
  image:
    name: alpine/git
    entrypoint: [""]
  only:
    - master
  except:
    - tags
  dependencies:
    - android:build-release
  script:
    - apk --no-cache add curl
    - git config user.email "${GITLAB_USER_EMAIL}"
    - git config user.name "${GITLAB_USER_NAME}"
    - git remote set-url origin https://oauth2:${GITLAB_ACCESS_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}
    - VERSION_NAME="$(grep '^version:' pubspec.yaml | cut -d' ' -f2 | cut -d'+' -f1)"
    - VERSION_CODE="$(grep '^version:' pubspec.yaml | cut -d' ' -f2 | cut -d'+' -f2)"
    - TAG_NAME="Release_${VERSION_NAME}_${VERSION_CODE}"
    - echo "${TAG_NAME}"
    - >
      if [ $(git tag -l "${TAG_NAME}") ]; then
        echo "Tag ${TAG_NAME} already exists. Skipping release and tag creation."
      else
        git tag -a "${TAG_NAME}" -m "Release ${VERSION_NAME} (${VERSION_CODE})"
        git push origin "${TAG_NAME}"
        curl --silent -d "{\"token\": \"${JABBER_NOTIFICATION_TOKEN}\", \"message\": \"New tag for ${CI_PROJECT_PATH}: ${TAG_NAME}\"}" -H "Content-Type: application/json" -X POST ${JABBER_NOTIFICATION_URL}
      fi

android:deploy:
  stage: deploy
  only:
    - tags
  dependencies:
    - application:release
  script:
    - curl "${REPOSITORY_UPDATE_WEBHOOK}?token=${REPOSITORY_TOKEN}" --fail