image: cirrusci/flutter:latest stages: - update - build-debug - build-release - release - deploy update: stage: update except: - tags script: - flutter packages get - flutter packages upgrade interruptible: true android:build-debug: stage: build-debug 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=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 - flutter packages get - flutter clean - flutter build apk --debug # prepare artifact - find . -name "*.apk" # where is my apk? artifacts: paths: - build/app/outputs/apk/debug expire_in: 1 week interruptible: true android:build-release: stage: build-release only: - master except: - tags dependencies: - android:build-debug 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 - VERSION_FILE="$(find . -name 'gradle.properties' | head -n1)" - VERSION_NAME="$(grep '^app.versionName=' "${VERSION_FILE}" | cut -d'=' -f2)" - VERSION_CODE="$(grep '^app.versionCode=' "${VERSION_FILE}" | 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 fi # prepare artifact - find . -name "*.apk" # where is my apk? artifacts: paths: - build/app/outputs/apk/release 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_FILE="$(find . -name 'gradle.properties' | head -n1)" - VERSION_NAME="$(grep '^app.versionName=' "${VERSION_FILE}" | cut -d'=' -f2)" - VERSION_CODE="$(grep '^app.versionCode=' "${VERSION_FILE}" | 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}"