diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8105d45dd3172bc094b8187c1e97096add893130..0b9a48b37bd7965f68f6e5c614980894f1cd1e5c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -180,6 +180,17 @@ test_clang_format:
     - ninja -C build-clang-format clang-format-check
   needs: []
 
+test_clang_tidy:
+  stage: test
+  script:
+    # Hack needed for meson < 1.6.0 which only looks for unversioned clang-tidy
+    - mkdir -p ~/.local/bin && ln -s /usr/bin/clang-tidy-16 ~/.local/bin/clang-tidy
+    - export PATH="$HOME/.local/bin:$PATH"
+    - meson setup -Dbuild_for=octave build-clang-tidy
+    - ninja -C build-clang-tidy clang-tidy
+  needs: []
+  when: manual
+
 # For the sign and deploy jobs, we don’t use the “needs” keyword, since we
 # don’t want those jobs to start before the “test” and “pkg” stages have
 # succeeded. Hence we stick to the “dependencies” keyword.