diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0f3c87b986084d55847fbebce6bde48dfa2c6bfe..218b4a209b36f188bd7cd441a23ddc4042c271d8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,10 +1,9 @@
-build:
-  tags: [docker]
-  image: ubuntu
-  before_script:
-    - apt-get update -yqq >/dev/null
-    - apt-get install -yqq curl wget >/dev/null
-    - curl -sSL https://github.com/thought-machine/please/releases/download/v14.3.5/please_14.3.5_linux_amd64.tar.gz | tar xz -C /usr/local/bin --strip-components=1
+include:
+  - local: '.gitlab/please-build-ci.yml'
+
+reveal.js:
+  extends: .please-build
+  stage: build
   script:
     - please build --noupdate -p :reveal.js
     - mv plz-out/gen/reveal.js reveal.js
@@ -12,7 +11,15 @@ build:
     name: reveal.js-$CI_COMMIT_REF_SLUG
     paths:
       - reveal.js/
-  cache:
-    key: "plz-cache-$CI_COMMIT_REF_SLUG"
+
+pages:
+  stage: deploy
+  tags: [docker]
+  image: busybox
+  dependencies: [reveal.js]
+  script:
+    - mv reveal.js public
+  artifacts:
+    name: pages
     paths:
-      - .plz-cache
+      - public
diff --git a/.gitlab/please-build-ci.yml b/.gitlab/please-build-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7422a48b712c071e0febe5e5a1b004d9b036e759
--- /dev/null
+++ b/.gitlab/please-build-ci.yml
@@ -0,0 +1,15 @@
+.please-build:
+  tags: [docker]
+  image: ubuntu
+  variables:
+    PLEASE_VERSION: "14.3.5"
+  before_script:
+    - apt-get update -yqq >/dev/null
+    - apt-get install -yqq curl wget >/dev/null
+    - curl -sSL https://github.com/thought-machine/please/releases/download/v${PLEASE_VERSION}/please_${PLEASE_VERSION}_linux_amd64.tar.gz | tar xz -C /usr/local/bin --strip-components=1
+  script:
+    - please build --noupdate -p :${CI_JOB_NAME}
+  cache:
+    key: "plz-cache-$CI_COMMIT_REF_SLUG"
+    paths:
+      - .plz-cache