diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d93cd99a0df80a4d1d81ec102262eaab431cb8b3..b813433acd0d6969592c883c2921990aac29fe29 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,15 +1,47 @@
-image: "python:3.7"
+image: "python:3.6"
+
+# Change pip's cache directory to be inside the project directory since we can
+# only cache local items.
+variables:
+  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
+
+cache:
+  paths:
+    - .cache/pip
+    - venv/
 
 before_script:
   - python --version
-  - pip install pylint
+  - python3 -m venv venv
+  - source venv/bin/activate
+  - pip install black==22.3.0 flake8==4.0.1 pylint==2.13.8
 
 stages:
   - lint
 
-linting:
+black:
+  tags:
+    - lint
+  stage: lint
+  script:
+    - black --check --diff .
+  only:
+    - merge_requests
+
+flake8:
+  tags:
+    - lint
+  stage: lint
+  script:
+    - flake8 .
+  only:
+    - merge_requests
+
+pylint:
   tags:
     - lint
   stage: lint
   script:
-    - pylint --ignore=tests.py --max-line-length=120 *.py app
+    - pylint app *.py
+  only:
+    - merge_requests