249 lines
4.9 KiB
Bash
Executable File
249 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
OUT_DIR="$(realpath "$SCRIPT_DIR/../out/")"
|
|
|
|
cd "$SCRIPT_DIR/../"
|
|
|
|
# ===== CONFIG TABLE =====
|
|
# Add supported concrete builds here.
|
|
# format: kube=crio
|
|
CONFIGS=(
|
|
"v1.33.3=cri-o.arm64.v1.33.3"
|
|
"v1.34.1=cri-o.arm64.v1.34.1"
|
|
"v1.35.3=cri-o.arm64.v1.35.2"
|
|
)
|
|
|
|
# ===== HELPERS =====
|
|
|
|
strip_v() {
|
|
echo "${1#v}"
|
|
}
|
|
|
|
minor_of_version() {
|
|
# input: 1.35.3 or v1.35.3
|
|
local v="${1#v}"
|
|
IFS='.' read -r major minor patch <<< "$v"
|
|
echo "$major.$minor"
|
|
}
|
|
|
|
version_sort() {
|
|
sort -t. -k1,1n -k2,2n -k3,3n
|
|
}
|
|
|
|
list_configs() {
|
|
echo "Available build targets:"
|
|
for c in "${CONFIGS[@]}"; do
|
|
local kube="${c%%=*}"
|
|
local crio="${c##*=}"
|
|
echo " ${kube#v} (CRI-O: $crio)"
|
|
done
|
|
}
|
|
|
|
list_minors() {
|
|
echo "Latest supported target per minor:"
|
|
latest_per_minor | while read -r kube crio; do
|
|
echo " ${kube#v} (CRI-O: $crio)"
|
|
done
|
|
}
|
|
|
|
latest_per_minor() {
|
|
# Output lines: <kube> <crio>
|
|
local minors
|
|
minors="$(
|
|
for c in "${CONFIGS[@]}"; do
|
|
kube="${c%%=*}"
|
|
minor_of_version "$kube"
|
|
done | sort -uV
|
|
)"
|
|
|
|
while read -r minor; do
|
|
[ -n "$minor" ] || continue
|
|
resolve_minor "$minor"
|
|
done <<< "$minors"
|
|
}
|
|
|
|
resolve_exact() {
|
|
local target="$1"
|
|
local target_v="v${target#v}"
|
|
|
|
for c in "${CONFIGS[@]}"; do
|
|
local kube="${c%%=*}"
|
|
local crio="${c##*=}"
|
|
if [[ "$kube" == "$target_v" ]]; then
|
|
echo "$kube $crio"
|
|
return 0
|
|
fi
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
resolve_minor() {
|
|
# input: 1.35 or v1.35
|
|
local want_minor
|
|
want_minor="$(minor_of_version "${1#v}.0")"
|
|
|
|
local matches=()
|
|
local c kube crio
|
|
for c in "${CONFIGS[@]}"; do
|
|
kube="${c%%=*}"
|
|
crio="${c##*=}"
|
|
if [[ "$(minor_of_version "$kube")" == "$want_minor" ]]; then
|
|
matches+=("${kube}=${crio}")
|
|
fi
|
|
done
|
|
|
|
if [[ ${#matches[@]} -eq 0 ]]; then
|
|
return 1
|
|
fi
|
|
|
|
local latest_kube
|
|
latest_kube="$(
|
|
for c in "${matches[@]}"; do
|
|
echo "${c%%=*#}" | sed 's/^v//'
|
|
done | version_sort | tail -n1
|
|
)"
|
|
|
|
resolve_exact "$latest_kube"
|
|
}
|
|
|
|
build_exact() {
|
|
local target="$1"
|
|
local resolved
|
|
if ! resolved="$(resolve_exact "$target")"; then
|
|
echo "❌ Unknown exact target: $target" >&2
|
|
echo >&2
|
|
list_configs >&2
|
|
exit 1
|
|
fi
|
|
|
|
local kube crio
|
|
read -r kube crio <<< "$resolved"
|
|
|
|
echo ">>> Building Kubernetes $kube with $crio"
|
|
make release CRIO_VERSION="$crio" KUBE_VERSION="$kube"
|
|
}
|
|
|
|
build_minor() {
|
|
local minor="$1"
|
|
local resolved
|
|
if ! resolved="$(resolve_minor "$minor")"; then
|
|
echo "❌ No supported target found for minor: $minor" >&2
|
|
echo >&2
|
|
list_minors >&2
|
|
exit 1
|
|
fi
|
|
|
|
local kube crio
|
|
read -r kube crio <<< "$resolved"
|
|
|
|
echo ">>> Minor $minor resolved to latest supported target ${kube#v}"
|
|
echo ">>> Building Kubernetes $kube with $crio"
|
|
make release CRIO_VERSION="$crio" KUBE_VERSION="$kube"
|
|
}
|
|
|
|
build_range() {
|
|
# input like 1.33-1.35
|
|
local range="$1"
|
|
local start="${range%-*}"
|
|
local end="${range#*-}"
|
|
|
|
local start_minor="${start#v}"
|
|
local end_minor="${end#v}"
|
|
|
|
local any=0
|
|
while read -r minor; do
|
|
[ -n "$minor" ] || continue
|
|
|
|
# simple lexical-safe because format is N.N and sort -V was used
|
|
if [[ "$(printf '%s\n%s\n' "$start_minor" "$minor" | sort -V | head -n1)" != "$start_minor" ]]; then
|
|
continue
|
|
fi
|
|
if [[ "$(printf '%s\n%s\n' "$minor" "$end_minor" | sort -V | head -n1)" != "$minor" ]]; then
|
|
continue
|
|
fi
|
|
|
|
any=1
|
|
build_minor "$minor"
|
|
done < <(
|
|
for c in "${CONFIGS[@]}"; do
|
|
kube="${c%%=*}"
|
|
minor_of_version "$kube"
|
|
done | sort -uV
|
|
)
|
|
|
|
if [[ $any -eq 0 ]]; then
|
|
echo "❌ No supported minors found in range: $range" >&2
|
|
echo >&2
|
|
list_minors >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
build_all() {
|
|
local c kube crio
|
|
for c in "${CONFIGS[@]}"; do
|
|
kube="${c%%=*}"
|
|
crio="${c##*=}"
|
|
echo ">>> Building Kubernetes $kube with $crio"
|
|
make release CRIO_VERSION="$crio" KUBE_VERSION="$kube"
|
|
done
|
|
}
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
Usage:
|
|
./devtools/build-all.sh
|
|
./devtools/build-all.sh list
|
|
./devtools/build-all.sh list-minors
|
|
./devtools/build-all.sh 1.35.3
|
|
./devtools/build-all.sh 1.35
|
|
./devtools/build-all.sh 1.33-1.35
|
|
|
|
Behavior:
|
|
no args Build all configured targets
|
|
list List all exact configured targets
|
|
list-minors List latest supported target per minor
|
|
X.Y.Z Build exact version
|
|
X.Y Build latest supported patch in that minor
|
|
X.Y-A.B Build latest supported patch for each minor in range
|
|
EOF
|
|
}
|
|
|
|
# ===== ENTRY =====
|
|
|
|
if [[ $# -eq 0 ]]; then
|
|
echo "No target specified -> building all configured targets"
|
|
build_all
|
|
exit 0
|
|
fi
|
|
|
|
case "$1" in
|
|
list)
|
|
list_configs
|
|
;;
|
|
list-minors)
|
|
list_minors
|
|
;;
|
|
-*|--help|help)
|
|
usage
|
|
;;
|
|
*-*)
|
|
build_range "$1"
|
|
;;
|
|
*.*.*)
|
|
build_exact "$1"
|
|
;;
|
|
*.*)
|
|
build_minor "$1"
|
|
;;
|
|
*)
|
|
echo "❌ Unrecognized target: $1" >&2
|
|
echo >&2
|
|
usage >&2
|
|
exit 1
|
|
;;
|
|
esac
|