128 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			128 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
#!/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 "$@"
 |