215 lines
4.9 KiB
Bash
Executable File
215 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# Copyright (c) 2017 Red Hat, Inc.
|
|
# This program and the accompanying materials are made
|
|
# available under the terms of the Eclipse Public License 2.0
|
|
# which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
#
|
|
# SPDX-License-Identifier: EPL-2.0
|
|
#
|
|
|
|
set -e
|
|
set -u
|
|
|
|
IMAGE_ALIASES=${IMAGE_ALIASES:-}
|
|
ERROR=${ERROR:-}
|
|
DIR=${DIR:-}
|
|
|
|
skip_tests() {
|
|
if [ $SKIP_TESTS = "true" ]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
prepare_build_args() {
|
|
IFS=',' read -r -a BUILD_ARGS_ARRAY <<< "$@"
|
|
for i in ${BUILD_ARGS_ARRAY[@]}; do
|
|
BUILD_ARGS+="--build-arg $i "
|
|
done
|
|
}
|
|
|
|
init() {
|
|
BLUE='\033[1;34m'
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
BROWN='\033[0;33m'
|
|
PURPLE='\033[0;35m'
|
|
NC='\033[0m'
|
|
BOLD='\033[1m'
|
|
UNDERLINE='\033[4m'
|
|
|
|
ORGANIZATION="quay.io/eclipse"
|
|
PREFIX="che"
|
|
TAG="nightly"
|
|
SKIP_TESTS=false
|
|
NAME="che"
|
|
ARGS=""
|
|
OPTIONS=""
|
|
DOCKERFILE=""
|
|
BUILD_ARGS=""
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case $1 in
|
|
--*)
|
|
OPTIONS="${OPTIONS} ${1}"
|
|
;;
|
|
*)
|
|
ARGS="${ARGS} ${1}"
|
|
;;
|
|
esac
|
|
|
|
case $1 in
|
|
--tag:*)
|
|
TAG="${1#*:}"
|
|
shift ;;
|
|
--organization:*)
|
|
ORGANIZATION="${1#*:}"
|
|
shift ;;
|
|
--prefix:*)
|
|
PREFIX="${1#*:}"
|
|
shift ;;
|
|
--name:*)
|
|
NAME="${1#*:}"
|
|
shift ;;
|
|
--skip-tests)
|
|
SKIP_TESTS=true
|
|
shift ;;
|
|
--dockerfile:*)
|
|
DOCKERFILE="${1#*:}"
|
|
shift ;;
|
|
--build-arg*:*)
|
|
BUILD_ARGS_CSV="${1#*:}"
|
|
prepare_build_args $BUILD_ARGS_CSV
|
|
shift ;;
|
|
--*)
|
|
printf "${RED}Unknown parameter: $1${NC}\n"; exit 2 ;;
|
|
*)
|
|
shift;;
|
|
esac
|
|
done
|
|
|
|
IMAGE_NAME="$ORGANIZATION/$PREFIX-$NAME:$TAG"
|
|
}
|
|
|
|
build() {
|
|
|
|
# Compute directory
|
|
if [ -z $DIR ]; then
|
|
DIR=$(cd "$(dirname "$0")"; pwd)
|
|
fi
|
|
|
|
# If Dockerfile is empty, build all Dockerfiles
|
|
if [ -z ${DOCKERFILE} ]; then
|
|
DOCKERFILES_TO_BUILD="$(ls ${DIR}/Dockerfile*)"
|
|
ORIGINAL_TAG=${TAG}
|
|
# Build image for each Dockerfile
|
|
for dockerfile in ${DOCKERFILES_TO_BUILD}; do
|
|
dockerfile=$(basename $dockerfile)
|
|
# extract TAG from Dockerfile
|
|
if [ ${dockerfile} != "Dockerfile" ]; then
|
|
TAG=${ORIGINAL_TAG}-$(echo ${dockerfile} | sed -e "s/^Dockerfile.//")
|
|
fi
|
|
IMAGE_NAME="$ORGANIZATION/$PREFIX-$NAME:$TAG"
|
|
DOCKERFILE=${dockerfile}
|
|
build_image
|
|
done
|
|
|
|
# restore variables
|
|
TAG=${ORIGINAL_TAG}
|
|
IMAGE_NAME="$ORGANIZATION/$PREFIX-$NAME:$TAG"
|
|
else
|
|
# else if specified, build only the one specified
|
|
build_image
|
|
fi
|
|
|
|
}
|
|
|
|
build_image() {
|
|
printf "${BOLD}Building Docker Image ${IMAGE_NAME} from $DIR directory with tag $TAG${NC}\n"
|
|
# Replace macros in Dockerfiles
|
|
cat ${DIR}/${DOCKERFILE} | sed \
|
|
-e "s;\${BUILD_ORGANIZATION};${ORGANIZATION};" \
|
|
-e "s;\${BUILD_PREFIX};${PREFIX};" \
|
|
-e "s;\${BUILD_TAG};${TAG};" \
|
|
> ${DIR}/.Dockerfile
|
|
cd "${DIR}" && docker build -f ${DIR}/.Dockerfile -t ${IMAGE_NAME} ${BUILD_ARGS} .
|
|
DOCKER_BUILD_STATUS=$?
|
|
rm ${DIR}/.Dockerfile
|
|
if [ $DOCKER_BUILD_STATUS -eq 0 ]; then
|
|
printf "Build of ${BLUE}${IMAGE_NAME} ${GREEN}[OK]${NC}\n"
|
|
if [ ! -z "${IMAGE_ALIASES}" ]; then
|
|
for TMP_IMAGE_NAME in ${IMAGE_ALIASES}
|
|
do
|
|
docker tag ${IMAGE_NAME} ${TMP_IMAGE_NAME}:${TAG}
|
|
DOCKER_TAG_STATUS=$?
|
|
if [ $DOCKER_TAG_STATUS -eq 0 ]; then
|
|
printf " /alias ${BLUE}${TMP_IMAGE_NAME}:${TAG}${NC} ${GREEN}[OK]${NC}\n"
|
|
else
|
|
printf "${RED}Failure when building docker image ${IMAGE_NAME}${NC}\n"
|
|
exit 1
|
|
fi
|
|
|
|
done
|
|
fi
|
|
printf "${GREEN}Script run successfully: ${BLUE}${IMAGE_NAME}${NC}\n"
|
|
else
|
|
printf "${RED}Failure when building docker image ${IMAGE_NAME}${NC}\n"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
check_docker() {
|
|
if ! docker ps > /dev/null 2>&1; then
|
|
output=$(docker ps)
|
|
printf "${RED}Docker not installed properly: ${output}${NC}\n"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
docker_exec() {
|
|
if has_docker_for_windows_client; then
|
|
MSYS_NO_PATHCONV=1 docker.exe "$@"
|
|
else
|
|
"$(which docker)" "$@"
|
|
fi
|
|
}
|
|
|
|
has_docker_for_windows_client() {
|
|
GLOBAL_HOST_ARCH=$(docker version --format {{.Client}})
|
|
|
|
if [[ "${GLOBAL_HOST_ARCH}" = *"windows"* ]]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
get_full_path() {
|
|
echo "$(cd "$(dirname "${1}")"; pwd)/$(basename "$1")"
|
|
}
|
|
|
|
convert_windows_to_posix() {
|
|
echo "/"$(echo "$1" | sed 's/\\/\//g' | sed 's/://')
|
|
}
|
|
|
|
get_clean_path() {
|
|
INPUT_PATH=$1
|
|
# \some\path => /some/path
|
|
OUTPUT_PATH=$(echo ${INPUT_PATH} | tr '\\' '/')
|
|
# /somepath/ => /somepath
|
|
OUTPUT_PATH=${OUTPUT_PATH%/}
|
|
# /some//path => /some/path
|
|
OUTPUT_PATH=$(echo ${OUTPUT_PATH} | tr -s '/')
|
|
# "/some/path" => /some/path
|
|
OUTPUT_PATH=${OUTPUT_PATH//\"}
|
|
echo ${OUTPUT_PATH}
|
|
}
|
|
|
|
get_mount_path() {
|
|
FULL_PATH=$(get_full_path "${1}")
|
|
POSIX_PATH=$(convert_windows_to_posix "${FULL_PATH}")
|
|
CLEAN_PATH=$(get_clean_path "${POSIX_PATH}")
|
|
echo $CLEAN_PATH
|
|
}
|