diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cbf4fb5cd348fd6aebb3ff648fa11a0d3bffbff7..70f100970fb32d033ed678bce9a8525a7234e57a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -135,3 +135,14 @@ user container image:
     - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
     - docker build -t $DOCKER_USER_IMAGE .
     - docker push $DOCKER_USER_IMAGE
+
+code_quality:
+  image: python:3.10-slim
+  needs: []
+  script:
+    # Use same ruff as in .pre-commit-config.yaml
+    - pip install ruff==0.0.277
+    - ruff . --format gitlab > ruff-code-quality-report.json || true
+  artifacts:
+    reports:
+      codequality: ruff-code-quality-report.json
diff --git a/pyproject.toml b/pyproject.toml
index fe3e8ca1277b8e295e996ad5fbd98592b4b77d1b..7c656d05b717d57dc958091bbb753d6c50a1ba37 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -144,7 +144,7 @@ unfixable = [
   "T20",  # Removes print statements
   "F841", # Removes unused variables
 ]
-exclude = []
+exclude = ["EXPERIMENTAL"]
 flake8-unused-arguments.ignore-variadic-names = true
 line-length = 80