diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f18a7c4695e0bc507dfd335d73030636c05698a2..d16e00c46941e9f6f7ed345d7aeb0ac291d31324 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -14,8 +14,15 @@ variables:
   http_proxy: "http://webproxy:8080"
   https_proxy: "http://webproxy:8080"
 
-.install-deps: &install-deps
-  - poetry install
+.install-reporter-and-upload-to-codecov: &install-reporter-and-upload-to-codecov
+  - curl https://keybase.io/codecovsecurity/pgp_keys.asc | gpg --no-default-keyring --keyring trustedkeys.gpg --import
+  - curl -Os https://uploader.codecov.io/latest/linux/codecov
+  - curl -Os https://uploader.codecov.io/latest/linux/codecov.SHA256SUM
+  - curl -Os https://uploader.codecov.io/latest/linux/codecov.SHA256SUM.sig
+  - gpgv codecov.SHA256SUM.sig codecov.SHA256SUM
+  - shasum -a 256 -c codecov.SHA256SUM
+  - chmod +x codecov
+  - ./codecov --upstream ${HTTPS_PROXY} --token ${CODECOV_TOKEN}
 
 before_script:
   - pip install --upgrade pip virtualenv
@@ -31,6 +38,7 @@ quick-test:
     - pytest -m "not webtest" --verbose --cov=zema_emc_annotated
           --junitxml=junit.xml
     - coverage xml
+    - *install-reporter-and-upload-to-codecov
   coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
   artifacts:
     when: always
@@ -42,6 +50,7 @@ quick-test:
       coverage_report:
         coverage_format: cobertura
         path: coverage.xml
+  environment: coverage
 
 online-test:
   rules:
@@ -51,6 +60,7 @@ online-test:
     - pytest -m webtest --verbose --cov=zema_emc_annotated
           --junitxml=junit.xml
     - coverage xml
+    - *install-reporter-and-upload-to-codecov
   coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
   artifacts:
     when: always
@@ -62,6 +72,7 @@ online-test:
       coverage_report:
         coverage_format: cobertura
         path: coverage.xml
+  environment: coverage
 
 mypy:
   rules: