diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..80213f394f7ff120b9f7c4aea4bab729c3fa9e2f
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,32 @@
+---
+variables:
+# work around https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/2148
+# value should be "recursive" without workaround
+  GIT_SUBMODULE_STRATEGY: none
+
+before_script:
+- echo "Running make concurrently with $(nproc) cores, where possibly"
+# make sure we can update submodules and apply the patches
+- git submodule foreach --recursive git reset --hard HEAD
+- git submodule foreach --recursive git clean -fdx
+# work around https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/2148
+- git submodule sync --recursive
+- git submodule update --init --recursive
+# end workaround
+- patches/apply_patches.sh
+# detect number of processors, but make sure never to run with -j"", as the
+# build host would likely run out of memory
+- ": ${DUNECI_PARALLEL:=$(nproc || echo 1)}"
+- export DUNECI_PARALLEL
+
+git--gcc:
+  image: registry.dune-project.org/joe/dune-perftool-ci/perftool-base:git
+  script: duneci-standard-test
+
+git--clang:
+  image: registry.dune-project.org/joe/dune-perftool-ci/perftool-base:git
+  script: duneci-standard-test --opts=/duneci/opts.clang
+
+git--pacxx:
+  image: registry.dune-project.org/joe/dune-perftool-ci/pacxx-perftool-base:git
+  script: duneci-standard-test --opts=/duneci/opts.pacxx