#!/usr/bin/env bash # Do the standalone scripts still install what rig pins? # # standalone/rigdeps.sh carries its toolchain pins inline, because it exists for # a machine that will never have ctrl/versions.env. That makes two copies of the # same versions and checksums, and two copies drift the day one is edited and # the other forgotten. This is the check that notices. # # ctrl/versions.env is the source of truth. Only the keys rigdeps.sh itself # defines are compared: versions.env also pins addon images (cert-manager, # metallb, metrics-server) that rigdeps.sh never installs, and demanding those # would make this fail forever for no reason. # # Exits non-zero on any mismatch — unlike the host checks, this one is a test. # # Usage: pins.sh set -euo pipefail cd "$(dirname "$0")" SOURCE=./versions.env COPY=../standalone/rigdeps.sh [ -r "$COPY" ] || { echo "no $COPY to compare" >&2; exit 1; } # KEY=value for the pin keys a file defines, quotes stripped. awk rather than a # grep regex, which is not the same program everywhere. pins() { awk -F= '/^[A-Z_]+_(VERSION|SHA256)=/ { v = substr($0, index($0, "=") + 1); gsub(/^["\x27]|["\x27]$/, "", v) print $1 "=" v }' "$1" } echo "pins: standalone/rigdeps.sh against ctrl/versions.env" bad=0 while IFS='=' read -r key copy_val; do [ -n "$key" ] || continue src_val=$(pins "$SOURCE" | sed -n "s/^${key}=//p" | head -1) if [ -z "$src_val" ]; then printf " ! %-16s in rigdeps.sh but not in versions.env\n" "$key" bad=1 elif [ "$src_val" = "$copy_val" ]; then printf " %-16s %s\n" "$key" "$( [ ${#src_val} -gt 20 ] && echo "${src_val:0:12}…" || echo "$src_val" )" else printf " ! %-16s versions.env %s\n" "$key" "$src_val" printf " %-16s rigdeps.sh %s\n" "" "$copy_val" bad=1 fi done < <(pins "$COPY") echo if [ "$bad" -eq 0 ]; then echo "in step — rigdeps.sh installs exactly what rig pins." else echo "DRIFT. versions.env is the source of truth: copy the differing lines from it" echo "into standalone/rigdeps.sh, taking checksums from the publisher's release list." exit 1 fi