diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 62cc5576efe39612c9996bd031b750df9ef7630b..57a343691d2e814dd82f188e81e890abcbeb7130 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,7 @@
 stages:
   - checks
   - tests
+  - publish
   - coverage
 
 variables:
@@ -69,6 +70,23 @@ tests-3.8:
   variables:
     PYTHON_VERSION: "3.8"
 
+pypi_test:
+  stage: publish
+  only: [tags]
+  when: manual
+  script:
+    - mkdir -p /root/.config/pypoetry/
+    - touch /root/.config/pypoetry/config.toml
+    - poetry config repositories.pypi_test https://test.pypi.org/legacy/
+    - poetry publish --build --username $PYPI_TEST_LOGIN --password $PYPI_TEST_PASSWORD --repository pypi_test
+
+pypi:
+  stage: publish
+  only: [tags]
+  when: manual
+  script:
+    - poetry publish --build --username $PYPI_LOGIN --password $PYPI_PASSWORD
+
 pages:
   extends: .code_changes
   needs: [tests-3.7-coverage]