diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 34b40d7bd93500647bb09ef9fd72b2e95b619cb2..97626dc7b622307d54061e444335a73b6ea982c8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -32,8 +32,14 @@ test-style:
       -v  $(pwd)/persistent:/code/persistent
       "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/web-container:$CI_COMMIT_SHA"
       test
+    - mv persistent/coverage.xml coverage.xml
     - mv persistent/htmlcov htmlcov
+  coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
   artifacts:
+    reports:
+      coverage_report:
+        coverage_format: cobertura
+        path: coverage.xml
     paths:
       - htmlcov/*
       - persistent/tests_http_cache.sqlite
diff --git a/ippisite/.coveragerc b/ippisite/.coveragerc
index 934f0d54431b89aacbaeb6009093a11c34f21a6c..cbebb61c7f586d7babe186ec8d00f34c6193908e 100644
--- a/ippisite/.coveragerc
+++ b/ippisite/.coveragerc
@@ -21,4 +21,7 @@ omit =
     venv/*
 
 [html]
-directory = persistent/htmlcov
\ No newline at end of file
+directory = persistent/htmlcov
+
+[xml]
+output = persistent/coverage.xml
\ No newline at end of file
diff --git a/ippisite/docker-entrypoint.sh b/ippisite/docker-entrypoint.sh
index 172c163573e2f4e19688714a716e9d80ebffecf8..d47e6fa9b1b86015277d4ed7688aa3b42cb09d2e 100644
--- a/ippisite/docker-entrypoint.sh
+++ b/ippisite/docker-entrypoint.sh
@@ -29,6 +29,7 @@ if [ "$1" == "test" ]; then
     coverage run || exit 3
     coverage combine
     coverage report --skip-covered --omit=*/wsgi.py,*/asgi.py,manage.py,*/apps.py
+    coverage xml
     coverage html --omit=*/wsgi.py,*/asgi.py,manage.py,*/apps.py
     exit 0
 fi