diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e3babaa13d4aaf66c3f70b967b2cd978081ced9b..2562bbad38dad39fbaea17893dee2faa7bf36c15 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,7 @@
 stages:
   - test
   - dockerize
+  - publish
 
 variables:
   # to avoid "fatal: git fetch-pack: expected shallow list"
@@ -28,3 +29,14 @@ dockerize:
     - docker login -u "${CI_REGISTRY_USER}" -p "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY}"
     - docker build -t "${CI_REGISTRY_IMAGE}" .
     - docker push "${CI_REGISTRY_IMAGE}"
+
+upload_jar:
+  stage: publish
+  tags:
+    - shell
+  only:
+    - master
+  script:
+    # extract jar from Docker image
+    - docker run --rm --entrypoint cat "${CI_REGISTRY_IMAGE}" /vospace-ui.jar > vospace-ui.jar
+    - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file vospace-ui.jar "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/vospace-ui/latest/vospace-ui.jar"'