122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
#!/usr/bin/env bash
 | 
						|
 | 
						|
image='chewingbever/fej'
 | 
						|
 | 
						|
# 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
 | 
						|
        echo "$c"
 | 
						|
        case $c in
 | 
						|
            b ) build_builder=1 ;;
 | 
						|
            r ) release=1 ;;
 | 
						|
        esac
 | 
						|
    done
 | 
						|
    shift $((OPTIND-1))
 | 
						|
 | 
						|
    if [[ "$build_builder" -eq 1 ]]; then
 | 
						|
        # We always rebuild the builder before we run any compose command
 | 
						|
        DOCKER_BUILDKIT=1 docker build \
 | 
						|
            -f docker/Dockerfile.builder \
 | 
						|
            -t "$image-builder:latest" . || {
 | 
						|
                >&2 echo "Failed to build builder.";
 | 
						|
                exit 1;
 | 
						|
            }
 | 
						|
    fi
 | 
						|
 | 
						|
    if [[ "$release" -eq 1 ]]; then
 | 
						|
        DOCKER_BUILDKIT=1 COMPOSE_DOCKER_CLI_BUILD=1 docker-compose \
 | 
						|
            --file docker/docker-compose.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
 | 
						|
}
 | 
						|
 | 
						|
# 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 ;;
 | 
						|
 | 
						|
        # Running
 | 
						|
        r | run ) dcr run --bin "$bin" && dc -- logs -f app ;;
 | 
						|
        rr | run-release ) dc -br -- run --build --detach ;;
 | 
						|
        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 ;;
 | 
						|
        t | test ) dc test --no-fail-fast  ;;
 | 
						|
        * ) >&2 echo "Invalid command."; exit 1 ;;
 | 
						|
    esac
 | 
						|
}
 | 
						|
 | 
						|
main "$@"
 |