#!/usr/bin/env bash # Runs `make test package watchapp` inside the local build-image # container, mirroring what the Gitea Actions build workflow does - # useful for testing build-image changes locally before pushing # anything to cr.ladkau.de. # # Usage: ./run-image.sh [VERSION] # VERSION is passed through to `make` (see the Makefile's `package`/ # `watchapp` targets); omit it for their own git-tag-based default. set -euo pipefail cd "$(dirname "${BASH_SOURCE[0]}")" ROOT="$(pwd)" fail() { echo "PREFLIGHT FAIL: $*" >&2; exit 1; } command -v docker >/dev/null 2>&1 \ || fail "docker not found in PATH" [ -f "$ROOT/registry.env" ] \ || fail "registry.env not found — copy registry.env.example to registry.env and fill in your cr.ladkau.de credentials" # shellcheck disable=SC1091 source "$ROOT/registry.env" : "${REGISTRY_IMAGE:?registry.env must set REGISTRY_IMAGE}" IMAGE_TAG="$(<"$ROOT/build-image/VERSION")" [ -n "$IMAGE_TAG" ] || fail "build-image/VERSION is empty" IMAGE="$REGISTRY_IMAGE:$IMAGE_TAG" docker image inspect "$IMAGE" >/dev/null 2>&1 \ || fail "$IMAGE not found locally — run ./build-image.sh first" VERSION="${1:-${VERSION:-}}" # CI always starts from a fresh checkout, but this script bind-mounts the # live host repo — so build output left over from a previous local run # (build/, dist/, watch/build, and the generated watch resources below) # would make this run skip work a real fresh checkout wouldn't, silently # hiding bugs that only show up in CI. Wipe them first so every run # exercises a true from-scratch build, same as CI. echo "== Cleaning generated build artifacts for a fresh build ==" rm -rf \ "$ROOT/build" "$ROOT/dist" "$ROOT/watch/build" \ "$ROOT/watch/resources/img" "$ROOT/watch/resources/app_icon.png" \ "$ROOT/watch/src/c/i18n_tables.auto.c" echo "== Running make test package watchapp inside $IMAGE ==" # The container runs as root (needed for the toolchain baked into the # image), so anything it writes into this bind mount — dist/, build/, # watch/build, etc. — would otherwise come back owned by root, leaving # the host repo unusable without sudo. Chown everything back to the host # user on exit, whether the build succeeds or fails. docker run --rm \ -v "$ROOT:/workspace" \ -w /workspace \ -e VERSION="$VERSION" \ -e HOST_UID="$(id -u)" \ -e HOST_GID="$(id -g)" \ "$IMAGE" \ bash -c ' git config --global --add safe.directory /workspace trap "chown -R \"$HOST_UID:$HOST_GID\" /workspace" EXIT make test package watchapp ' echo "== Done — artifacts in dist/ ==" ls -la "$ROOT/dist"