diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a25381291ff2be1d94b2a9381ab385ba79295282
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,45 @@
+stages:
+  - checks
+  - deploy
+
+default:
+  tags: [docker]
+
+image: rocker/r-ver:latest
+
+variables:
+  CACHE_CI: "$CI_PROJECT_DIR/ci"
+  R_LIBS_USER: "$CACHE_CI/lib"
+
+cache:
+  paths:
+    - $CACHE_CI
+
+before_script:
+  - mkdir -p $R_LIBS_USER
+  - echo "R_LIBS='$R_LIBS_USER'" > .Renviron
+  - R -q -e 'remotes::install_deps(dep = T)'
+
+test_all:
+  stage: checks
+  script:
+  - R -q -e 'testthat::test_local()'
+
+check:
+  variables:
+    NOT_CRAN: "true"
+  stage: checks
+  script:
+    - R -q -e 'remotes::update_packages("rcmdcheck")'
+    - R -q -e 'rcmdcheck::rcmdcheck(args = "--no-manual", error_on = "error")'
+
+pages:
+  stage: deploy
+  rules:
+    - if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
+  script:
+    - R -q -e 'remotes::update_packages("pkgdown")'
+    - R -q -e 'pkgdown::build_site(override = list(destination = "public")'
+  artifacts:
+    paths:
+      - public