#!/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:-zot.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