mirror of
				https://github.com/avatao-content/test-tutorial-framework
				synced 2025-11-04 02:42:56 +00:00 
			
		
		
		
	Merge branch 'multistage'
This commit is contained in:
		@@ -1,191 +0,0 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -eu
 | 
			
		||||
set -o pipefail
 | 
			
		||||
set -o errtrace
 | 
			
		||||
shopt -s expand_aliases
 | 
			
		||||
[ "$(uname)" == "Darwin" ] && alias sed="gsed" && alias grep="ggrep" || :
 | 
			
		||||
 | 
			
		||||
HERE="$(pwd)"
 | 
			
		||||
CHALLENGE=${CHALLENGE:-test-tutorial-framework}
 | 
			
		||||
BASEIMAGE_NAME="${BASEIMAGE_NAME:-eu.gcr.io/avatao-challengestore/tutorial-framework}"
 | 
			
		||||
BASEIMAGE_REPO="${BASEIMAGE_REPO:-baseimage-tutorial-framework}"
 | 
			
		||||
FRONTEND_REPO="${FRONTEND_REPO:-frontend-tutorial-framework}"
 | 
			
		||||
 | 
			
		||||
LOGFILE=/tmp/bootstrap_tfw.log
 | 
			
		||||
REMOTEBASE="git@github.com:avatao-content"
 | 
			
		||||
 | 
			
		||||
