diff --git a/tools/ci/gitlab-ci/arm_cross_compile.yml b/tools/ci/gitlab-ci/arm_cross_compile.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b021f87a1868da3b6c40711f19a21ff2ce425154
--- /dev/null
+++ b/tools/ci/gitlab-ci/arm_cross_compile.yml
@@ -0,0 +1,5 @@
+.use-debian/arm64_build:
+  extends:
+    - .use-debian/x86_64_build
+  needs:
+    - job: debian/x86_64_build
diff --git a/tools/ci/gitlab-ci/arm_native_compile.yml b/tools/ci/gitlab-ci/arm_native_compile.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c77d97123d3e1e1971da6ea058c85d6f312c492b
--- /dev/null
+++ b/tools/ci/gitlab-ci/arm_native_compile.yml
@@ -0,0 +1,16 @@
+debian/arm64_build:
+  extends:
+    - .debian-arm64
+    - .fdo.container-build@debian
+  tags:
+    - aarch64
+  stage: container
+
+.use-debian/arm64_build:
+  tags:
+    - aarch64
+  extends:
+    - .debian-arm64
+    - .fdo.suffixed-image@debian
+  needs:
+    - job: debian/arm64_build
diff --git a/tools/ci/gitlab-ci/build.yml b/tools/ci/gitlab-ci/build.yml
index 1b466772f729ba7bd4819b2e217ccf9add91155c..7591ee43539e136498626a174123042d69b3f6ea 100644
--- a/tools/ci/gitlab-ci/build.yml
+++ b/tools/ci/gitlab-ci/build.yml
@@ -16,16 +16,19 @@ build:x86_64:
   extends:
   - .use-debian/x86_64_build
   - .build-common
+  - .x86_64-config
 
 build:arm64:
   extends:
   - .use-debian/arm64_build
   - .build-common
+  - .arm64-config
 
 build:arm32:
   extends:
-  - .use-debian/arm32_build
+  - .use-debian/arm64_build
   - .build-common
+  - .arm32-config
 
 build-docs:
   extends:
