#!/bin/bash function is_latest_stable_tag() { [ "$(latest_stable_tag)" == "${CI_COMMIT_TAG}" ] } function is_latest_tag() { [ "$(latest_tag)" == "${CI_COMMIT_TAG}" ] } function latest_tag() { git -c versionsort.prereleaseSuffix=rc tag --sort=-v:refname | head -1 } function latest_stable_tag() { git -c versionsort.prereleaseSuffix=rc tag --sort=-v:refname | awk '!/rc/' | head -1 } function version_file_content() { cat "${CI_PROJECT_DIR}/VERSION" 2>/dev/null || echo "" } if [[ "${CI_PROJECT_NAME}" == "gitlabhq" || "${CI_PROJECT_NAME}" == "gitlab-foss" || "${FOSS_ONLY}" == "1" ]]; then QA_IMAGE_NAME="gitlab-ce-qa" QA_BUILD_TARGET="foss" # Build QA Image for JH project elif [[ "${CI_PROJECT_PATH}" =~ ^gitlab-(jh|cn)\/.*$ || "${CI_PROJECT_NAME}" =~ ^gitlab-jh ]]; then QA_IMAGE_NAME="gitlab-jh-qa" QA_BUILD_TARGET="jhqa" else QA_IMAGE_NAME="gitlab-ee-qa" QA_BUILD_TARGET="ee" fi BASE_IMAGE_PATH="${CI_REGISTRY}/${CI_PROJECT_PATH}/${QA_IMAGE_NAME}" # Tag with commit SHA by default QA_IMAGE="${BASE_IMAGE_PATH}:${CI_COMMIT_SHA}" # For branches, tag with slugified branch name. For tags, use the tag directly # with v prefix removed IMAGE_TAG=${CI_COMMIT_TAG#v} IMAGE_TAG=${IMAGE_TAG:-$CI_COMMIT_REF_SLUG} QA_IMAGE_BRANCH="${BASE_IMAGE_PATH}:${IMAGE_TAG}" QA_IMAGE_MASTER="${BASE_IMAGE_PATH}:master" DESTINATIONS="--tag ${QA_IMAGE} --tag ${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="${BASE_IMAGE_PATH}:${CI_COMMIT_SHA:0:11}" DESTINATIONS="${DESTINATIONS} --tag $QA_IMAGE_FOR_AUTO_DEPLOY" fi # Build QA image for Internal release # - If QA_IMAGE_NAME is "gitlab-ee-qa" and CI_REGISTRY is "dev.gitlab.org:5005" # - If the content of VERSION file includes the string "internal" # - If CI_COMMIT_TITLE is "Update VERSION files" # Then set DESTINATIONS to the content of VERSION file if [[ "${QA_IMAGE_NAME}" == "gitlab-ee-qa" ]] && \ [[ "${CI_REGISTRY}" == "dev.gitlab.org:5005" ]] && \ [[ "$CI_COMMIT_TITLE" =~ ^Update\ VERSION\ file\ for.*internal ]]; then QA_IMAGE_FOR_INTERNAL_RELEASE="${BASE_IMAGE_PATH}:$(version_file_content)" DESTINATIONS="${DESTINATIONS} --tag ${QA_IMAGE_FOR_INTERNAL_RELEASE}" fi # On tag pipelines in Canonical projects (gitlab and gitlab-foss), release to # Dockerhub also if [ -n "${CI_COMMIT_TAG}" ] && [ "${CI_PROJECT_NAMESPACE}" == "gitlab-org" ]; then # Temporarily control release to Dockerhub, until we confirm it works in a # release and finally drops the release job from omnibus-gitlab pipeline. if [ "${RELEASE_QA_IMAGE_TO_DOCKERHUB}" == "true" ]; then echo "$DOCKERHUB_PASSWORD" | docker login "docker.io" -u "$DOCKERHUB_USERNAME" --password-stdin DOCKERHUB_TAG_IMAGE="gitlab/${QA_IMAGE_NAME}:${IMAGE_TAG}" DESTINATIONS="${DESTINATIONS} --tag ${DOCKERHUB_TAG_IMAGE}" # If we are on latest tag (RC or stable), tag the image as RC if is_latest_tag; then DESTINATIONS="${DESTINATIONS} --tag gitlab/${QA_IMAGE_NAME}:rc" fi # If we are on latest stable tag, tag the image as latest if is_latest_stable_tag; then DESTINATIONS="${DESTINATIONS} --tag gitlab/${QA_IMAGE_NAME}:latest" fi else echo "RELEASE_QA_IMAGE_TO_DOCKERHUB not set to true. Not releasing to Dockerhub." fi fi echo "Building QA image for '${QA_BUILD_TARGET}' for destinations: ${DESTINATIONS}" if [ "${QA_IMAGE_BUILD_DRY_RUN}" == "true" ]; then exit 0 fi docker buildx build \ --cache-to=type=inline \ --cache-from="$QA_IMAGE_BRANCH" \ --cache-from="$QA_IMAGE_MASTER" \ --platform=${ARCH:-amd64} \ --build-arg=BUILD_OS="${BUILD_OS}" \ --build-arg=CHROME_VERSION="${CHROME_VERSION}" \ --build-arg=DOCKER_VERSION="${DOCKER_VERSION}" \ --build-arg=GCLOUD_VERSION="${GCLOUD_VERSION}" \ --build-arg=GIT_VERSION="${GIT_VERSION}" \ --build-arg=HELM_VERSION="${HELM_VERSION}" \ --build-arg=KUBECTL_VERSION="${KUBECTL_VERSION}" \ --build-arg=LFS_VERSION="${LFS_VERSION}" \ --build-arg=OS_VERSION="${OS_VERSION}" \ --build-arg=QA_BUILD_TARGET="${QA_BUILD_TARGET}" \ --build-arg=RUBY_VERSION="${RUBY_VERSION}" \ --file="${CI_PROJECT_DIR}/qa/Dockerfile" \ --push \ --provenance=false \ ${DESTINATIONS} \ ${CI_PROJECT_DIR}