diff --git a/.gitlab-ci/test-lc-compliance.sh b/.gitlab-ci/test-lc-compliance.sh
new file mode 100755
index 0000000..e6697a6
--- /dev/null
+++ b/.gitlab-ci/test-lc-compliance.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+set -e
+
+source "$(dirname "$0")/lib.sh"
+
+libcamera_compliance() {
+	echo "Running libcamera compliance tests in a qemu VM"
+
+	virtme-ng \
+		--verbose \
+		--skip-modules \
+		--force-9p \
+		--rwdir "$PWD/build" \
+		--run /opt/linux/bzImage \
+		--exec "LIBCAMERA_LOG_LEVELS=*:DEBUG ./build/src/apps/lc-compliance/lc-compliance -c Virtual0; echo \\\$? > ./build/.test-status"
+
+	local status=$(cat build/.test-status)
+	echo "Test result exit state: $status"
+	rm build/.test-status
+
+	if [[ $status != 0 ]] ; then
+		exit $status
+	fi
+}
+
+run libcamera_compliance
diff --git a/gitlab-ci.yml b/gitlab-ci.yml
index c7448b8..5e9e309 100644
--- a/gitlab-ci.yml
+++ b/gitlab-ci.yml
@@ -382,9 +382,10 @@ build-test:debug:
       -D cam=disabled
       -D cpp_debugstl=true
       -D documentation=disabled
+      -D force_fallback_for=gtest
       -D gstreamer=enabled
-      -D lc-compliance=disabled
-      -D pipelines=[]
+      -D lc-compliance=enabled
+      -D pipelines=virtual
       -D pycamera=enabled
       -D qcam=disabled
       -D test=true
@@ -420,3 +421,16 @@ test-unit:
   # artifacts:
   #   reports:
   #     junit: build/meson-logs/testlog.junit.xml
+
+lc-compliance:virtual:
+  extends:
+    - .fdo.distribution-image@debian
+    - .libcamera-ci.debian:12
+    - .libcamera-ci.scripts
+  stage: test
+  needs:
+    - job: build-test:debug
+  tags:
+    - kvm
+  script:
+    - $CI_PROJECT_DIR/.gitlab-ci/test-lc-compliance.sh
