Spaces:
Build error
Build error
#!/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 | |