Pin container toolchains for local module builds

This commit is contained in:
ms2k 2026-10-20 11:04:47 +09:00
commit 28494403f2

82
build.sh Executable file
View file

@ -0,0 +1,82 @@
#!/usr/bin/env bash
set -euo pipefail
usage() {
printf 'Usage: %s {client|server} [Gradle arguments...]\n' "$0"
}
case "${1:-}" in
client | server) module=$1; shift ;;
-h | --help) usage; exit 0 ;;
*) usage >&2; exit 2 ;;
esac
engine_mode() {
local state
case "$1" in
podman)
state=$("$1" info --format '{{.Host.Security.Rootless}}') || return
[[ $state == true ]] && printf rootless || printf rootful
;;
docker | nerdctl)
state=$("$1" info --format '{{json .SecurityOptions}}') || return
[[ $state == *'"name=rootless"'* ]] && printf rootless || printf rootful
;;
esac
}
engine=${CONTAINER_ENGINE:-}
if [[ -n $engine ]]; then
case "$engine" in
podman | nerdctl | docker) ;;
*) printf 'Unsupported container engine: %s\n' "$engine" >&2; exit 2 ;;
esac
kind=$(engine_mode "$engine")
else
fallback=
for candidate in podman nerdctl docker; do
command -v "$candidate" >/dev/null || continue
kind=$(engine_mode "$candidate" 2>/dev/null) || continue
if [[ $kind == rootless ]]; then
engine=$candidate
break
fi
[[ -n $fallback ]] || fallback=$candidate
done
if [[ -z $engine ]]; then
engine=$fallback
kind=rootful
fi
fi
if [[ -z $engine ]]; then
printf 'No working Podman, nerdctl or Docker engine found.\n' >&2
exit 1
fi
printf 'Building %s with %s (%s)\n' "$module" "$engine" "$kind" >&2
repo=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
cache="${XDG_CACHE_HOME:-$HOME/.cache}/saltatory/gradle"
mkdir -p -- "$cache"
image_file=$(mktemp)
trap 'rm -f -- "$image_file"' EXIT
build=(build --quiet --iidfile "$image_file" --tag localhost/saltatory-build --file "$repo/Containerfile")
[[ $engine != podman ]] || build+=(--layers)
"$engine" "${build[@]}" "$repo" >/dev/null
image=$(<"$image_file")
rm -- "$image_file"
trap - EXIT
user=(--user "$(id -u):$(id -g)")
if [[ $kind == rootless ]]; then
case "$engine" in
podman) user=(--userns keep-id "${user[@]}") ;;
docker | nerdctl) user=(--user 0:0) ;;
esac
fi
exec "$engine" run --rm --init \
--label saltatory.build=true \
"${user[@]}" \
--cap-drop ALL --security-opt no-new-privileges \
--mount "type=bind,src=$repo,dst=/workspace" \
--mount "type=bind,src=$cache,dst=/cache/gradle" \
"$image" ":$module:build" "$@"