diff --git a/.zuul.yaml b/.zuul.yaml
index 4b690ef..02e4974 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -38,7 +38,7 @@
       - python-builder-3.11-bullseye-container-image
       - python-base-3.11-bullseye-container-image
     provides: zuul-registry-container-image
-    nodeset: ubuntu-jammy
+    nodeset: ubuntu-noble
     vars: &image_vars
       promote_container_image_method: intermediate-registry
       promote_container_image_job: zuul-registry-upload-image
@@ -60,7 +60,7 @@
     allowed-projects: zuul/zuul-registry
     run: playbooks/functional-test/run.yaml
     post-run: playbooks/functional-test/post.yaml
-    nodeset: ubuntu-jammy
+    nodeset: ubuntu-noble
     secrets:
       name: container_registry_credentials
       secret: zuul-registry-registry-credentials
@@ -95,6 +95,8 @@
             nodeset: ubuntu-focal
         - nox-py311:
             nodeset: ubuntu-jammy
+        - nox-py312:
+            nodeset: ubuntu-noble
         - build-python-release
     gate:
       jobs:
@@ -104,6 +106,8 @@
             nodeset: ubuntu-focal
         - nox-py311:
             nodeset: ubuntu-jammy
+        - nox-py312:
+            nodeset: ubuntu-noble
         - build-python-release
     promote:
       jobs:
diff --git a/playbooks/functional-test/run.yaml b/playbooks/functional-test/run.yaml
index 980e415..657f420 100644
--- a/playbooks/functional-test/run.yaml
+++ b/playbooks/functional-test/run.yaml
@@ -18,6 +18,11 @@
     - name: Install extra packages
       package:
         name:
+          # Explicitly install python3-setuptools for docker-compose
+          # docker-compose relies on distutils which is not included in
+          # python3 with 3.12 or newer and the package doesn't list an
+          # explicit dependency.
+          - python3-setuptools
           - docker-compose
           - openssl
           - skopeo