diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 77543d5f4ba3852fa0a4fc15701e1f4864133a8d..2b99f15b0fc8add3bba7e3d38fbe737282027545 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,18 +1,12 @@
 image: cirrusci/flutter:latest
 
 stages:
-  - test
   - update
   - build-debug
   - build-release
+  - release
   - deploy
 
-tests:
-  stage: test
-  script:
-    - flutter test
-  interruptible: true
-
 update:
   stage: update
   script:
@@ -74,11 +68,34 @@ android:build-release:
     expire_in: 1 week
   interruptible: true
 
-android:deploy:
-  stage: deploy
+application:release:
+  stage: release
+  image:
+    name: alpine/git
+    entrypoint: [""]
   only:
     - master
+  except:
+      - tags
   dependencies:
     - android:build-release
+  script:
+    - 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_CODE}_${VERSION_NAME}"
+    - echo "${TAG_NAME}"
+    - git tag -a "${TAG_NAME}" -m "Release ${VERSION_NAME} (${VERSION_CODE})"
+    - git push origin "${TAG_NAME}"
+
+android:deploy:
+  stage: deploy
+  only:
+    - tags
+  dependencies:
+    - application:release
   script:
     - wget ${REPOSITORY_UPDATE_WEBHOOK}?token=${REPOSITORY_TOKEN}
diff --git a/android/gradle.properties b/android/gradle.properties
index 379a5b70bc7d025bf005014c5ab18b682895abc4..05f2f47d659639286844e03e2a00088c5fc37922 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx1536M
 android.useAndroidX=true
 android.enableJetifier=true
-app.versionName=1.0.1
-app.versionCode=2
+app.versionName=1.0.2
+app.versionCode=3