Some checks failed
Mark stable commit / test-unit (push) Has been cancelled
Mark stable commit / test-integration (push) Has been cancelled
Mark stable commit / test-env-virtual (push) Has been cancelled
Mark stable commit / test-env-nix (push) Has been cancelled
Mark stable commit / test-e2e (push) Has been cancelled
Mark stable commit / test-virgin-user (push) Has been cancelled
Mark stable commit / test-virgin-root (push) Has been cancelled
Mark stable commit / mark-stable (push) Has been cancelled
Refactor Dockerfile into multi-stage virgin/full targets and introduce a single flag-based image build script. Standardize image naming, remove redundant build scripts, and update Makefile targets accordingly. CI workflows now build missing virgin images and run root and user tests consistently across all supported distributions. https://chatgpt.com/share/693c29d9-9b28-800f-a549-5661c783d968
121 lines
3.3 KiB
Bash
Executable File
121 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# Unified docker image builder for all distros.
|
|
#
|
|
# Supports:
|
|
# --missing Build only if image does not exist
|
|
# --no-cache Disable docker layer cache
|
|
# --target Dockerfile target (e.g. virgin|full)
|
|
# --tag Override image tag (default: pkgmgr-$distro[-$target])
|
|
#
|
|
# Requires:
|
|
# - env var: distro (arch|debian|ubuntu|fedora|centos)
|
|
# - base.sh in same dir
|
|
#
|
|
# Examples:
|
|
# distro=arch bash scripts/build/image.sh
|
|
# distro=arch bash scripts/build/image.sh --no-cache
|
|
# distro=arch bash scripts/build/image.sh --missing
|
|
# distro=arch bash scripts/build/image.sh --target virgin
|
|
# distro=arch bash scripts/build/image.sh --target virgin --missing
|
|
# distro=arch bash scripts/build/image.sh --tag myimg:arch
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
# shellcheck source=/dev/null
|
|
source "${SCRIPT_DIR}/base.sh"
|
|
|
|
: "${distro:?Environment variable 'distro' must be set (arch|debian|ubuntu|fedora|centos)}"
|
|
|
|
NO_CACHE=0
|
|
MISSING_ONLY=0
|
|
TARGET=""
|
|
IMAGE_TAG="" # derive later unless --tag is provided
|
|
|
|
usage() {
|
|
local default_tag="pkgmgr-${distro}"
|
|
if [[ -n "${TARGET:-}" ]]; then
|
|
default_tag="${default_tag}-${TARGET}"
|
|
fi
|
|
|
|
cat <<EOF
|
|
Usage: distro=<distro> $0 [--missing] [--no-cache] [--target <name>] [--tag <image>]
|
|
|
|
Options:
|
|
--missing Build only if the image does not already exist
|
|
--no-cache Build with --no-cache
|
|
--target <name> Build a specific Dockerfile target (e.g. virgin|full)
|
|
--tag <image> Override the output image tag (default: ${default_tag})
|
|
-h, --help Show help
|
|
EOF
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--no-cache) NO_CACHE=1; shift ;;
|
|
--missing) MISSING_ONLY=1; shift ;;
|
|
--target)
|
|
TARGET="${2:-}"
|
|
if [[ -z "${TARGET}" ]]; then
|
|
echo "ERROR: --target requires a value (e.g. virgin|full)" >&2
|
|
exit 2
|
|
fi
|
|
shift 2
|
|
;;
|
|
--tag)
|
|
IMAGE_TAG="${2:-}"
|
|
if [[ -z "${IMAGE_TAG}" ]]; then
|
|
echo "ERROR: --tag requires a value" >&2
|
|
exit 2
|
|
fi
|
|
shift 2
|
|
;;
|
|
-h|--help) usage; exit 0 ;;
|
|
*)
|
|
echo "ERROR: Unknown argument: $1" >&2
|
|
usage
|
|
exit 2
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Auto-tag: if --tag not provided, derive from distro (+ target suffix)
|
|
if [[ -z "${IMAGE_TAG}" ]]; then
|
|
IMAGE_TAG="pkgmgr-${distro}"
|
|
if [[ -n "${TARGET}" ]]; then
|
|
IMAGE_TAG="${IMAGE_TAG}-${TARGET}"
|
|
fi
|
|
fi
|
|
|
|
BASE_IMAGE="$(resolve_base_image "$distro")"
|
|
|
|
if [[ "${MISSING_ONLY}" == "1" ]]; then
|
|
if docker image inspect "${IMAGE_TAG}" >/dev/null 2>&1; then
|
|
echo "[build] Image already exists: ${IMAGE_TAG} (skipping due to --missing)"
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
echo
|
|
echo "------------------------------------------------------------"
|
|
echo "[build] Building image: ${IMAGE_TAG}"
|
|
echo "distro = ${distro}"
|
|
echo "BASE_IMAGE = ${BASE_IMAGE}"
|
|
if [[ -n "${TARGET}" ]]; then echo "target = ${TARGET}"; fi
|
|
if [[ "${NO_CACHE}" == "1" ]]; then echo "cache = disabled"; fi
|
|
echo "------------------------------------------------------------"
|
|
|
|
build_args=(--build-arg "BASE_IMAGE=${BASE_IMAGE}")
|
|
|
|
if [[ "${NO_CACHE}" == "1" ]]; then
|
|
build_args+=(--no-cache)
|
|
fi
|
|
|
|
if [[ -n "${TARGET}" ]]; then
|
|
build_args+=(--target "${TARGET}")
|
|
fi
|
|
|
|
build_args+=(-t "${IMAGE_TAG}" .)
|
|
|
|
docker build "${build_args[@]}"
|