diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d7fd09c5e37aa0c08ede46853d162588d24fe906..c42023f27fb58ed86f45d5d30570641fba4aa856 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -127,4 +127,27 @@ build:python3.11-dbg:
   script: *script
   artifacts: *artifacts
 
+build:python3.12:
+  stage: build
+  image: "ubuntu:noble"
+  variables:
+    ci_distro: ubuntu
+    ci_suite: noble
+    dbus_ci_system_python: python3.12
+  script: *script
+  artifacts: *artifacts
+
+build:python3.12-dbg:
+  stage: build
+  image: "ubuntu:noble"
+  variables:
+    ci_distro: ubuntu
+    ci_suite: noble
+    dbus_ci_system_python: python3.12-dbg
+    dbus_ci_system_python_module_suffix: ''
+  script: *script
+  artifacts: *artifacts
+  # assertion failure in import-repeatedly needs investigating
+  when: manual
+
 # vim:set sw=2 sts=2 et:
diff --git a/tools/ci-install.sh b/tools/ci-install.sh
index 03ec19b661a6f80f508a1ded081bd486bbf5dc71..300bf65f8c0263e9f12e4613d587453f085b0a82 100755
--- a/tools/ci-install.sh
+++ b/tools/ci-install.sh
@@ -54,7 +54,7 @@ fi
 have_system_meson=
 
 if [ -n "${dbus_ci_system_python-}" ]; then
-    if [ -z "${dbus_ci_system_python_module_suffix-}" ]; then
+    if [ -z "${dbus_ci_system_python_module_suffix+set}" ]; then
         case "$dbus_ci_system_python}" in
             (*-dbg)
                 dbus_ci_system_python_module_suffix=-dbg