run() {
 | 
			
		||||
    trap 'exit 1' INT
 | 
			
		||||
    trap handle_exit EXIT
 | 
			
		||||
    : > "${LOGFILE}"
 | 
			
		||||
 | 
			
		||||
    check_dependencies
 | 
			
		||||
    clone_required_repos_ask_ssh_or_https
 | 
			
		||||
    local tag
 | 
			
		||||
    tag="${BASEIMAGE_ONLY:-$(remotebase="${REMOTEBASE}" baseimage_latest_upstream_tag)}"
 | 
			
		||||
    tag=${tag} verify_baseimage_tag
 | 
			
		||||
    tag=${tag} build_baseimage
 | 
			
		||||
 | 
			
		||||
    if [ -z "${BASEIMAGE_ONLY:-}" ]; then
 | 
			
		||||
        tag=${tag} pin_baseimage
 | 
			
		||||
        install_frontend_deps
 | 
			
		||||
        if [ "${TFWDEV:-0}" == "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: ${CHALLENGE}/hack/tfw.sh start"
 | 
			
		||||
    else
 | 
			
		||||
        echo "Baseimage version ${BASEIMAGE_ONLY} built successfully!"
 | 
			
		||||
    fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
handle_exit() {
 | 
			
		||||
    if [[ $? -ne 0 ]]; then
 | 
			
		||||
        delete_repos
 | 
			
		||||
        showlog
 | 
			
		||||
    fi
 | 
			
		||||
    cleanlog
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
logged() { "$@" >> "${LOGFILE}" 2>&1; }
 | 
			
		||||
showlog() { echo && echo "Error! Showing logs:" && cat "${LOGFILE}"; }
 | 
			
		||||
cleanlog() { rm "${LOGFILE}"; }
 | 
			
		||||
delete_repos() { cd "${HERE}" && rm -rf "${BASEIMAGE_REPO}" "${FRONTEND_REPO}" "${CHALLENGE}"; }
 | 
			
		||||
 | 
			
		||||
check_dependencies() {
 | 
			
		||||
    local dependencies=("git" "docker" "yarn" "ng")
 | 
			
		||||
    local 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}" == "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:-0}" == "1" ]] && REMOTEBASE="https://github.com/avatao-content"
 | 
			
		||||
 | 
			
		||||
    echo -n "Cloning TFW repositories... "
 | 
			
		||||
    echo -n "baseimage... " && logged git clone ${REMOTEBASE}/${BASEIMAGE_REPO}.git
 | 
			
		||||
    if [ -z "${BASEIMAGE_ONLY:-}" ]; then
 | 
			
		||||
        echo -n "frontend... " && logged git clone ${REMOTEBASE}/${FRONTEND_REPO}.git
 | 
			
		||||
        echo -n "test... " && logged git clone ${REMOTEBASE}/${CHALLENGE}.git
 | 
			
		||||
    fi
 | 
			
		||||
    echo "Done!"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
baseimage_latest_upstream_tag() {
 | 
			
		||||
    echo -n "$(git ls-remote --tags ${remotebase}/${BASEIMAGE_REPO}.git |
 | 
			
		||||
               cut -f2                                                  |
 | 
			
		||||
               grep -oP '(?<=refs/tags/)\w+-\d{8}$'                     |
 | 
			
		||||
               sort -t '-' -k2                                          |
 | 
			
		||||
               tail -n 1)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
verify_baseimage_tag() {
 | 
			
		||||
    pushd "${BASEIMAGE_REPO}"
 | 
			
		||||
    local statuscode
 | 
			
		||||
    if ! git rev-parse --quiet  \
 | 
			
		||||
                       --verify \
 | 
			
		||||
                       "refs/tags/${tag}" &> /dev/null; then
 | 
			
		||||
        logged echo "${tag} is not a valid tag!"
 | 
			
		||||
        exit 1
 | 
			
		||||
    fi
 | 
			
		||||
    popd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pin_baseimage() {
 | 
			
		||||
    echo -n "Pinning TFW baseimage version... "
 | 
			
		||||
    echo -n "which is ${tag}... "
 | 
			
		||||
    sed -i "1 s/.*/&:${tag}/" "${CHALLENGE}/solvable/Dockerfile"
 | 
			
		||||
    echo "Done!"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
build_baseimage() {
 | 
			
		||||
    echo -n "Building baseimage at ${tag}... "
 | 
			
		||||
    pushd "${BASEIMAGE_REPO}"
 | 
			
		||||
    logged git checkout "${tag}"
 | 
			
		||||
    spinned logged docker build -t "${BASEIMAGE_NAME}:${tag}" .
 | 
			
		||||
    popd
 | 
			
		||||
    echo "Done!"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
install_frontend_deps() {
 | 
			
		||||
    echo -n "Installing frontend dependencies... "
 | 
			
		||||
    pushd "${FRONTEND_REPO}"
 | 
			
		||||
    spinned logged yarn install
 | 
			
		||||
    popd
 | 
			
		||||
    echo "Done!"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cleanup_repos() {
 | 
			
		||||
    rm -rf "${BASEIMAGE_REPO}"
 | 
			
		||||
    rm -rf "${CHALLENGE}/.git"
 | 
			
		||||
    rm -rf "${FRONTEND_REPO}/.git"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
merge_repos() {
 | 
			
		||||
    echo -n "Merging repositories... "
 | 
			
		||||
    NESTED_FRONTEND="${CHALLENGE}/solvable/frontend"
 | 
			
		||||
    rm -rf "${NESTED_FRONTEND}"
 | 
			
		||||
    mv "${FRONTEND_REPO}" "${NESTED_FRONTEND}"
 | 
			
		||||
    echo "Done!"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pushd() {
 | 
			
		||||
    command pushd "$@" > /dev/null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
popd() {
 | 
			
		||||
    command popd "$@" > /dev/null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
run
 | 
			
		||||
@@ -14,11 +14,11 @@ source "${libhack_dir}/common.sh"
 | 
			
		||||
 | 
			
		||||
challenge::build() {
 | 
			
		||||
    pushd "${CHALLENGE_PATH}"
 | 
			
		||||
    args="--build-arg NOFRONTEND=1" build_challenge_internal
 | 
			
		||||
    args="" build_challenge_internal
 | 
			
		||||
    popd
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
challenge::build_with_frontend() {
 | 
			
		||||
challenge::build_no_cache() {
 | 
			
		||||
    pushd "${CHALLENGE_PATH}"
 | 
			
		||||
    args="--no-cache" build_challenge_internal
 | 
			
		||||
    popd
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +0,0 @@
 | 
			
		||||
# Requires context:
 | 
			
		||||
#     - FRONTEND_PATH: absolute path of frontend repo
 | 
			
		||||
#     - CHALLENGE_PATH: absolute path of challenge repo
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
frontend::run() {
 | 
			
		||||
    local frontend_in_challenge="${CHALLENGE_PATH}/solvable/frontend"
 | 
			
		||||
    if [[ "$(find "${frontend_in_challenge}" | wc -l)" -gt 2 ]];then
 | 
			
		||||
        cd "${frontend_in_challenge}"
 | 
			
		||||
    else
 | 
			
		||||
        cd "${FRONTEND_PATH}"
 | 
			
		||||
    fi
 | 
			
		||||
    yarn start
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										38
									
								
								hack/tfw.sh
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								hack/tfw.sh
									
									
									
									
									
								
							@@ -18,46 +18,23 @@ FRONTEND_PATH="${TFW_PATH}/${FRONTEND_REPO}"
 | 
			
		||||
 | 
			
		||||
source "${SCRIPT_DIR}/libhack/baseimage.sh"
 | 
			
		||||
source "${SCRIPT_DIR}/libhack/challenge.sh"
 | 
			
		||||
source "${SCRIPT_DIR}/libhack/frontend.sh"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
start_challenge_and_frontend() {
 | 
			
		||||
    trap 'exit' INT TERM
 | 
			
		||||
    trap 'kill 0' EXIT
 | 
			
		||||
    [[ "${RUN_FRONTEND:-1}" == "1" ]] && frontend::run &
 | 
			
		||||
    [[ "${BUILD:-1}" == "1" ]] && challenge::build
 | 
			
		||||
    challenge::run $@
 | 
			
		||||
    wait
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
case ${1:-} in
 | 
			
		||||
    start)
 | 
			
		||||
        baseimage::build_if_exists
 | 
			
		||||
        BUILD=1 RUN_FRONTEND=1 start_challenge_and_frontend ${@:2}
 | 
			
		||||
        challenge::build
 | 
			
		||||
        challenge::run ${@:2}
 | 
			
		||||
    ;;
 | 
			
		||||
    run)
 | 
			
		||||
        BUILD=0 RUN_FRONTEND=1 start_challenge_and_frontend ${@:2}
 | 
			
		||||
    ;;
 | 
			
		||||
    startcontainer)
 | 
			
		||||
        baseimage::build_if_exists
 | 
			
		||||
        BUILD=1 RUN_FRONTEND=0 start_challenge_and_frontend ${@:2}
 | 
			
		||||
    ;;
 | 
			
		||||
    runcontainer)
 | 
			
		||||
        BUILD=0 RUN_FRONTEND=0 start_challenge_and_frontend ${@:2}
 | 
			
		||||
    ;;
 | 
			
		||||
    runfrontend)
 | 
			
		||||
        frontend::run
 | 
			
		||||
        challenge:run ${@:2}
 | 
			
		||||
    ;;
 | 
			
		||||
    buildtfw)
 | 
			
		||||
        baseimage::build_if_exists
 | 
			
		||||
    ;;
 | 
			
		||||
    build)
 | 
			
		||||
        baseimage::build_if_exists
 | 
			
		||||
        challenge::build
 | 
			
		||||
    ;;
 | 
			
		||||
    buildwithfrontend)
 | 
			
		||||
        baseimage::build_if_exists
 | 
			
		||||
        challenge::build_with_frontend
 | 
			
		||||
        challenge::build_no_cache
 | 
			
		||||
    ;;
 | 
			
		||||
    releasetfw)
 | 
			
		||||
        if [[ -d "$BASEIMAGE_PATH" ]]; then
 | 
			
		||||
@@ -71,13 +48,10 @@ case ${1:-} in
 | 
			
		||||
    ;;
 | 
			
		||||
    *)
 | 
			
		||||
        echo "Usage: tfw.sh [COMMAND]"
 | 
			
		||||
        echo "          |--- start:             build & run TFW challenge and Angular frontend"
 | 
			
		||||
        echo "          |--- run:               run TFW challenge and Angular frontend"
 | 
			
		||||
        echo "          |--- startcontainer:    build & run TFW challenge, container only"
 | 
			
		||||
        echo "          |--- runcontainer:      run TFW challenge, container only"
 | 
			
		||||
        echo "          |--- start:             build & run TFW challenge"
 | 
			
		||||
        echo "          |--- run:               run TFW challenge"
 | 
			
		||||
        echo "          |--- buildtfw:          build TFW baseimage"
 | 
			
		||||
        echo "          |--- build:             build TFW baseimage and challenge"
 | 
			
		||||
        echo "          |--- buildwithfrontend: build TFW baseimage and challenge, include frontend in image"
 | 
			
		||||
        echo "          |--- releasetfw:        tag TFW baseimage and push to upstream"
 | 
			
		||||
        echo "          |--- builddocs:         build baseimage documentation (in docs/build/html)"
 | 
			
		||||
    ;;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user