#!/usr/bin/env bash image='chewingbever/fej' # Creates the needed images # # $1: wether to build the debug or the release image (default debug) function create_images() { # First, we build the builder DOCKER_BUILDKIT=1 docker build \ -f docker/Dockerfile.builder \ -t "$image-builder:latest" . if [[ "$1" = "rel" ]]; then DOCKER_BUILDKIT=1 docker build \ -t "$image:latest" \ -f docker/Dockerfile.rel . else # Then, we create the debug image DOCKER_BUILDKIT=1 docker build \ -t "$image:dev" \ -f docker/Dockerfile.dev . fi } # Execute the debug image (must be built first) # # $@: the arguments to pass to the image (passed as arguments to cargo) function run_image() { # Run the database image docker run --rm \ --detach \ --name fej_db \ --network fej \ -p 5432:5432 \ -e 'POSTGRES_DB=fej' \ -e 'POSTGRES_USER=fej' \ -e 'POSTGRES_PASSWORD=fej' \ -v 'fej_db-data:/var/lib/postgresql/data' \ postgres:13-alpine # Run the binary image docker run \ --detach \ --rm \ --interactive \ --tty \ --publish 8000:8000 \ --name fej \ --env-file .env.container \ --network fej \ -v 'fej_build-cache:/usr/src/app/target' \ -v 'fej_registry-cache:/root/.cargo/registry' \ "$image:dev" "$@" } # Attach to the fej container function logs() { docker logs -f fej } # Builds the given binary # # $1: the binary to build function build() { create_images run_image build --bin "$1" logs } # Runs the given binary # # $1: the binary to run function run() { create_images run_image run --bin "$1" logs } # Runs the tests function tests() { create_images run_image test --no-fail-fast logs } # Stops both containers function stop() { docker stop fej_db docker stop -t 0 fej } function run_release() { echo "Not implemented" } # Tags & pushes the release version to Docker Hub function publish() { branch=`git rev-parse --abbrev-ref HEAD` if [[ "$branch" != master ]]; then >&2 echo "You can only publish from master." exit 2 fi patch_version=`grep -Po '(?<=version = ").*(?=")' Cargo.toml | head -n1` major_version=`echo "$patch_version" | sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1/'` minor_version=`echo "$patch_version" | sed -E 's/([0-9]+).([0-9]+).([0-9]+)/\1.\2/'` tags=("latest" "$patch_version" "$minor_version" "$major_version") for tag in "${tags[@]}"; do # Create the tag docker tag "$image:$tags" "$image:$tag" # Push the tag docker push "$image:$tag" # Remove the tag again, if it's not the main tag [[ "$tag" != "$tags" ]] && docker rmi "$image:$tag" done } # Entrypoint to the script # # $1: action to perform, defaults to 'build' # $2: binary to use, defaults to 'server' function main() { # Default values cmd="${1:-build}" bin="${2:-server}" case $cmd in b | build ) build "$bin" ;; br | build-release ) create_images rel ;; r | run ) run "$bin" ;; rr | run-release ) run_release ;; p | push | publish ) publish ;; t | test ) tests ;; s | stop ) stop ;; p | push | publish ) publish ;; * ) >&2 echo "Invalid command."; exit 1 ;; esac } main "$@"