90 lines
2.4 KiB
Bash
Executable File
90 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -Eeuo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
|
|
if [[ -f "$SCRIPT_DIR/.env" ]]; then
|
|
set -a
|
|
# shellcheck disable=SC1091
|
|
source "$SCRIPT_DIR/.env"
|
|
set +a
|
|
fi
|
|
|
|
REGISTRY="${REGISTRY:-oci.linuxiarz.pl}"
|
|
IMAGE_NAME="${IMAGE_NAME:-gree-controller}"
|
|
DISTRO="${DISTRO:-trixie}"
|
|
BUILDER="${BUILDER:-gree-controller-multiarch}"
|
|
BUILDER_CONFIG="${BUILDER_CONFIG:-}"
|
|
ACTION="${1:-push}"
|
|
|
|
VERSION="$(awk -F '"' '/^version = "/ {print $2; exit}' "$PROJECT_ROOT/Cargo.toml")"
|
|
[[ -n "$VERSION" ]] || { echo "Cannot determine version from Cargo.toml" >&2; exit 1; }
|
|
|
|
case "$DISTRO" in
|
|
trixie|alpine) ;;
|
|
*) echo "DISTRO must be one of: trixie, alpine" >&2; exit 2 ;;
|
|
esac
|
|
|
|
IMAGE_REPO="${REGISTRY%/}/${IMAGE_NAME#/}"
|
|
IMAGE_TAG="${IMAGE_REPO}:${VERSION}"
|
|
|
|
"$SCRIPT_DIR/render-repository.sh"
|
|
|
|
if [[ "$ACTION" == "render" ]]; then
|
|
exit 0
|
|
fi
|
|
|
|
command -v docker >/dev/null 2>&1 || { echo "docker is required" >&2; exit 1; }
|
|
docker buildx version >/dev/null 2>&1 || { echo "docker buildx is required" >&2; exit 1; }
|
|
|
|
ensure_builder() {
|
|
if docker buildx inspect "$BUILDER" >/dev/null 2>&1; then
|
|
docker buildx use "$BUILDER"
|
|
else
|
|
args=(create --name "$BUILDER" --driver docker-container --use)
|
|
if [[ -n "$BUILDER_CONFIG" ]]; then
|
|
args+=(--config "$BUILDER_CONFIG")
|
|
fi
|
|
docker buildx "${args[@]}" >/dev/null
|
|
fi
|
|
docker buildx inspect --bootstrap >/dev/null
|
|
}
|
|
|
|
ensure_builder
|
|
|
|
case "$ACTION" in
|
|
push)
|
|
docker buildx build \
|
|
--platform linux/amd64,linux/arm64 \
|
|
-f "$SCRIPT_DIR/Dockerfile" \
|
|
--target "runtime-${DISTRO}" \
|
|
--build-arg "BUILD_VERSION=$VERSION" \
|
|
-t "$IMAGE_TAG" \
|
|
--push \
|
|
"$PROJECT_ROOT"
|
|
printf 'Published %s using %s (amd64 + aarch64)\n' "$IMAGE_TAG" "$DISTRO"
|
|
;;
|
|
load)
|
|
arch="${2:-amd64}"
|
|
case "$arch" in
|
|
amd64) platform="linux/amd64" ;;
|
|
aarch64|arm64) platform="linux/arm64" ;;
|
|
*) echo "Usage: $0 load [amd64|aarch64]" >&2; exit 2 ;;
|
|
esac
|
|
docker buildx build \
|
|
--platform "$platform" \
|
|
-f "$SCRIPT_DIR/Dockerfile" \
|
|
--target "runtime-${DISTRO}" \
|
|
--build-arg "BUILD_VERSION=$VERSION" \
|
|
-t "${IMAGE_REPO}:local" \
|
|
--load \
|
|
"$PROJECT_ROOT"
|
|
printf 'Loaded %s:local for %s using %s\n' "$IMAGE_REPO" "$arch" "$DISTRO"
|
|
;;
|
|
*)
|
|
echo "Usage: $0 [push|load [amd64|aarch64]|render]" >&2
|
|
exit 2
|
|
;;
|
|
esac
|