diff --git a/tools/ci/gitlab-ci/ci-scripts/ici-functions.sh b/tools/ci/gitlab-ci/ci-scripts/ici-functions.sh
index df133b4d001039b807e32f8100e48b11c55442e0..6b769be4de834493819e842f151448f177db7bfb 100644
--- a/tools/ci/gitlab-ci/ci-scripts/ici-functions.sh
+++ b/tools/ci/gitlab-ci/ci-scripts/ici-functions.sh
@@ -37,8 +37,10 @@ ici_prepare_build() {
         GCC_ARCH="x86_64-linux-gnu"
     fi
 
-    # do not set ARCH and CROSS_COMPILE if KCI_KERNEL_ARCH is not set, useful for local run
-    if [ -n "$KCI_KERNEL_ARCH" ]; then
+    # Set ARCH and CROSS_COMPILE if:
+    # - The kernel architecture is "arm" (default cross-compilation case), or
+    # - The CI server host is not "gitlab.freedesktop.org"
+    if [[ "$KCI_KERNEL_ARCH" = "arm" ]] || [[ "$CI_SERVER_HOST" != "gitlab.freedesktop.org" ]]; then
         export ARCH=${KCI_KERNEL_ARCH}
         export CROSS_COMPILE="${GCC_ARCH}-"
     fi
diff --git a/tools/ci/gitlab-ci/container.yml b/tools/ci/gitlab-ci/container.yml
index efe15dbfd29f9a0ce51b4e5e24e35de79f11a5fc..16b42f9aec2b0e7305afa1eee4baf19436d5cb4a 100644
--- a/tools/ci/gitlab-ci/container.yml
+++ b/tools/ci/gitlab-ci/container.yml
@@ -2,6 +2,14 @@
 #
 # Copyright (C) 2024 Collabora, Helen Koike <helen.koike@collabora.com>
 
+include:
+  - local: 'tools/ci/gitlab-ci/arm_native_compile.yml'
+    rules:
+      - if: '$CI_SERVER_HOST == "gitlab.freedesktop.org"'
+  - local: 'tools/ci/gitlab-ci/arm_cross_compile.yml'
+    rules:
+      - if: '$CI_SERVER_HOST != "gitlab.freedesktop.org"'
+
 variables:
   FDO_REPO_SUFFIX: "$BUILD_OS/$KCI_BUILD_ARCH"
   FDO_DISTRIBUTION_TAG: "2024-12-24-debian"
@@ -25,45 +33,40 @@ variables:
       latexmk librsvg2-bin texlive-lang-chinese texlive-xetex meson libdrm-dev
       curl virtme-ng udev
 
-.debian-x86_64:
-  extends:
-    - .debian
+.x86_64-config:
   variables:
-    KCI_BUILD_ARCH: "x86-64"
     KCI_KERNEL_ARCH: "x86_64"
     KCI_DEFCONFIG: "x86_64_defconfig"
     KCI_KERNEL_IMAGE_NAME: "bzImage"
 
-.debian-arm64:
-  extends:
-    - .debian
+.arm64-config:
   variables:
-    KCI_BUILD_ARCH: "arm64"
     KCI_KERNEL_ARCH: "arm64"
     KCI_DEFCONFIG: "defconfig"
     KCI_KERNEL_IMAGE_NAME: "Image"
 
-.debian-arm32:
-  extends:
-    - .debian
+.arm32-config:
   variables:
-    KCI_BUILD_ARCH: "arm64"
     KCI_KERNEL_ARCH: "arm"
     KCI_DEFCONFIG: "multi_v7_defconfig"
     KCI_KERNEL_IMAGE_NAME: "zImage"
 
-debian/x86_64_build:
+.debian-x86_64:
   extends:
-    - .debian-x86_64
-    - .fdo.container-build@debian
-  stage: container
+    - .debian
+  variables:
+    KCI_BUILD_ARCH: "x86-64"
 
-debian/arm64_build:
+.debian-arm64:
+  extends:
+    - .debian
+  variables:
+    KCI_BUILD_ARCH: "arm64"
+
+debian/x86_64_build:
   extends:
-    - .debian-arm64
+    - .debian-x86_64
     - .fdo.container-build@debian
-  tags:
-    - aarch64
   stage: container
 
 .use-debian/x86_64_build:
@@ -72,21 +75,3 @@ debian/arm64_build:
     - .fdo.suffixed-image@debian
   needs:
     - job: debian/x86_64_build
-
-.use-debian/arm64_build:
-  tags:
-    - aarch64
-  extends:
-    - .debian-arm64
-    - .fdo.suffixed-image@debian
-  needs:
-    - job: debian/arm64_build
-
-.use-debian/arm32_build:
-  tags:
-    - aarch64
-  extends:
-    - .debian-arm32
-    - .fdo.suffixed-image@debian
-  needs:
-    - job: debian/arm64_build
diff --git a/tools/ci/gitlab-ci/gitlab-ci.yml b/tools/ci/gitlab-ci/gitlab-ci.yml
index eb045067cf13f7b091fcbd05c7ec70f7de835365..d2679d9929de14dfeb81064ef1f3334a46581577 100644
--- a/tools/ci/gitlab-ci/gitlab-ci.yml
+++ b/tools/ci/gitlab-ci/gitlab-ci.yml
@@ -36,6 +36,9 @@ variables:
   SMATCH_DB_DIR: /smatch/smatch_data
   # exit code of bash script on `script` will be the exit code of the job
   FF_USE_NEW_BASH_EVAL_STRATEGY: "true"
+  KCI_SCENARIO:
+    description: Set to any non-empty value to disable scenarios
+    value: ""
 
 default:
   artifacts:
diff --git a/tools/ci/gitlab-ci/scenarios/drm/drm.yml b/tools/ci/gitlab-ci/scenarios/drm/drm.yml
index bca0cd403d8fcc75179037670783221942b724d8..5db56f7c4332e039601cca8e33c7525ed69199e2 100644
--- a/tools/ci/gitlab-ci/scenarios/drm/drm.yml
+++ b/tools/ci/gitlab-ci/scenarios/drm/drm.yml
@@ -12,40 +12,31 @@ build:x86_64:
   variables:
     KCI_KCONFIGS_ENABLE: "DRM_VKMS DRM_BOCHS"
 
-# Build IGT for testing on devices
-# TODO: Fix cross compilation issue
-.igt:arm32:
-  extends:
-    - .use-debian/arm64_build
-    - build:arm32
+.igt:
+  stage: build
   script:
     - FDO_CI_CONCURRENT=${FDO_CI_CONCURRENT} bash ./tools/ci/gitlab-ci/scenarios/drm/build-igt.sh
-  stage: build
   artifacts:
     when: always
     paths:
       - artifacts/
 
+# Build IGT for testing on devices
+# TODO: Fix cross compilation issue
+.igt:arm32:
+  extends:
+    - .arm32-config
+    - .use-debian/arm64_build
+    - .igt
+
 igt:arm64:
   extends:
+    - .arm64-config
     - .use-debian/arm64_build
-    - build:arm64
-  script:
-    - FDO_CI_CONCURRENT=${FDO_CI_CONCURRENT} bash ./tools/ci/gitlab-ci/scenarios/drm/build-igt.sh
-  stage: build
-  artifacts:
-    when: always
-    paths:
-      - artifacts/
+    - .igt
 
 igt:x86_64:
   extends:
+    - .x86_64-config
     - .use-debian/x86_64_build
-    - build:x86_64
-  script:
-    - FDO_CI_CONCURRENT=${FDO_CI_CONCURRENT} bash ./tools/ci/gitlab-ci/scenarios/drm/build-igt.sh
-  stage: build
-  artifacts:
-    when: always
-    paths:
-      - artifacts/
+    - .igt
diff --git a/tools/ci/gitlab-ci/static-checks.yml b/tools/ci/gitlab-ci/static-checks.yml
index 7b611b047d9708fe818a7c10075ea8941d007bc7..656802fd8fb6612c03b4db07eaf506333165675a 100644
--- a/tools/ci/gitlab-ci/static-checks.yml
+++ b/tools/ci/gitlab-ci/static-checks.yml
@@ -6,6 +6,7 @@
   stage: static-checks
   extends:
     - .use-debian/x86_64_build
+    - .x86_64-config
 
 checkpatch:
   extends: .static-checks