diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..24cb11a62b417f89c0c36f8c57900ef8273a3923
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,18 @@
+image: git.embl.de:4567/grp-bio-it-workshops/intermediate-python
+
+variables:
+  LC_ALL: "C.UTF-8"
+  MAKEFLAGS: "-j 8"
+
+pages:
+  stage: deploy
+  script:
+    - make lesson-check
+    - make lesson-check-all
+    - make site
+    - mv _site public
+  artifacts:
+    paths:
+      - public
+  only:
+    - master
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..b7557b0a2ba68822f1922133ec9718bdfa62faa3
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,5 @@
+FROM jekyll/jekyll
+
+RUN apk --no-cache add \
+    py3-yaml \
+ && gem install json kramdown
diff --git a/build-push-docker.sh b/build-push-docker.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9d1d03d1f6fe94cdbf6f5e55574080f821c28658
--- /dev/null
+++ b/build-push-docker.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+set -euxo pipefail
+
+docker build -t git.embl.de:4567/grp-bio-it-workshops/intermediate-python .
+
+# If successful update the image
+docker login git.embl.de:4567
+docker push git.embl.de:4567/grp-bio-it-workshops/intermediate-python