Build arm64 images by default and additionally do not require docker buildx for simple builds

This commit is contained in:
Kamil Trzciński 2022-10-28 07:38:23 +00:00 committed by Andrejs Cunskis
parent 66c6656f97
commit f6a1f0e63f
12 changed files with 128 additions and 84 deletions

View file

@ -1,5 +1,5 @@
.install-qemu:
timeout: 2 hours # builds with emulation can take a long time to complete
timeout: 4 hours # builds with emulation can take a long time to complete
tags:
- docker
- high-cpu

View file

@ -8,6 +8,7 @@ gitlab:
LFS: '2.9'
YARN: '1.22'
GRAPHICSMAGICK: '1.3.36'
ARCH: linux/amd64,linux/arm64
parallel:
matrix:
- OS: ['debian:bullseye']
@ -28,6 +29,7 @@ gitlab-assets:
LFS: '2.9'
YARN: '1.22'
GRAPHICSMAGICK: '1.3.36'
ARCH: amd64,arm64
parallel:
matrix:
- OS: ['debian:bullseye']

View file

@ -35,13 +35,13 @@ RUN if [ -n "$GIT_VERSION" ]; then /scripts/install-git && git --version; fi
# Chrome
ARG CHROME_VERSION
RUN if [ -n "$CHROME_VERSION" ]; then /scripts/install-chrome $CHROME_VERSION && ( google-chrome --version || chromium --version ); fi
RUN if [ -n "$CHROME_VERSION" ]; then /scripts/install-chrome "$CHROME_VERSION" && ( google-chrome --version || chromium --version ); fi
# NodeJS and Yarn
ARG NODE_INSTALL_VERSION
ARG YARN_INSTALL_VERSION
RUN if [ -n "$NODE_INSTALL_VERSION" ] ; then /scripts/install-node $NODE_INSTALL_VERSION $YARN_INSTALL_VERSION && node --version && yarn --version; fi
RUN if [ -n "$NODE_INSTALL_VERSION" ] ; then /scripts/install-node "$NODE_INSTALL_VERSION" "$YARN_INSTALL_VERSION" && node --version && yarn --version; fi
# Golang
ARG INSTALL_GOLANG_VERSION
@ -58,7 +58,7 @@ RUN if [ -n "$LFS_VERSION" ]; then /scripts/install-lfs && git lfs --version; fi
# Postgres
ARG POSTGRES_VERSION
RUN if [ -n "$POSTGRES_VERSION" ] ; then /scripts/install-postgresql $POSTGRES_VERSION; fi
RUN if [ -n "$POSTGRES_VERSION" ] ; then /scripts/install-postgresql "$POSTGRES_VERSION"; fi
# GraphicsMagick
ARG GRAPHISMAGICK_VERSION
@ -70,36 +70,36 @@ RUN if [ -n "$GRAPHISMAGICK_VERSION" ]; then /scripts/install-graphicsmagick &&
# Docker
ARG DOCKER_VERSION
RUN if [ -n "$DOCKER_VERSION" ]; then /scripts/install-docker $DOCKER_VERSION; fi
RUN if [ -n "$DOCKER_VERSION" ]; then /scripts/install-docker "$DOCKER_VERSION"; fi
# Docker buildx plugin
ARG BUILDX_VERSION
ARG BUILDX_DOWNLOAD_SHA256
RUN if [ -n "$BUILDX_VERSION" ]; then /scripts/install-buildx $BUILDX_VERSION $BUILDX_DOWNLOAD_SHA256; fi
RUN if [ -n "$BUILDX_VERSION" ]; then /scripts/install-buildx "$BUILDX_VERSION" "$BUILDX_DOWNLOAD_SHA256"; fi
# Bazelisk
ARG BAZELISK_VERSION
ARG BAZELISK_DOWNLOAD_SHA256
RUN if [ -n "$BAZELISK_VERSION" ] ; then /scripts/install-bazelisk $BAZELISK_VERSION $BAZELISK_DOWNLOAD_SHA256; fi
RUN if [ -n "$BAZELISK_VERSION" ] ; then /scripts/install-bazelisk "$BAZELISK_VERSION" "$BAZELISK_DOWNLOAD_SHA256"; fi
# Google-cloud-sdk
ARG GCLOUD_VERSION
RUN if [ -n "$GCLOUD_VERSION" ] ; then /scripts/install-gcloud $GCLOUD_VERSION; fi
RUN if [ -n "$GCLOUD_VERSION" ] ; then /scripts/install-gcloud "$GCLOUD_VERSION"; fi
# Kubectl
ARG KUBECTL_VERSION
ARG KUBECTL_DOWNLOAD_SHA256
RUN if [ -n "$KUBECTL_VERSION" ] ; then /scripts/install-kubectl $KUBECTL_VERSION $KUBECTL_DOWNLOAD_SHA256; fi
RUN if [ -n "$KUBECTL_VERSION" ] ; then /scripts/install-kubectl "$KUBECTL_VERSION" "$KUBECTL_DOWNLOAD_SHA256"; fi
# Helm
ARG HELM_VERSION
ARG HELM_DOWNLOAD_SHA256
RUN if [ -n "$HELM_VERSION" ] ; then /scripts/install-helm $HELM_VERSION $HELM_DOWNLOAD_SHA256; fi
RUN if [ -n "$HELM_VERSION" ] ; then /scripts/install-helm "$HELM_VERSION" "$HELM_DOWNLOAD_SHA256"; fi
RUN /scripts/generate-locale
ENV LANG=C.UTF-8 \

