diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 104c43795569ff6ccc50b91c7e489a8ff96c96e5..d9594f3c169b37db811f5a28c7ea8172a165fb4b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -184,6 +184,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.