#!/usr/bin/env bash image='chewingbever/fej' web_dir='web' # Small wrapper around the docker-compose command # # Flags: # -b: build the builder # -r: use the release image instead function dc() { local OPTIND c build_builder release while getopts ":br" c; do case $c in b ) build_builder=1 ;; r ) release=1 ;; esac done shift $((OPTIND-1)) if [[ "$release" -eq 1 ]]; then DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker-compose \ --file docker/docker-compose.yml \ --file docker/docker-compose.override.yml \ --project-name fej \ "$@" else DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker-compose \ --file docker/docker-compose.yml \ --file docker/docker-compose.dev.yml \ --project-name fej-dev \ "$@" fi } # Execute the debug image (must be built first) # # $@: the arguments to pass to the image (passed as arguments to cargo) function dcr() { CMD="$@" dc -b -- up \ --build \ --detach } # Publish the builder image function publish_builder() { DOCKER_BUILDKIT=1 docker build \ -f docker/Dockerfile.builder \ -t "$image-builder:latest" . || { >&2 echo "Failed to build builder."; exit 1; } docker push "$image-builder:latest" } # Tags & pushes the release version to Docker Hub function publish() { local branch=`git rev-parse --abbrev-ref HEAD` if [[ "$branch" != master ]]; then >&2 echo "You can only publish from master." exit 2 fi # Build the release images dc -br build local patch_version=`grep -Po '(?<=version = ").*(?=")' Cargo.toml | head -n1` local major_version=`echo "$patch_version" | sed -E 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1/'` local minor_version=`echo "$patch_version" | sed -E 's/([0-9]+).([0-9]+).([0-9]+)/\1.\2/'` local 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 local cmd="${1:-build}" local bin="${2:-server}" case $cmd in # Building b | build ) dcr build --bin "$bin" && dc -- logs -f app ;; br | build-release ) dc -br build ;; bf | build-frontend ) cd "$web_dir" && yarn run build ;; # Running r | run ) dcr run --bin "$bin" && dc -- logs -f app ;; rr | run-release ) dc -br -- up --build --detach && dc -r -- logs -f app ;; rf | run-frontend ) dcr run --bin server && cd "$web_dir" && yarn run dev ;; s | stop ) dc down ;; sr | stop-release ) dc -r stop ;; # Ease of life psql ) dc -- exec db psql -U fej -d fej ;; sh ) dc -- exec app sh ;; # Misc docs ) cargo doc --no-deps ;; format ) cargo fmt ;; l | logs ) dc -- logs -f app ;; lint ) cargo fmt -- --check ;; p | push | publish ) publish ;; pb ) publish_builder ;; t | test ) dcr -- test --no-fail-fast && dc -- logs -f app ;; * ) >&2 echo "Invalid command."; exit 1 ;; esac } main "$@"