diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 53e961a22e2e4f6bfe923d659b269f11bae418bf..fe4d4446e760b1ef6a270759725ffa6ba2cd7c5e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -14,24 +14,27 @@ cache:
   paths:
     - ~/.cache/pip/
 
-before_script:
-  - python -V  # Print out python version for debugging
-  - apt-get -qq update
-  - apt-get -qq install -y python3-virtualenv python3 python3-dev python3-pip gettext default-mysql-client default-libmysqlclient-dev
-  - ./Utils/setup.sh --ci
-  - mkdir -p public/badges public/lint
-  - echo undefined > public/badges/$CI_JOB_NAME.score
-  - source venv/bin/activate
-  - pip install pylint-gitlab pylint-django
-  - mysql --version
+.before_script_template:
+  before_script:
+    - python -V  # Print out python version for debugging
+    - apt-get -qq update
+    - apt-get -qq install -y python3-virtualenv python3 python3-dev python3-pip gettext default-mysql-client default-libmysqlclient-dev
+    - ./Utils/setup.sh --ci
+    - mkdir -p public/badges public/lint
+    - echo undefined > public/badges/$CI_JOB_NAME.score
+    - source venv/bin/activate
+    - pip install pylint-gitlab pylint-django
+    - mysql --version
 
 check:
+  extends: .before_script_template
   script:
     - ./Utils/check.sh --all
     - source venv/bin/activate
     - ./manage.py makemigrations --dry-run --check
 
 test:
+  extends: .before_script_template
   script:
     - source venv/bin/activate
     - echo "GRANT ALL on *.* to '${MYSQL_USER}';"| mysql -u root --password="${MYSQL_ROOT_PASSWORD}" -h mysql
@@ -50,6 +53,7 @@ test:
       junit: unit.xml
 
 lint:
+  extends: .before_script_template
   stage: test
   script:
     - pylint --load-plugins pylint_django --django-settings-module=AKPlanning.settings_ci --rcfile pylintrc --exit-zero --output-format=text AK* | tee /tmp/pylint.txt
@@ -67,6 +71,7 @@ lint:
     when: always
 
 doc:
+  extends: .before_script_template
   stage: test
   script:
     - cd docs