Blob: scripts/build-in-container.sh
Raw · Blame
#!/bin/sh
set -eu
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
repo_dir=$(dirname "$script_dir")
source_parent=$(dirname "$repo_dir")
output_dir=${MOUSE_BUILD_DIR:-"$repo_dir/build"}
if [ -n "${MOUSE_BUILDER_PLATFORM:-}" ]; then
builder_platform=$MOUSE_BUILDER_PLATFORM
else
case "$(uname -m)" in
arm64|aarch64) builder_platform=linux/arm64 ;;
x86_64|amd64) builder_platform=linux/amd64 ;;
*)
printf '%s\n' "unsupported container host architecture: $(uname -m)" >&2
exit 1
;;
esac
fi
if [ ! -d "$source_parent/cheesed" ]; then
printf '%s\n' "cheesed source tree not found: $source_parent/cheesed" >&2
exit 1
fi
if [ -n "${CONTAINER_CLI:-}" ]; then
container_cli=$CONTAINER_CLI
elif command -v container >/dev/null 2>&1; then
container_cli=$(command -v container)
elif [ -x /usr/local/bin/container ]; then
container_cli=/usr/local/bin/container
elif command -v docker >/dev/null 2>&1; then
container_cli=$(command -v docker)
elif command -v podman >/dev/null 2>&1; then
container_cli=$(command -v podman)
else
printf '%s\n' "no supported container CLI found (container, docker, or podman)" >&2
exit 1
fi
case "$(basename "$container_cli")" in
container)
"$container_cli" system start >/dev/null
;;
esac
mkdir -p "$output_dir"
build_context=$(mktemp -d "$output_dir/.container-context.XXXXXX")
build_context=$(CDPATH= cd -- "$build_context" && pwd)
export_dir=$(mktemp -d "$output_dir/.container-output.XXXXXX")
export_dir=$(CDPATH= cd -- "$export_dir" && pwd)
cleanup() {
rm -rf "$build_context" "$export_dir"
}
trap cleanup EXIT HUP INT TERM
(
cd "$source_parent"
tar -cf - \
--exclude='mouse-src/.git/*' \
--exclude='mouse-src/build/*' \
--exclude='mouse-src/sources/*' \
--exclude='mouse-src/Containerfile' \
--exclude='mouse-src/.containerignore' \
--exclude='mouse-src/scripts/build-in-container.sh' \
--exclude='cheesed/.git/*' \
--exclude='cheesed/target/*' \
mouse-src cheesed
) | tar -xf - -C "$build_context"
cp "$repo_dir/Containerfile" "$build_context/Dockerfile"
cp "$repo_dir/.containerignore" "$build_context/.dockerignore"
(
cd "$build_context"
"$container_cli" build \
--platform "$builder_platform" \
--output "type=local,dest=$export_dir" \
.
)
artifacts_dir=$export_dir
if [ ! -f "$artifacts_dir/vmlinuz-virt" ]; then
platform_dir=$(printf '%s\n' "$builder_platform" | tr / _)
artifacts_dir="$export_dir/out.tar/$platform_dir"
fi
for artifact in vmlinuz-virt mouse-initramfs.cpio.gz; do
if [ ! -f "$artifacts_dir/$artifact" ]; then
printf '%s\n' "container build did not export $artifact" >&2
exit 1
fi
install -m 0644 "$artifacts_dir/$artifact" "$output_dir/$artifact"
done
printf '%s\n' "exported $output_dir/vmlinuz-virt"
printf '%s\n' "exported $output_dir/mouse-initramfs.cpio.gz"