diff --git a/gitlab-ci-mkp.yml b/gitlab-ci-mkp.yml
index 59bc0db7055ec546a389d22845ee1dd95ce34eac..67402a36710c7bd0c13fbf2f4e3ef319061ca918 100644
--- a/gitlab-ci-mkp.yml
+++ b/gitlab-ci-mkp.yml
@@ -1,5 +1,6 @@
 stages:
   - build
+  - upload
   - release
 
 variables:
@@ -21,6 +22,24 @@ build:
     paths:
       - dist/*.mkp
 
+upload:
+  stage: upload
+  image: curlimages/curl:latest
+  tags:
+    - global-runner
+  rules:
+    - if: $CI_COMMIT_TAG
+  needs:
+    - job: build
+      artifacts: true
+  script:
+    - |
+      curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
+        --upload-file dist/${CHECKMK_PLUGIN_FILENAME} "${PACKAGE_REGISTRY_URL}/${CHECKMK_PLUGIN_FILENAME}"
+        
+    - glab release create $CI_COMMIT_TAG -T $CI_COMMIT_TAG --notes "${CI_COMMIT_TAG_MESSAGE}" \
+      "./dist/${CHECKMK_PLUGIN_FILENAME}#${CHECKMK_PLUGIN_FILENAME}#package"
+
 release_job:
   image: gitlab/glab:latest
   stage: release
@@ -31,7 +50,9 @@ release_job:
   needs:
     - job: build
       artifacts: true
-  script:
+    - job: upload
+      artifacts: true
+script:
     - glab config set check_update false --global
     - glab auth login --job-token $CI_JOB_TOKEN --hostname $CI_SERVER_HOST --api-protocol $CI_SERVER_PROTOCOL
     - GITLAB_HOST=$CI_SERVER_URL glab release list -R $CI_PROJECT_PATH