diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 741d4f59f623b4acc32c6be23e1ddb4710737c8a..398dc6d446330ecfd1fe474dfe09d3f31de9e31d 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -20,6 +20,10 @@ before_script:
   - apt-get -qq install -y python3-virtualenv python3 python3-dev python3-pip gettext default-mysql-client default-libmysqlclient-dev
   - export DJANGO_SETTINGS_MODULE=AKPlanning.settings_ci
   - ./Utils/setup.sh --prod
+  - mkdir -p public/badges public/lint
+  - echo undefined > public/badges/$CI_JOB_NAME.score
+  - source venv/bin/activate
+  - pip install pylint-gitlab
   - mysql --version
 
 check:
@@ -48,3 +52,32 @@ test:
         coverage_format: cobertura
         path: coverage.xml
       junit: unit.xml
+
+lint:
+  stage: test
+  script:
+    - pylint --exit-zero --output-format=text $(find -type f -name "*.py" ! -path "**/venv/**") | tee /tmp/pylint.txt
+    - sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' /tmp/pylint.txt > public/badges/$CI_JOB_NAME.score
+    - pylint --exit-zero --output-format=pylint_gitlab.GitlabCodeClimateReporter $(find -type f -name "*.py" ! -path "**/venv/**") > codeclimate.json
+    - pylint --exit-zero --output-format=pylint_gitlab.GitlabPagesHtmlReporter $(find -type f -name "*.py" ! -path "**/venv/**") > public/lint/index.html
+  after_script:
+   - |
+      echo "Linting score: $(cat public/badges/$CI_JOB_NAME.score)"
+  artifacts:
+    paths:
+      - public
+    reports:
+      codequality: codeclimate.json
+    when: always
+
+pages:
+  stage: deploy
+  image: alpine:latest
+  script:
+    - echo
+  artifacts:
+    paths:
+      - public
+  only:
+    refs:
+      - main