#!/usr/bin/env bash set -eu set -o pipefail set -o errtrace shopt -s expand_aliases [ "$(uname)" == "Darwin" ] && alias sed="gsed" || : pushd() { command pushd "$@" > /dev/null; } popd() { command popd "$@" > /dev/null; } TFWDEV="${TFWDEV:-0}" HTTPS_REMOTES="${HTTPS_REMOTES:-}" TFW_POSTFIX=tutorial-framework BASEDIR="$(pwd)" BASEIMAGE=baseimage-${TFW_POSTFIX} TEST=test-${TFW_POSTFIX} FRONTEND=frontend-${TFW_POSTFIX} BASEIMAGE_NAME="${BASEIMAGE_NAME:-eu.gcr.io/avatao-challengestore/tutorial-framework}" LOGFILE=/tmp/bootstrap_tfw.log remotebase="git@github.com:" run() { trap 'exit 1' INT trap handle_exit EXIT : > $LOGFILE check_dependencies clone_required_repos_ask_ssh_or_https TAG="${BASEIMAGE_ONLY:-$(fetch_latest_tag)}" TAG=$TAG build_baseimage if [ -z "${BASEIMAGE_ONLY:-}" ]; then TAG=$TAG pin_baseimage install_frontend_deps if [ "$TFWDEV" == "0" ]; then cleanup_repos merge_repos fi else delete_repos fi echo if [ -z "${BASEIMAGE_ONLY:-}" ]; then echo "You can build & start TFW by executing the command: ${TEST}/hack/tfw.sh start" else echo "Baseimage version ${BASEIMAGE_ONLY} built successfully!" fi } handle_exit() { if [[ $? -ne 0 ]]; then delete_repos showlog fi cleanlog } showlog() { echo && echo "Error! Showing logs:" && cat $LOGFILE; } cleanlog() { rm $LOGFILE; } delete_repos() { pushd "$BASEDIR" && rm -rf "$BASEIMAGE" "$FRONTEND" "$TEST" && popd; } check_dependencies() { dependencies=("git" "docker" "yarn" "ng") missing="0" for dep in ${dependencies[@]}; do if ! type "$dep" > /dev/null 2>&1; then logged echo "Dependency '${dep}' not found!" missing="1" fi done if [ "$missing" == "1" ]; then logged echo "Please install the missing packages and retry!" exit 1 fi if [ "$TFWDEV" == "0" ]; then if ! docker info > /dev/null 2>&1; then logged echo "The Docker daemon appears to be stopped. Please start it and try again!" exit 1 fi fi } clone_required_repos_ask_ssh_or_https() { if [[ -z "$HTTPS_REMOTES" ]]; then read -p "Repos are pulled over SSH by default. Should I use HTTPS instead? [y/N]" -r -t 5 || : echo if [[ $REPLY =~ ^(y|Y|yes|Yes|YES)$ ]]; then HTTPS_REMOTES=1 clone_required_repos else HTTPS_REMOTES=0 clone_required_repos fi else clone_required_repos fi } clone_required_repos() { [[ "$HTTPS_REMOTES" == "1" ]] && remotebase="https://github.com/" echo -n "Cloning TFW repositories... " echo -n "baseimage... " && logged git clone ${remotebase}avatao-content/${BASEIMAGE}.git if [ -z "${BASEIMAGE_ONLY:-}" ]; then echo -n "frontend... " && logged git clone ${remotebase}avatao-content/${FRONTEND}.git echo -n "test... " && logged git clone ${remotebase}avatao-content/${TEST}.git fi echo "Done!" } install_frontend_deps() { echo -n "Installing frontend dependencies... " pushd "$FRONTEND" spinned logged yarn install popd echo "Done!" } fetch_latest_tag() { echo -n "$(git ls-remote --tags ${remotebase}avatao-content/${BASEIMAGE}.git | cut -f2 | grep -oP '(?<=refs/tags/)\w+-\d{8}$' | sort -t '-' -k2 | tail -n 1)" } pin_baseimage() { echo -n "Pinning TFW baseimage version... " echo -n "which is ${TAG}... " sed -i "1 s/.*/&:${TAG}/" "${TEST}/solvable/Dockerfile" echo "Done!" } build_baseimage() { echo -n "Building baseimage at ${TAG}... " pushd "$BASEIMAGE" logged git checkout "$TAG" spinned logged docker build -t "${BASEIMAGE_NAME}:${TAG}" . popd echo "Done!" } cleanup_repos() { rm -rf "${BASEIMAGE}" rm -rf "${TEST}/.git" rm -rf "${FRONTEND}/.git" } merge_repos() { echo -n "Merging repositories... " NESTED_FRONTEND="${TEST}/solvable/frontend" rm -rf $NESTED_FRONTEND mv "$FRONTEND" "$NESTED_FRONTEND" echo "Done!" } logged() { "$@" >> $LOGFILE 2>&1 } spinned() { "$@" & pid=$! spin=("-" "\\" "|" "/") echo -n "${spin[0]}" while kill -0 $pid &> /dev/null; do for i in "${spin[@]}"; do echo -ne "\b$i" sleep 0.1 done done echo -ne "\b" wait $pid } run