diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f1a37833bb4ff0b1c79c9cb1def8d79116fb1b9b..5fee114c58848d7fa19cb326cbd95a0015711592 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -46,3 +46,4 @@ include:
   - local: '/scripts/ci/jobs/tests-large.yml'
   - local: '/scripts/ci/jobs/web.yml'
   - local: '/scripts/ci/jobs/clang-sanitizer.yml'
+  - local: '/scripts/ci/jobs/clang-tidy.yml'
diff --git a/scripts/ci/jobs/clang-tidy.yml b/scripts/ci/jobs/clang-tidy.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1812adc0189f8ff227999edac6f493dcb13f7cb0
--- /dev/null
+++ b/scripts/ci/jobs/clang-tidy.yml
@@ -0,0 +1,30 @@
+clang tidy:
+  stage: checks
+  tags:
+    - docker
+  extends:
+    - .defaults
+    - .rules-master-manual
+
+  variables:
+    BUILD_DIR: "build-tidy"
+    CMAKE_ARGS: "-DBUILD_SHARED_LIBS=ON -DBUILD_TESTING=OFF -DCMAKE_CXX_CLANG_TIDY=clang-tidy-9"
+
+  image:
+    name: $CONTAINER_CLANG_IMAGE
+
+  script:
+    - mkdir -p $BUILD_DIR
+    - cd $BUILD_DIR
+    - >
+      cmake .. -G Ninja
+      $CMAKE_ARGS
+      -DCMAKE_BUILD_TYPE=$BUILD_TYPE
+      -DOGS_BUILD_PROCESSES=$BUILD_PROCESSES
+    - cmake --build . > >(tee make.output)
+
+  artifacts:
+    # No report yet: https://gitlab.com/gitlab-org/gitlab/-/issues/3985
+    paths:
+      - $BUILD_DIR/make.output
+    expire_in: 1 week