diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6907496c53d17b4e696d7035b96fc14bac995fbd..7326fca74f2891d16f1d09c992af717242d1df08 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,9 +1,50 @@
-variables:
-  HEROKU_APP_NAME: <APP_NAME>
-
 stages:
+  - build
+  - test
   - deploy
 
+variables:
+  IMAGE: ${CI_REGISTRY}/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}
+  HEROKU_APP_NAME: safe-meadow-86842
+
+build:
+  stage: build
+  image: docker:stable
+  services:
+    - docker:dind
+  variables:
+    DOCKER_DRIVER: overlay2
+  script:
+    - docker login -u $CI_REGISTRY_USER -p $CI_JOB_TOKEN $CI_REGISTRY
+    - docker pull $IMAGE:build-python || true
+    - docker pull $IMAGE:production || true
+    - docker build
+      --target build-python
+      --cache-from $IMAGE:build-python
+      --tag $IMAGE:build-python
+      --file ./Dockerfile
+      "."
+    - docker build
+      --cache-from $IMAGE:production
+      --tag $IMAGE:production
+      --file ./Dockerfile
+      "."
+    - docker push $IMAGE:build-python
+    - docker push $IMAGE:production
+
+test:
+  stage: test
+  image: $IMAGE:production
+  services:
+    - postgres:latest
+  variables:
+    POSTGRES_DB: test
+    POSTGRES_USER: runner
+    POSTGRES_PASSWORD: ""
+    DATABASE_URL: postgres://runner@postgres:5432/test
+  script:
+    - python manage.py test
+
 deploy:
   stage: deploy
   script: