diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1151630724225fb7e556f7fc85a1de5ad3b81038..f76896fd9b7f6e3a9cdb451ec097d72196e32a5e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,6 @@
 stages:
     - doc
+    - release
 
 lint:
     image: python
@@ -29,3 +30,14 @@ pages:
         when: always
         paths:
             - public
+
+release:
+    stage: release
+    image: python:latest
+    needs: []
+    tags:
+        - docker, specific
+    script:
+        - pip install twine
+        - python setup.py sdist bdist_wheel
+        - TWINE_PASSWORD=${CI_JOB_TOKEN} TWINE_USERNAME=gitlab-ci-token python -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/*
diff --git a/setup.py b/setup.py
index fdd46924eeb85f06d31f64107f91de88fbf532ed..12255b6382c4caef12d9cf223a57d86b11e9432d 100644
--- a/setup.py
+++ b/setup.py
@@ -85,6 +85,7 @@ setup(
     url="https://gitlab.dkrz.de/freva/deployment.git",
     description="Deploy freva and its services on different machines.",
     long_description=read("README.md"),
+    long_description_content_type="text/markdown",
     license="GPLv3",
     packages=find_packages("src"),
     package_dir={"": "src"},