diff --git a/.gitlab/ci/build-images.gitlab-ci.yml b/.gitlab/ci/build-images.gitlab-ci.yml
index 1b041c9af38bb8a39daba9e80a8bf1d9f3d9f19e..3c7056a92c1c899ca39a41e7d89cf9742143f874 100644
--- a/.gitlab/ci/build-images.gitlab-ci.yml
+++ b/.gitlab/ci/build-images.gitlab-ci.yml
@@ -15,27 +15,7 @@ build-qa-image:
   stage: build-images
   needs: []
   script:
-    # Tag with commit SHA by default
-    - export QA_IMAGE="${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_SHA}"
-    # For branches, tag with slugified branch name. For tags, use the tag directly
-    - export QA_IMAGE_BRANCH="${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_TAG:-$CI_COMMIT_REF_SLUG}"
-    # Auto-deploy tag format uses first 12 letters of commit SHA. Tag with that
-    # reference also
-    - export QA_IMAGE_FOR_AUTO_DEPLOY="${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_SHA:0:11}"
-    - echo $QA_IMAGE
-    - echo $QA_IMAGE_BRANCH
-    - echo $QA_IMAGE_FOR_AUTO_DEPLOY
-    - |
-      /kaniko/executor \
-        --context=${CI_PROJECT_DIR} \
-        --dockerfile=${CI_PROJECT_DIR}/qa/Dockerfile \
-        --destination=${QA_IMAGE} \
-        --destination=${QA_IMAGE_BRANCH} \
-        --destination=${QA_IMAGE_FOR_AUTO_DEPLOY} \
-        --build-arg=CHROME_VERSION=${CHROME_VERSION} \
-        --build-arg=DOCKER_VERSION=${DOCKER_VERSION} \
-        --build-arg=QA_BUILD_TARGET=${QA_BUILD_TARGET:-qa} \
-        --cache=true
+    - ./scripts/build_qa_image
 
 # This image is used by:
 # - The `CNG` pipelines (via the `review-build-cng` job): https://gitlab.com/gitlab-org/build/CNG/-/blob/cfc67136d711e1c8c409bf8e57427a644393da2f/.gitlab-ci.yml#L335
diff --git a/scripts/build_qa_image b/scripts/build_qa_image
new file mode 100755
index 0000000000000000000000000000000000000000..f4ecb8ed6b6f35d6842d229b3d720f0988df601e
--- /dev/null
+++ b/scripts/build_qa_image
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+QA_IMAGE_NAME="gitlab-ee-qa"
+
+if [ "${CI_PROJECT_NAME}" == "gitlabhq" ] || [ "${CI_PROJECT_NAME}" == "gitlab-foss" ]; then
+  QA_IMAGE_NAME="gitlab-ce-qa"
+fi
+
+# Tag with commit SHA by default
+QA_IMAGE="${CI_REGISTRY}/${CI_PROJECT_PATH}/${QA_IMAGE_NAME}:${CI_COMMIT_SHA}"
+# For branches, tag with slugified branch name. For tags, use the tag directly
+QA_IMAGE_BRANCH="${CI_REGISTRY}/${CI_PROJECT_PATH}/${QA_IMAGE_NAME}:${CI_COMMIT_TAG:-$CI_COMMIT_REF_SLUG}"
+
+DESTINATIONS="--destination=${QA_IMAGE} --destination=${QA_IMAGE_BRANCH}"
+
+# Auto-deploy tag format uses first 12 letters of commit SHA. Tag with that
+# reference also for EE images.
+if [ "${QA_IMAGE_NAME}" == "gitlab-ee-qa" ]; then
+  QA_IMAGE_FOR_AUTO_DEPLOY="${CI_REGISTRY}/${CI_PROJECT_PATH}/${QA_IMAGE_NAME}:${CI_COMMIT_SHA:0:11}"
+  DESTINATIONS="${DESTINATIONS} --destination=$QA_IMAGE_FOR_AUTO_DEPLOY"
+fi
+
+echo "Building QA image for destinations: ${DESTINATIONS}"
+
+/kaniko/executor \
+  --context="${CI_PROJECT_DIR}" \
+  --dockerfile="${CI_PROJECT_DIR}/qa/Dockerfile" \
+  --build-arg=CHROME_VERSION="${CHROME_VERSION}" \
+  --build-arg=DOCKER_VERSION="${DOCKER_VERSION}" \
+  --build-arg=QA_BUILD_TARGET="${QA_BUILD_TARGET:-qa}" \
+  --cache=true \
+  ${DESTINATIONS}