22
scripts/download-file Executable file
View file

@ -0,0 +1,22 @@
#!/bin/bash
if [[ $# -lt 3 ]]; then
echo "usage: $0 <file> <url> <checksum(s)...>" 1>&2
exit 1
fi
set -xeou pipefail
FILE="$1"
URL="$2"
shift 2
curl --retry 6 -fsSL "$URL" -o "$FILE"
for checksum; do
if echo "${checksum} ${FILE}" | sha256sum -c -; then
exit 0
fi
done
exit 1

View file

@ -6,8 +6,7 @@ BUILDX_VERSION=${1}
BUILDX_DOWNLOAD_SHA256=${2}
BUILDX_DOWNLOAD_URL="https://github.com/docker/buildx/releases/download/v${BUILDX_VERSION}/buildx-v${BUILDX_VERSION}.linux-${TARGETARCH:-amd64}"
curl -fsSL "${BUILDX_DOWNLOAD_URL}" -o docker-buildx
echo "${BUILDX_DOWNLOAD_SHA256} docker-buildx" | sha256sum -c -
/scripts/download-file docker-buildx "$BUILDX_DOWNLOAD_URL" $BUILDX_DOWNLOAD_SHA256
mkdir -p /usr/local/lib/docker/cli-plugins
chmod +x docker-buildx && mv docker-buildx /usr/local/lib/docker/cli-plugins/

View file

@ -10,7 +10,9 @@ function build_debian() {
if [ "${ARCH}" == "amd64" ]; then
PKG=google-chrome-stable
else
PKG=chromium
# TODO: We do not yet have all packages required for platform other than amd64
apt install -y chromium chromium-driver
return
fi
# We hard code the URL rather than using $CI_API_V4_URL $CI_PROJECT_ID,
@ -21,8 +23,7 @@ function build_debian() {
echo "Installing browser"
curl --silent --show-error --fail -O "$BROWSER_URL"
dpkg -i "./${BROWSER_DEB}" || true
apt-get install -f -y
apt install -y "$PWD/$BROWSER_DEB"
rm -f "$BROWSER_DEB"
echo "Installing webdriver"
@ -38,8 +39,7 @@ function build_debian() {
DRIVER_URL="${DOWNLOAD_URL_BASE}/${CHROME_VERSION}/${DRIVER_DEB}"
curl --silent --show-error --fail -O "$DRIVER_URL"
dpkg -i "./${DRIVER_DEB}" || true
apt-get install -f -y
apt install -y "$PWD/$DRIVER_DEB"
rm -f "$DRIVER_DEB"
fi

View file

@ -8,8 +8,7 @@ GOLANG_DOWNLOAD_SHA256=${2}
GOLANG_DOWNLOAD_URL="https://golang.org/dl/go${INSTALL_GOLANG_VERSION}.linux-${TARGETARCH:-amd64}.tar.gz"
function build_debian() {
curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz
echo "${GOLANG_DOWNLOAD_SHA256} golang.tar.gz" | sha256sum -c -
/scripts/download-file golang.tar.gz "$GOLANG_DOWNLOAD_URL" $GOLANG_DOWNLOAD_SHA256
tar -C /usr/local -xzf golang.tar.gz
rm golang.tar.gz
}

View file

@ -6,9 +6,7 @@ HELM_VERSION=${1}
HELM_DOWNLOAD_SHA256=${2}
HELM_DOWNLOAD_URL="https://get.helm.sh/helm-v${HELM_VERSION}-linux-${TARGETARCH:-amd64}.tar.gz"
curl -fsSL "${HELM_DOWNLOAD_URL}" -o helm.tar.gz
echo "${HELM_DOWNLOAD_SHA256} helm.tar.gz" | sha256sum -c -
/scripts/download-file helm.tar.gz "$HELM_DOWNLOAD_URL" $HELM_DOWNLOAD_SHA256
tar -xzf helm.tar.gz --strip-components=1
rm helm.tar.gz

View file

@ -6,8 +6,7 @@ KUBECTL_VERSION=${1}
KUBECTL_DOWNLOAD_SHA256=${2}
KUBECTL_DOWNLOAD_URL="https://dl.k8s.io/release/v${KUBECTL_VERSION}/bin/linux/${TARGETARCH:-amd64}/kubectl"
curl -fsSL "${KUBECTL_DOWNLOAD_URL}" -o kubectl
echo "${KUBECTL_DOWNLOAD_SHA256} kubectl" | sha256sum -c -
/scripts/download-file kubectl "$KUBECTL_DOWNLOAD_URL" $KUBECTL_DOWNLOAD_SHA256
chmod +x kubectl
mv kubectl /usr/local/bin/kubectl

View file

@ -5,12 +5,9 @@ IFS=$'\n\t'
LFS_DOWNLOAD_URL="https://github.com/git-lfs/git-lfs/releases/download/v${LFS_VERSION}/git-lfs-linux-${TARGETARCH:-amd64}-v${LFS_VERSION}.tar.gz"
mkdir build \
&& curl -fsSL "$LFS_DOWNLOAD_URL" -o git-lfs.tar.gz \
&& echo "$LFS_DOWNLOAD_SHA256 git-lfs.tar.gz" | sha256sum -c - \
&& tar -C build -xzf git-lfs.tar.gz \
&& cd build \
&& cp git-lfs /usr/local/bin/ \
&& cd .. \
&& rm -rf build \
&& rm git-lfs.tar.gz
/scripts/download-file git-lfs.tar.gz "$LFS_DOWNLOAD_URL" $LFS_DOWNLOAD_SHA256
mkdir build
tar -C build -xzf git-lfs.tar.gz
cp build/git-lfs /usr/local/bin/
rm -rf build git-lfs.tar.gz

View file

@ -5,12 +5,31 @@ IFS=$'\n\t'
SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
source "$SCRIPT_DIR/custom-docker.sh"
function get_base_image_reference() {
if [[ $1 =~ ^debian ]]; then
echo "$1"
elif [[ $1 =~ ^ubi:8 ]]; then
echo "registry.access.redhat.com/ubi8/$1"
fi
function fail() {
echo "$@" 1>&2
exit 1
}
function print_image_args() {
declare -A CUSTOM_BASE_IMAGE
declare -A BUILD_OS
case "$1:$2" in
debian:*)
CUSTOM_BASE_IMAGE="$1:$2"
BUILD_OS=debian
;;
ubi:8.*)
CUSTOM_BASE_IMAGE="registry.access.redhat.com/ubi8/ubi:$2"
BUILD_OS=ubi
;;
*) fail "Unknown image version $1:$2" ;;
esac
printf -- "--build-arg CUSTOM_BASE_IMAGE=%s " "$CUSTOM_BASE_IMAGE"
printf -- "--build-arg BUILD_OS=%s " "$BUILD_OS"
}
function print_golang_args() {
@ -30,13 +49,13 @@ function print_golang_args() {
1.19)
INSTALL_GOLANG_VERSION=1.19.2
GOLANG_DOWNLOAD_SHA256[amd64]=5e8c5a74fe6470dd7e055a461acda8bb4050ead8c2df70f227e3ff7d8eb7eeb6
GOLANG_DOWNLOAD_SHA256[arm64]=62a8d9654436c67c14a0c91e931d50440541f09eb991a987536cb982903126d
GOLANG_DOWNLOAD_SHA256[arm64]=b62a8d9654436c67c14a0c91e931d50440541f09eb991a987536cb982903126d
;;
*) echo "Unknown golang version $1"; exit 1;
*) fail "Unknown golang version $1" ;;
esac
printf -- "--build-arg INSTALL_GOLANG_VERSION=%s " "$INSTALL_GOLANG_VERSION"
printf -- "--build-arg GOLANG_DOWNLOAD_SHA256=%s " "${GOLANG_DOWNLOAD_SHA256[$TARGETARCH]}"
printf -- "--build-arg GOLANG_DOWNLOAD_SHA256=%q " "${GOLANG_DOWNLOAD_SHA256[*]}"
}
# If you add a new minor version here, be sure to check that the
@ -54,7 +73,7 @@ function print_chrome_args() {
106|106.0)
CHROME_VERSION=106.0.5249.91-1
;;
*) echo "Unknown chrome version $1"; exit 1;
*) fail "Unknown chrome version $1" ;;
esac
printf -- "--build-arg CHROME_VERSION=%s " "$CHROME_VERSION"
}
@ -70,7 +89,7 @@ function print_git_args() {
GIT_VERSION=2.36.1
GIT_DOWNLOAD_SHA256=37d936fd17c81aa9ddd3dba4e56e88a45fa534ad0ba946454e8ce818760c6a2c
;;
*) echo "Unknown git version $1"; exit 1;
*) fail "Unknown git version $1" ;;
esac
case "$GIT_VERSION" in
@ -95,11 +114,11 @@ function print_lfs_args() {
LFS_DOWNLOAD_SHA256[amd64]=2a8e60cf51ec45aa0f4332aa0521d60ec75c76e485d13ebaeea915b9d70ea466
LFS_DOWNLOAD_SHA256[arm64]=ff2f8472a5ac0e808108bad0cc6be5ca1849eb970228b1aa3d627bcbc8228ad9
;;
*) echo "Unknown Git LFS version $1"; exit 1;
*) fail "Unknown Git LFS version $1" ;;
esac
printf -- "--build-arg LFS_VERSION=%s " "$LFS_VERSION"
printf -- "--build-arg LFS_DOWNLOAD_SHA256=%s " "${LFS_DOWNLOAD_SHA256[$TARGETARCH]}"
printf -- "--build-arg LFS_DOWNLOAD_SHA256=%q " "${LFS_DOWNLOAD_SHA256[*]}"
}
function print_node_args() {
@ -107,7 +126,7 @@ function print_node_args() {
14.15) NODE_INSTALL_VERSION=14.15.4 ;;
14|14.16) NODE_INSTALL_VERSION=14.16.0 ;;
16|16.14) NODE_INSTALL_VERSION=16.14.2 ;;
*) echo "Unknown node version $1"; exit 1;
*) fail "Unknown node version $1" ;;
esac
printf -- "--build-arg NODE_INSTALL_VERSION=%s " "$NODE_INSTALL_VERSION"
}
@ -118,7 +137,7 @@ function print_yarn_args() {
1.16) YARN_INSTALL_VERSION=1.16.0 ;;
1.21) YARN_INSTALL_VERSION=1.21.1 ;;
1.22) YARN_INSTALL_VERSION=1.22.17 ;;
*) echo "Unknown yarn version $1"; exit 1;
*) fail "Unknown yarn version $1" ;;
esac
printf -- "--build-arg YARN_INSTALL_VERSION=%s " "$YARN_INSTALL_VERSION"
}
@ -140,11 +159,11 @@ function print_buildx_args() {
BUILDX_DOWNLOAD_SHA256[amd64]=c64de4f3c30f7a73ff9db637660c7aa0f00234368105b0a09fa8e24eebe910c3
BUILDX_DOWNLOAD_SHA256[arm64]=304d3d9822c75f98ad9cf57f0c234bcf326bbb96d791d551728cadd72a7a377f
;;
*) echo "Unknown buildx version $1"; exit 1;
*) fail "Unknown buildx version $1" ;;
esac
printf -- "--build-arg BUILDX_VERSION=%s " "$BUILDX_VERSION"
printf -- "--build-arg BUILDX_DOWNLOAD_SHA256=%s " "${BUILDX_DOWNLOAD_SHA256[$TARGETARCH]}"
printf -- "--build-arg BUILDX_DOWNLOAD_SHA256=%q " "${BUILDX_DOWNLOAD_SHA256[*]}"
}
function print_graphicsmagick_args() {
@ -165,7 +184,7 @@ function print_graphicsmagick_args() {
GRAPHISMAGICK_VERSION=1.3.36
GRAPHISMAGICK_DOWNLOAD_SHA256=1e6723c48c4abbb31197fadf8396b2d579d97e197123edc70a4f057f0533d563
;;
*) echo "Unknown graphicsmagick version $1"; exit 1;
*) fail "Unknown graphicsmagick version $1" ;;
esac
printf -- "--build-arg GRAPHISMAGICK_VERSION=%s " "$GRAPHISMAGICK_VERSION"
@ -178,7 +197,7 @@ function print_bazelisk_args() {
BAZELISK_VERSION=1.9.0
BAZELISK_DOWNLOAD_SHA256=b8c7f2a1b07ad64a2f27f8f19a202f90d044de7b5b6ccc387a6fe5d4a8ec4937
;;
*) echo "Unknown bazelisk version $1"; exit 1;
*) fail "Unknown bazelisk version $1" ;;
esac
printf -- "--build-arg BAZELISK_VERSION=%s " "$BAZELISK_VERSION"
@ -209,7 +228,7 @@ function print_ruby_args() {
RUBY_DOWNLOAD_SHA256="70b47c207af04bce9acea262308fb42893d3e244f39a4abc586920a1c723722b"
;;
*) echo "Unknown ruby version $1"; exit 1;
*) fail "Unknown ruby version $1" ;;
esac
printf -- "--build-arg RUBY_VERSION=%s " "$RUBY_VERSION"
@ -224,7 +243,7 @@ function print_bundler_args() {
2.3)
BUNDLER_VERSION=2.3.15
;;
*) echo "Unknown bundler version $1"; exit 1;
*) fail "Unknown bundler version $1" ;;
esac
printf -- "--build-arg BUNDLER_VERSION=%s " "$BUNDLER_VERSION"
@ -238,7 +257,7 @@ function print_rubygems_args() {
3.2)
RUBYGEMS_VERSION=3.2.33
;;
*) echo "Unknown rubygems version $1"; exit 1;
*) fail "Unknown rubygems version $1" ;;
esac
printf -- "--build-arg RUBYGEMS_VERSION=%s " "$RUBYGEMS_VERSION"
@ -249,7 +268,7 @@ function print_gcloud_args() {
383)
GCLOUD_VERSION=383.0.1
;;
*) echo "Unknown gcloud version $1"; exit 1;
*) fail "Unknown gcloud version $1" ;;
esac
printf -- "--build-arg GCLOUD_VERSION=%s " "$GCLOUD_VERSION"
@ -264,11 +283,11 @@ function print_kubectl_args() {
KUBECTL_DOWNLOAD_SHA256[amd64]=2d0f5ba6faa787878b642c151ccb2c3390ce4c1e6c8e2b59568b3869ba407c4f
KUBECTL_DOWNLOAD_SHA256[arm64]=1d77d6027fc8dfed772609ad9bd68f611b7e4ce73afa949f27084ad3a92b15fe
;;
*) echo "Unknown kubectl version $1"; exit 1;
*) fail "Unknown kubectl version $1" ;;
esac
printf -- "--build-arg KUBECTL_VERSION=%s " "$KUBECTL_VERSION"
printf -- "--build-arg KUBECTL_DOWNLOAD_SHA256=%s " "${KUBECTL_DOWNLOAD_SHA256[$TARGETARCH]}"
printf -- "--build-arg KUBECTL_DOWNLOAD_SHA256=%q " "${KUBECTL_DOWNLOAD_SHA256[*]}"
}
function print_helm_args() {
@ -280,11 +299,11 @@ function print_helm_args() {
HELM_DOWNLOAD_SHA256[amd64]=2170a1a644a9e0b863f00c17b761ce33d4323da64fc74562a3a6df2abbf6cd70
HELM_DOWNLOAD_SHA256[arm64]=e1348d94ce4caace43689ee2dfa5f8bcd8687c12053d9c13d79875b65d6b72aa
;;
*) echo "Unknown helm version $1"; exit 1;
*) fail "Unknown helm version $1" ;;
esac
printf -- "--build-arg HELM_VERSION=%s " "$HELM_VERSION"
printf -- "--build-arg HELM_DOWNLOAD_SHA256=%s " "${HELM_DOWNLOAD_SHA256[$TARGETARCH]}"
printf -- "--build-arg HELM_DOWNLOAD_SHA256=%q " "${HELM_DOWNLOAD_SHA256[*]}"
}
function parse_arguments() {
@ -307,7 +326,10 @@ function parse_arguments() {
if [ -n "${!tool}" ]; then
version="${!tool}"
case "$tool" in
OS) CUSTOM_BASE_IMAGE=$(get_base_image_reference $version) ;;
# explode debian:version into `print_image_args debian version`
OS) print_image_args ${version%:*} ${version##*:} ;;
DEBIAN) print_image_args debian $version ;;
UBI) print_image_args ubi $version ;;
RUBY) print_ruby_args $version ;;
BUNDLER) print_bundler_args $version ;;
RUBYGEMS) print_rubygems_args $version ;;
@ -325,30 +347,17 @@ function parse_arguments() {
GCLOUD) print_gcloud_args $version ;;
KUBECTL) print_kubectl_args $version ;;
HELM) print_helm_args $version ;;
*) echo "unknown tool $tool"; exit 1;;
*) fail "Unknown tool $tool" ;;
esac
fi
done
CUSTOM_BASE_IMAGE=${CUSTOM_BASE_IMAGE:-"debian:buster"}
BUILD_OS=${OS:-"debian:buster"}
printf -- "--build-arg CUSTOM_BASE_IMAGE=%s " "$CUSTOM_BASE_IMAGE"
printf -- "--build-arg BUILD_OS=%s " "$BUILD_OS"
printf -- "--platform=linux/%s " "${TARGETARCH}"
printf -- "--platform=%s " "${TARGETARCH}"
}
function generate_command() {
printf -- "docker buildx build "
parse_arguments
for i in "$@"
do
printf -- "%s " "$i"
done
printf -- "--push=${PUSH_CUSTOM_IMAGE:-false} "
printf -- ".\\n"
function run_command() {
printf "\t%s\n" "$@"
eval "$@"
}
function build_custom_if_needed() {
@ -357,11 +366,30 @@ function build_custom_if_needed() {
full_image_name="$build_image_path:$build_image_tag"
echo "Building image $full_image_name"
docker_command=$(generate_command $@ --cache-to=type=inline --cache-from="$full_image_name" -t "$full_image_name")
echo "Docker command:"
printf "\t%s\n" "$docker_command"
eval $docker_command
docker_build_command=$(parse_arguments)
docker_build_command="${docker_build_command} $@"
docker_build_command="${docker_build_command} --cache-from=\"$full_image_name\""
docker_build_command="${docker_build_command} --tag=\"$full_image_name\""
echo "Docker build command:"
# Prefer using `docker buildx` as it is more flexible,
# or use regular `docker build` if not available on older systems
if docker buildx version &> /dev/null; then
docker_build_command="${docker_build_command} --cache-to=type=inline"
docker_build_command="${docker_build_command} --push=${PUSH_CUSTOM_IMAGE:-false}"
run_command docker buildx build $docker_build_command .
else
docker_build_command="${docker_build_command} --build-arg TARGETARCH=${ARCH}"
run_command docker build $docker_build_command .
if [[ "$PUSH_CUSTOM_IMAGE" == "true" ]]; then
run_command docker push "$full_image_name"
fi
fi
printf "\n\nSUCCESS - Successfully built:\n\t%s\n" "$full_image_name"
}
# Use DEBIAN by default unless specified otherwise
DEBIAN=${DEBIAN:-bullseye}
build_custom_if_needed $@

View file

@ -1,7 +1,7 @@
# Note: Check out https://wiki.bash-hackers.org/syntax/pe for documentation on
# various variable operations used in this script.
PATH_TOOLS=(OS RUBY GOLANG NODE POSTGRESQL)
PATH_TOOLS=(DEBIAN OS UBI RUBY GOLANG NODE POSTGRESQL)
TAG_TOOLS=(BUNDLER RUBYGEMS GIT LFS CHROME YARN GRAPHICSMAGICK BAZELISK DOCKER BUILDX GCLOUD KUBECTL HELM)
# Generate the docker image path using the components that were specified via