diff --git a/.gitlab/ci/build-images.gitlab-ci.yml b/.gitlab/ci/build-images.gitlab-ci.yml
index 09ffc87f087029a985174a8b3cb137187e0e6870..05748cff266e1db0539e6cdbe97535b16471d73f 100644
--- a/.gitlab/ci/build-images.gitlab-ci.yml
+++ b/.gitlab/ci/build-images.gitlab-ci.yml
@@ -23,6 +23,11 @@ build-qa-image:
   script:
     - run_timed_command "scripts/build_qa_image"
 
+build-qa-image as-if-foss:
+  extends:
+    - build-qa-image
+    - .as-if-foss
+
 build-assets-image:
   extends:
     - .base-image-build
diff --git a/.gitlab/ci/global.gitlab-ci.yml b/.gitlab/ci/global.gitlab-ci.yml
index 5e35ae6aff3ca64e3f0f083d4e6d6794a2f6c06b..d2312e335ad98529a3299a14948c976ae07bdeb6 100644
--- a/.gitlab/ci/global.gitlab-ci.yml
+++ b/.gitlab/ci/global.gitlab-ci.yml
@@ -350,7 +350,7 @@
   variables:
     QEMU_IMAGE: tonistiigi/binfmt:qemu-v7.0.0
   before_script:
-    - source scripts/utils.sh
+    - !reference [.default-utils-before_script, before_script]
     - echo "$CI_REGISTRY_PASSWORD" | docker login "$CI_REGISTRY" -u "$CI_REGISTRY_USER" --password-stdin
     - |
       if [[ "${ARCH}" =~ arm64 ]]; then
diff --git a/scripts/build_qa_image b/scripts/build_qa_image
index 3728608e32cfa36204a587ba0f5bb68c4dcab95c..c0001181a516414a0241c84b177d132dfef62e70 100755
--- a/scripts/build_qa_image
+++ b/scripts/build_qa_image
@@ -3,7 +3,7 @@
 QA_IMAGE_NAME="gitlab-ee-qa"
 QA_BUILD_TARGET="ee"
 
-if [[ "${CI_PROJECT_NAME}" == "gitlabhq" || "${CI_PROJECT_NAME}" == "gitlab-foss" ]]; then
+if [[ "${CI_PROJECT_NAME}" == "gitlabhq" || "${CI_PROJECT_NAME}" == "gitlab-foss" || "${FOSS_ONLY}" == "1" ]]; then
   QA_IMAGE_NAME="gitlab-ce-qa"
   QA_BUILD_TARGET="foss"
 fi
@@ -28,7 +28,7 @@ if [ "${QA_IMAGE_NAME}" == "gitlab-ee-qa" ]; then
   DESTINATIONS="${DESTINATIONS} --tag $QA_IMAGE_FOR_AUTO_DEPLOY"
 fi
 
-echo "Building QA image for destinations: ${DESTINATIONS}"
+echo "Building QA image for '${QA_BUILD_TARGET}' for destinations: ${DESTINATIONS}"
 
 docker buildx build \
   --cache-to=type=inline \