#!/bin/bash set -e IFS=$'\n\t' SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" source "$SCRIPT_DIR/lib/custom-docker.sh" function print_golang_args() { case "$1" in 1.14) INSTALL_GOLANG_VERSION=1.14.15 GOLANG_DOWNLOAD_SHA256=c64a57b374a81f7cf1408d2c410a28c6f142414f1ffa9d1062de1d653b0ae0d6 ;; 1.15) INSTALL_GOLANG_VERSION=1.15.10 GOLANG_DOWNLOAD_SHA256=4aa1267517df32f2bf1cc3d55dfc27d0c6b2c2b0989449c96dd19273ccca051d ;; 1.16) INSTALL_GOLANG_VERSION=1.16.12 GOLANG_DOWNLOAD_SHA256=7d657e86493ac1d5892f340a7d88b862b12edb5ac6e73c099e8e0668a6c916b7 ;; 1.17) INSTALL_GOLANG_VERSION=1.17.7 GOLANG_DOWNLOAD_SHA256=02b111284bedbfa35a7e5b74a06082d18632eff824fd144312f6063943d49259 ;; *) echo "Unknown golang version $1"; exit 1; esac printf -- "--build-arg INSTALL_GOLANG_VERSION=%s " "$INSTALL_GOLANG_VERSION" printf -- "--build-arg GOLANG_DOWNLOAD_SHA256=%s " "$GOLANG_DOWNLOAD_SHA256" } # If you add a new minor version here, be sure to check that the # Chrome versions can be found at https://www.ubuntuupdates.org/pm/google-chrome-stable. # ChromeDriver supports this: https://sites.google.com/chromium.org/driver/downloads # You may need to bump the version in scripts/install-chrome. function print_chrome_args() { case "$1" in 89|89.0) CHROME_VERSION=89.0.4389.90-1 CHROME_DRIVER_VERSION=89.0.4389.23 ;; 94|94.0) CHROME_VERSION=94.0.4606.81-1 CHROME_DRIVER_VERSION=94.0.4606.113 ;; 97|97.0) CHROME_VERSION=97.0.4692.99-1 CHROME_DRIVER_VERSION=97.0.4692.71 ;; 99|99.0) CHROME_VERSION=99.0.4844.74-1 CHROME_DRIVER_VERSION=99.0.4844.51 ;; *) echo "Unknown chrome version $1"; exit 1; esac printf -- "--build-arg CHROME_VERSION=%s " "$CHROME_VERSION" printf -- "--build-arg CHROME_DRIVER_VERSION=%s " "$CHROME_DRIVER_VERSION" } # see https://www.kernel.org/pub/software/scm/git function print_git_args() { case "$1" in 2.29) GIT_VERSION=2.29.0 GIT_DOWNLOAD_SHA256=fa08dc8424ef80c0f9bf307877f9e2e49f1a6049e873530d6747c2be770742ff ;; 2.31) GIT_VERSION=2.31.1 GIT_DOWNLOAD_SHA256=46d37c229e9d786510e0c53b60065704ce92d5aedc16f2c5111e3ed35093bfa7 ;; 2.33) GIT_VERSION=2.33.1 GIT_DOWNLOAD_SHA256=02047f8dc8934d57ff5e02aadd8a2fe8e0bcf94a7158da375e48086cc46fce1d ;; *) echo "Unknown git version $1"; exit 1; esac case "$GIT_VERSION" in *.rc[0-9]) GIT_DOWNLOAD_URL=https://www.kernel.org/pub/software/scm/git/testing/git-${GIT_VERSION}.tar.gz;; *) GIT_DOWNLOAD_URL=https://www.kernel.org/pub/software/scm/git/git-${GIT_VERSION}.tar.gz;; esac printf -- "--build-arg GIT_VERSION=%s " "$GIT_VERSION" printf -- "--build-arg GIT_DOWNLOAD_SHA256=%s " "$GIT_DOWNLOAD_SHA256" printf -- "--build-arg GIT_DOWNLOAD_URL=%s " "$GIT_DOWNLOAD_URL" } # see https://github.com/git-lfs/git-lfs/releases function print_lfs_args() { case "$1" in 2.9) LFS_VERSION=2.9.1 LFS_DOWNLOAD_SHA256=2a8e60cf51ec45aa0f4332aa0521d60ec75c76e485d13ebaeea915b9d70ea466 ;; *) echo "Unknown Git LFS version $1"; exit 1; esac printf -- "--build-arg LFS_VERSION=%s " "$LFS_VERSION" printf -- "--build-arg LFS_DOWNLOAD_SHA256=%s " "$LFS_DOWNLOAD_SHA256" } function print_node_args() { case "$1" in 12.22) NODE_INSTALL_VERSION=12.22.1 ;; 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; esac printf -- "--build-arg NODE_INSTALL_VERSION=%s " "$NODE_INSTALL_VERSION" } function print_yarn_args() { case "$1" in 1.12) YARN_INSTALL_VERSION=1.12.3 ;; 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; esac printf -- "--build-arg YARN_INSTALL_VERSION=%s " "$YARN_INSTALL_VERSION" } function print_postgres_args() { printf -- "--build-arg POSTGRES_VERSION=%s " "$1" } function print_docker_args() { printf -- "--build-arg DOCKER_VERSION=%s " "$1" } function print_graphicsmagick_args() { case "$1" in 1.3.29) GRAPHISMAGICK_VERSION=1.3.29 GRAPHISMAGICK_DOWNLOAD_SHA256=de820cd10597205941a7e9d02c2e679231e92e8e769c204ef09034d2279ad453 ;; 1.3.33) GRAPHISMAGICK_VERSION=1.3.33 GRAPHISMAGICK_DOWNLOAD_SHA256=00ea0df7c78c903cce325f402429bcd3924168cf39277f743a0641d47c411ee8 ;; 1.3.34) GRAPHISMAGICK_VERSION=1.3.34 GRAPHISMAGICK_DOWNLOAD_SHA256=4717f7a32d964c515d83706fd52d34e089c2ffa35f8fbf43c923ce19343cf2f4 ;; 1.3.36) GRAPHISMAGICK_VERSION=1.3.36 GRAPHISMAGICK_DOWNLOAD_SHA256=1e6723c48c4abbb31197fadf8396b2d579d97e197123edc70a4f057f0533d563 ;; *) echo "Unknown graphicsmagick version $1"; exit 1; esac printf -- "--build-arg GRAPHISMAGICK_VERSION=%s " "$GRAPHISMAGICK_VERSION" printf -- "--build-arg GRAPHISMAGICK_DOWNLOAD_SHA256=%s " "$GRAPHISMAGICK_DOWNLOAD_SHA256" } function print_pgbouncer_args() { case "$1" in 1.14) PGBOUNCER_VERSION=1.14.0 PGBOUNCER_DOWNLOAD_SHA256=a0c13d10148f557e36ff7ed31793abb7a49e1f8b09aa2d4695d1c28fa101fee7 ;; *) echo "Unknown pgbouncer version $1"; exit 1; esac printf -- "--build-arg PGBOUNCER_VERSION=%s " "$PGBOUNCER_VERSION" printf -- "--build-arg PGBOUNCER_DOWNLOAD_SHA256=%s " "$PGBOUNCER_DOWNLOAD_SHA256" } function print_bazelisk_args() { case "$1" in 1.9.0) BAZELISK_VERSION=1.9.0 BAZELISK_DOWNLOAD_SHA256=b8c7f2a1b07ad64a2f27f8f19a202f90d044de7b5b6ccc387a6fe5d4a8ec4937 ;; *) echo "Unknown bazelisk version $1"; exit 1; esac printf -- "--build-arg BAZELISK_VERSION=%s " "$BAZELISK_VERSION" printf -- "--build-arg BAZELISK_DOWNLOAD_SHA256=%s " "$BAZELISK_DOWNLOAD_SHA256" } function print_ruby_args() { case "$1" in 2.6|2.6.*) RUBY_VERSION="2.6.6" RUBY_DOWNLOAD_SHA256="364b143def360bac1b74eb56ed60b1a0dca6439b00157ae11ff77d5cd2e92291" ;; 2.7|2.7.patched) RUBY_VERSION="2.7.5" RUBY_DOWNLOAD_SHA256="2755b900a21235b443bb16dadd9032f784d4a88f143d852bc5d154f22b8781f1" ;; # Please update any clients still asking for these images to request `ruby-2.7` instead, # which will provide the latest available patch level (see above.) 2.7.*) RUBY_VERSION="2.7.2" RUBY_DOWNLOAD_SHA256="6e5706d0d4ee4e1e2f883db9d768586b4d06567debea353c796ec45e8321c3d4" ;; 3.0|3.0.patched) RUBY_VERSION="3.0.3" RUBY_DOWNLOAD_SHA256="3586861cb2df56970287f0fd83f274bd92058872d830d15570b36def7f1a92ac" ;; *) echo "Unknown ruby version $1"; exit 1; esac printf -- "--build-arg RUBY_VERSION=%s " "$RUBY_VERSION" printf -- "--build-arg RUBY_DOWNLOAD_SHA256=%s " "$RUBY_DOWNLOAD_SHA256" } function parse_arguments() { printf -- "-f Dockerfile.custom " # defaults CUSTOM_IMAGE_NAME=debian CUSTOM_IMAGE_VERSION=buster for tool in "${TOOLS[@]}"; do if [ -n "${!tool}" ]; then version="${!tool}" case "$tool" in DEBIAN) CUSTOM_IMAGE_VERSION=$version ;; RUBY) print_ruby_args $version ;; GOLANG) print_golang_args $version ;; CHROME) print_chrome_args $version ;; DOCKER) print_docker_args $version ;; GIT) print_git_args $version ;; LFS) print_lfs_args $version ;; NODE) print_node_args $version ;; YARN) print_yarn_args $version ;; POSTGRESQL) print_postgres_args $version ;; GRAPHICSMAGICK) print_graphicsmagick_args $version ;; PGBOUNCER) print_pgbouncer_args $version ;; BAZELISK) print_bazelisk_args $version ;; *) echo "unknown tool $tool"; exit 1;; esac fi done printf -- "--build-arg CUSTOM_IMAGE_NAME=%s " "$CUSTOM_IMAGE_NAME" printf -- "--build-arg CUSTOM_IMAGE_VERSION=%s " "$CUSTOM_IMAGE_VERSION" printf -- "--build-arg DEBIAN_VERSION=%s " "$CUSTOM_IMAGE_VERSION" } function generate_command() { printf -- "docker build " parse_arguments for i in "$@" do printf -- "%s " "$i" done printf -- ".\\n" } function build_custom_if_needed() { build_image_name=$(get_image_name) echo "Building image $build_image_name" full_image_name="$CI_REGISTRY_IMAGE:$build_image_name" # This re-uses and builds an existing image if needed docker pull --quiet "$full_image" || true docker_command=$(generate_command $@ --cache-from="$full_image_name" -t "$full_image_name") echo "Docker command:" printf "\t%s" "$docker_command" eval $docker_command printf "\n\nSUCCESS - Successfully built:\n\t%s" "$build_image_name" } build_custom_if_needed $@