108 lines
2.8 KiB
Bash
Executable File
108 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
image="chewingbever/fej"
|
|
# Should be either dev or rel
|
|
mode="dev"
|
|
action=""
|
|
attach="--detach"
|
|
|
|
while getopts ":i:m:a:l" c; do
|
|
case $c in
|
|
i ) image="$OPTARG" ;;
|
|
m ) mode="$OPTARG" ;;
|
|
a ) action="$OPTARG" ;;
|
|
l ) attach="" ;;
|
|
? ) exit 1 ;;
|
|
esac
|
|
done
|
|
shift $((OPTIND-1))
|
|
|
|
# Extract current version from Cargo.toml & get current branch
|
|
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/'`
|
|
branch=`git rev-parse --abbrev-ref HEAD`
|
|
|
|
if [[ "$branch" = "master" ]]; then
|
|
tags=("$patch_version" "$minor_version" "$major_version" "latest")
|
|
|
|
elif [[ "$branch" = "develop" ]]; then
|
|
tags=("$patch_version-dev" "$minor_version-dev" "$major_version-dev" "dev")
|
|
|
|
else
|
|
tags=("$branch")
|
|
|
|
fi
|
|
|
|
# First, we build the builder
|
|
DOCKER_BUILDKIT=1 docker build -f docker/Dockerfile.builder -t "$image-builder:latest" .
|
|
|
|
# Run the actual build command
|
|
if [ "$mode" = "rel" ]; then
|
|
DOCKER_BUILDKIT=1 docker build -t "$image:$tags" -f docker/Dockerfile.rel .
|
|
|
|
elif [[ "$mode" = "dev" ]]; then
|
|
DOCKER_BUILDKIT=1 docker build -t "$image-dev:$tags" -f docker/Dockerfile.dev .
|
|
|
|
else
|
|
>&2 echo "Invalid mode."
|
|
exit 1
|
|
|
|
fi
|
|
|
|
if [[ "$action" = push ]]; then
|
|
[[ "$branch" =~ ^develop|master$ ]] || {
|
|
>&2 echo "You can only push from develop or master."
|
|
exit 2
|
|
}
|
|
|
|
[[ "$mode" = "rel" ]] || {
|
|
>&2 echo "You can only push release builds."
|
|
exit 3
|
|
}
|
|
|
|
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
|
|
|
|
elif [[ "$action" = run ]]; then
|
|
# Create the network & start the database container
|
|
docker network create fej
|
|
docker volume create fej_db-data
|
|
|
|
docker run --rm \
|
|
--detach \
|
|
--name fej_db \
|
|
--network fej \
|
|
-e "POSTGRES_DB=fej" \
|
|
-e "POSTGRES_USER=fej" \
|
|
-e "POSTGRES_PASSWORD=fej" \
|
|
-v 'fej_db-data:/var/lib/postgresql/data' \
|
|
postgres:13-alpine
|
|
|
|
if [[ "$mode" = "dev" ]]; then
|
|
# Create caching volumes if needed (they need to be named)
|
|
docker volume create fej_build-cache
|
|
docker volume create fej_registry-cache
|
|
|
|
flags="-v fej_build-cache:/usr/src/app/target -v fej_registry-cache:/root/.cargo/registry"
|
|
fi
|
|
|
|
docker run $attach $flags \
|
|
--rm \
|
|
--interactive \
|
|
--tty \
|
|
--publish 8000:8000 \
|
|
--name fej \
|
|
--env-file .env \
|
|
--network fej \
|
|
"$image$([[ "$mode" != "rel" ]] && echo "-dev"):$tags" "$@"
|
|
fi
|