#!/bin/bash set -e declare -A TARGETS TARGETS=( [client]="$(dirname "${BASH_SOURCE[0]}")/../client/docker/" [server]="$(dirname "${BASH_SOURCE[0]}")/../server/docker/" [proxy]="$(dirname "${BASH_SOURCE[0]}")/../caddy/" [autoupdate]="$(dirname "${BASH_SOURCE[0]}")/../autoupdate/" [prometheus]="$(dirname "${BASH_SOURCE[0]}")/../prometheus/" [media]="https://github.com/OpenSlides/openslides-media-service.git" [pgbouncer]="https://github.com/OpenSlides/openslides-docker-compose.git#:pgbouncer" [postfix]="https://github.com/OpenSlides/openslides-docker-compose.git#:postfix" [repmgr]="https://github.com/OpenSlides/openslides-docker-compose.git#:repmgr" ) DOCKER_REPOSITORY="openslides" DOCKER_TAG="latest" CONFIG="/etc/osinstancectl" OPTIONS=() BUILT_IMAGES=() DEFAULT_TARGETS=(server client proxy autoupdate) usage() { cat << EOF Usage: $(basename ${BASH_SOURCE[0]}) [] ... Options: -D, --docker-repo Specify a Docker repository (default: unspecified, i.e., system default) -t, --tag Tag the Docker image (default: $DOCKER_TAG) --ask-push Offer to push newly built images to registry --no-cache Pass --no-cache to docker-build EOF } # Config file if [[ -f "$CONFIG" ]]; then echo "Found ${CONFIG} file." source "$CONFIG" fi shortopt="hr:D:t:" longopt="help,docker-repo:,tag:,ask-push,no-cache" ARGS=$(getopt -o "$shortopt" -l "$longopt" -n "$ME" -- "$@") if [ $? -ne 0 ]; then usage; exit 1; fi eval set -- "$ARGS"; unset ARGS # Parse options while true; do case "$1" in -D|--docker-repo) DOCKER_REPOSITORY="$2" shift 2 ;; -t|--tag) DOCKER_TAG="$2" shift 2 ;; --ask-push) ASK_PUSH=1 shift 1 ;; --no-cache) OPTIONS+="--no-cache" shift 1 ;; -h|--help) usage; exit 0 ;; --) shift ; break ;; *) usage; exit 1 ;; esac done SELECTED_TARGETS=($@) [[ "${#SELECTED_TARGETS[@]}" -ge 1 ]] || SELECTED_TARGETS=("${DEFAULT_TARGETS[@]}") [[ "${SELECTED_TARGETS[@]}" != "all" ]] || SELECTED_TARGETS=("${!TARGETS[@]}") for i in "${SELECTED_TARGETS[@]}"; do loc="${TARGETS[$i]}" [[ -n "$loc" ]] || { echo "ERROR: Cannot build ${i}: not configured." continue } img_name="openslides-${i}" img="${img_name}:${DOCKER_TAG}" if [[ -n "$DOCKER_REPOSITORY" ]]; then img="${DOCKER_REPOSITORY}/${img}" fi echo "Building $img..." # Special instructions for local services build_script="$(dirname "${BASH_SOURCE[0]}")/../${i}/build.sh" if [[ -f "$build_script" ]]; then ( . "$build_script" ) else docker build --tag "$img" --pull "${OPTIONS[@]}" "$loc" fi BUILT_IMAGES+=("$img ON") done if [[ "${#BUILT_IMAGES[@]}" -ge 1 ]]; then printf "\nSuccessfully built images:\n\n" for i in "${BUILT_IMAGES[@]}"; do read -r img x <<< "$i" printf " - $img\n" done else echo "No images were built." exit 3 fi [[ "$ASK_PUSH" ]] || exit 0 if hash whiptail > /dev/null 2>&1; then while read img; do echo "Pushing ${img}." docker push "$img" done < <( whiptail --title "OpenSlides build script" \ --checklist "Select images to push to their registry." \ 25 78 16 --separate-output --noitem --clear \ ${BUILT_IMAGES[@]} \ 3>&2 2>&1 1>&3 ) else echo for i in "${BUILT_IMAGES[@]}"; do read -r img x <<< "$i" read -p "Push image '$img' to repository? [Y/n] " REPL case "$REPL" in N|n|No|no|NO) exit 0;; *) docker push "$img" ;; esac done fi