#!/bin/bash # # Agricius - build tool for Judge0. # # Named after Saint Agricius of Trier - protector of carpenters, builders, confectioners, blacksmiths, tailors and butchers. _err() { echo >&2 "Error: $*" } _die() { _err "$*" exit 1 } __get_argument() { if [[ -n "$2" ]] && [[ ${2:0:1} != "-" ]]; then echo "$2" else _err "Argument for $1 is missing." fi } _positional_params="" while [[ $# -gt 0 ]]; do case "$1" in --cache-from) _cache="$(__get_argument $1 $2)"; [[ "$_cache" == "" ]] && exit 1 shift 2 ;; -*|--*) _die "Unknown option $1. Usage: $0 [--cache-from image] command Available commands: build Build Docker images. publish Push Docker images to repository. Implies build." ;; *) _positional_params="$_positional_params $1" shift ;; esac done eval set -- "$_positional_params" if [[ "$_cache" != "" ]]; then docker pull $_cache _cache="--cache-from $_cache" fi JUDGE0_DOCKER_REPOSITORY=judge0/judge0 JUDGE0_PROJECT_ROOT="$(git rev-parse --show-toplevel)" JUDGE0_COMMIT="$(git log -1 --format=%h --abbrev=8)" JUDGE0_BRANCH="$(git rev-parse --abbrev-ref HEAD)" JUDGE0_EDITION="$JUDGE0_BRANCH" if [[ "$JUDGE0_BRANCH" == "master" ]]; then JUDGE0_EDITION="standard" fi JUDGE0_EDITION_SLUG="-$JUDGE0_EDITION" if [[ "$JUDGE0_EDITION" == "standard" ]]; then JUDGE0_EDITION_SLUG="" fi JUDGE0_VERSION_TAG="$(git tag --points-at HEAD)" JUDGE0_VERSION="${JUDGE0_VERSION_TAG:1}" # Remove the "v" the beginning. JUDGE0_VERSION="${JUDGE0_VERSION%-*}" # Remove everything else after "-". JUDGE0_PRODUCTION_IMAGES="$JUDGE0_DOCKER_REPOSITORY:$JUDGE0_COMMIT$JUDGE0_EDITION_SLUG" if [[ "$JUDGE0_VERSION" != "" ]]; then JUDGE0_PRODUCTION_IMAGES="$JUDGE0_PRODUCTION_IMAGES $JUDGE0_DOCKER_REPOSITORY:latest$JUDGE0_EDITION_SLUG" JUDGE0_PRODUCTION_IMAGES="$JUDGE0_PRODUCTION_IMAGES $JUDGE0_DOCKER_REPOSITORY:$JUDGE0_VERSION$JUDGE0_EDITION_SLUG" fi JUDGE0_DEVELOPMENT_IMAGES="$JUDGE0_DOCKER_REPOSITORY:$JUDGE0_COMMIT-dev$JUDGE0_EDITION_SLUG" if [[ "$JUDGE0_VERSION" != "" ]]; then JUDGE0_DEVELOPMENT_IMAGES="$JUDGE0_DEVELOPMENT_IMAGES $JUDGE0_DOCKER_REPOSITORY:latest$JUDGE0_EDITION_SLUG-dev" JUDGE0_DEVELOPMENT_IMAGES="$JUDGE0_DEVELOPMENT_IMAGES $JUDGE0_DOCKER_REPOSITORY:$JUDGE0_VERSION$JUDGE0_EDITION_SLUG-dev" fi env | grep JUDGE0_ | sort pushd "$JUDGE0_PROJECT_ROOT" function build_and_tag() { local _target=$1 local _images=($2) local _main_image=${_images[0]} set -xe docker build -t $_main_image $_cache --target $_target . set +xe for (( i=0; i<${#_images[@]}; i++ )) do docker tag $_main_image ${_images[i]} done } build_and_tag production "$JUDGE0_PRODUCTION_IMAGES" build_and_tag development "$JUDGE0_DEVELOPMENT_IMAGES" _command="$1" if [[ "$_command" == "publish" ]]; then if [[ "$JUDGE0_VERSION" == "" ]]; then _die "Cannot publish untagged version." fi _push_images() { local _images=($1) for (( i=1; i<${#_images[@]}; i++ )) do docker push ${_images[i]} done } _push_images "$JUDGE0_PRODUCTION_IMAGES" _push_images "$JUDGE0_DEVELOPMENT_IMAGES" fi _untag() { local _images=($1) for (( i=0; i<${#_images[@]}-1; i++ )) do docker rmi ${_images[i]} done } _untag "$JUDGE0_PRODUCTION_IMAGES" _untag "$JUDGE0_DEVELOPMENT_IMAGES" popd