fix(scripts): keep ISO artifacts out of the repo and auto-update README on release

This commit is contained in:
2026-08-07 18:31:20 -05:00
parent 825c3fbb4b
commit b64061135a
2 changed files with 86 additions and 25 deletions
+30
View File
@@ -283,6 +283,36 @@ git add VERSION
git commit -m "chore: bump VERSION to ${TAG} for ISO naming" || true git commit -m "chore: bump VERSION to ${TAG} for ISO naming" || true
echo -e " ${GREEN}${NC} VERSION file updated to ${VERSION}" echo -e " ${GREEN}${NC} VERSION file updated to ${VERSION}"
# ─────────────────────────────────────────────────────────────────────────────
# Step 2b: Auto-update README.md ISO download references
# ─────────────────────────────────────────────────────────────────────────────
echo
echo -e "${BLUE}Step 2b: Updating README.md ISO references to ${VERSION}...${NC}"
README_FILE="README.md"
if [ -f "$README_FILE" ]; then
# Extract the version currently used in the README's ISO filenames,
# e.g. "Sovran_SystemsOS-1.0.6.iso" -> "1.0.6"
OLD_ISO_VER=$(grep -oE 'Sovran_SystemsOS-[0-9]+\.[0-9]+\.[0-9]+\.iso' "$README_FILE" | head -1 | sed 's/Sovran_SystemsOS-//; s/\.iso//')
if [ -n "$OLD_ISO_VER" ] && [ "$OLD_ISO_VER" != "$VERSION" ]; then
# Portable in-place edit (works with GNU sed and BSD/macOS sed)
sed "s/Sovran_SystemsOS-${OLD_ISO_VER}/Sovran_SystemsOS-${VERSION}/g" \
"$README_FILE" > "$README_FILE.tmp" && mv "$README_FILE.tmp" "$README_FILE"
UPDATED=$(grep -c "Sovran_SystemsOS-${VERSION}" "$README_FILE")
echo -e " ${GREEN}${NC} README.md: ${OLD_ISO_VER} -> ${VERSION} (${UPDATED} references updated)"
git add "$README_FILE"
git commit -m "docs: update README ISO download links to ${TAG}" || true
echo -e " ${GREEN}${NC} Committed README update"
else
echo -e " ${YELLOW}${NC} README.md already references ${VERSION} or no versioned ISO links found — skipping"
fi
else
echo -e " ${YELLOW}${NC} README.md not found — skipping"
fi
# ───────────────────────────────────────────────────────────────────────────── # ─────────────────────────────────────────────────────────────────────────────
# Step 3: Auto-update CHANGELOG.md # Step 3: Auto-update CHANGELOG.md
# ───────────────────────────────────────────────────────────────────────────── # ─────────────────────────────────────────────────────────────────────────────
+56 -25
View File
@@ -7,7 +7,15 @@
# Usage: # Usage:
# ./scripts/upload-cdn.sh [--upload] # ./scripts/upload-cdn.sh [--upload]
# #
# EVERYTHING this script creates lives OUTSIDE the repository, even when you
# run it from inside the repo:
# - the nix build output symlink -> $ISO_OUT_DIR/result
# - the ISO and .sha256 files -> $ISO_OUT_DIR
# The repo working tree stays completely clean.
#
# Environment variables (optional): # Environment variables (optional):
# ISO_OUT_DIR - dir for the build symlink + ISO + checksum
# (default: ~/Sovran-builds)
# CDN_RSYNC_TARGET - rsync destination (e.g. user@server:/var/www/downloads/) # CDN_RSYNC_TARGET - rsync destination (e.g. user@server:/var/www/downloads/)
# CDN_RCLONE_REMOTE - rclone remote target (e.g. s3:my-bucket/downloads/) # CDN_RCLONE_REMOTE - rclone remote target (e.g. s3:my-bucket/downloads/)
# CDN_UPLOAD_CMD - custom upload command # CDN_UPLOAD_CMD - custom upload command
@@ -22,65 +30,88 @@ BLUE='\033[0;34m'
CYAN='\033[0;36m' CYAN='\033[0;36m'
NC='\033[0m' NC='\033[0m'
# Always operate from the repo root, no matter where the script is invoked from
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
cd "$REPO_ROOT"
# Read version from VERSION file # Read version from VERSION file
if [ ! -f VERSION ]; then if [ ! -f VERSION ]; then
echo -e "${RED}Error: VERSION file not found.${NC}" >&2 echo -e "${RED}Error: VERSION file not found in $REPO_ROOT.${NC}" >&2
exit 1 exit 1
fi fi
VERSION=$(cat VERSION | tr -d '\n\r ') VERSION=$(cat VERSION | tr -d '\n\r ')
ISO_NAME="Sovran_SystemsOS-${VERSION}.iso" ISO_NAME="Sovran_SystemsOS-${VERSION}.iso"
SHA_NAME="${ISO_NAME}.sha256" SHA_NAME="${ISO_NAME}.sha256"
# Output directory OUTSIDE the repo (override with ISO_OUT_DIR)
OUT_DIR="${ISO_OUT_DIR:-$HOME/Sovran-builds}"
mkdir -p "$OUT_DIR"
OUT_DIR="$(cd "$OUT_DIR" && pwd)"
ISO_PATH="$OUT_DIR/${ISO_NAME}"
SHA_PATH="$OUT_DIR/${SHA_NAME}"
RESULT_LINK="$OUT_DIR/result"
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ Sovran_SystemsOS CDN ISO Packaging & Upload Tool ║${NC}" echo -e "${BLUE}║ Sovran_SystemsOS CDN ISO Packaging & Upload Tool ║${NC}"
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}" echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
echo -e " Version : ${CYAN}${VERSION}${NC}" echo -e " Version : ${CYAN}${VERSION}${NC}"
echo -e " ISO : ${CYAN}${ISO_NAME}${NC}" echo -e " ISO : ${CYAN}${ISO_NAME}${NC}"
echo -e " Repo : ${CYAN}${REPO_ROOT}${NC} (left untouched)"
echo -e " Output : ${CYAN}${OUT_DIR}${NC} (outside the repo)"
echo echo
# Locate or build ISO # Locate or build ISO
SRC_ISO="" SRC_ISO=""
if [ -f "result/iso/${ISO_NAME}" ]; then if [ -f "$RESULT_LINK/iso/${ISO_NAME}" ]; then
SRC_ISO="result/iso/${ISO_NAME}" SRC_ISO="$RESULT_LINK/iso/${ISO_NAME}"
elif [ -f "$RESULT_LINK/iso/Sovran_SystemsOS.iso" ]; then
SRC_ISO="$RESULT_LINK/iso/Sovran_SystemsOS.iso"
elif [ -f "result/iso/${ISO_NAME}" ]; then
SRC_ISO="result/iso/${ISO_NAME}" # legacy: from an older in-repo build
elif [ -f "result/iso/Sovran_SystemsOS.iso" ]; then elif [ -f "result/iso/Sovran_SystemsOS.iso" ]; then
SRC_ISO="result/iso/Sovran_SystemsOS.iso" SRC_ISO="result/iso/Sovran_SystemsOS.iso"
else else
FOUND=$(find result -name "*.iso" 2>/dev/null | head -n 1 || true) FOUND=$(find "$RESULT_LINK" result -name "*.iso" 2>/dev/null | head -n 1 || true)
if [ -n "$FOUND" ]; then if [ -n "$FOUND" ]; then
SRC_ISO="$FOUND" SRC_ISO="$FOUND"
fi fi
fi fi
if [ -z "$SRC_ISO" ] || [ ! -f "$SRC_ISO" ]; then if [ -z "$SRC_ISO" ] || [ ! -f "$SRC_ISO" ]; then
echo -e "${YELLOW}Built ISO not found in result/. Building ISO via Nix...${NC}" echo -e "${YELLOW}Built ISO not found. Building via Nix (result link goes outside the repo)...${NC}"
nix build .#nixosConfigurations.sovran_systemsos-iso.config.system.build.isoImage rm -f "$RESULT_LINK"
nix build .#nixosConfigurations.sovran_systemsos-iso.config.system.build.isoImage \
if [ -f "result/iso/${ISO_NAME}" ]; then --out-link "$RESULT_LINK"
SRC_ISO="result/iso/${ISO_NAME}"
if [ -f "$RESULT_LINK/iso/${ISO_NAME}" ]; then
SRC_ISO="$RESULT_LINK/iso/${ISO_NAME}"
else else
FOUND=$(find result -name "*.iso" 2>/dev/null | head -n 1 || true) FOUND=$(find "$RESULT_LINK" -name "*.iso" 2>/dev/null | head -n 1 || true)
if [ -n "$FOUND" ]; then if [ -n "$FOUND" ]; then
SRC_ISO="$FOUND" SRC_ISO="$FOUND"
else
echo -e "${RED}Error: Failed to locate built ISO in result/.${NC}" >&2
exit 1
fi fi
fi fi
fi fi
echo -e "${BLUE}Step 1: Copying built ISO out of Nix store...${NC}" if [ -z "$SRC_ISO" ] || [ ! -f "$SRC_ISO" ]; then
cp -v "$SRC_ISO" "./${ISO_NAME}" echo -e "${RED}Error: Failed to locate built ISO.${NC}" >&2
echo -e " ${GREEN}${NC} Copied to ./${ISO_NAME}" exit 1
fi
echo -e "${BLUE}Step 1: Copying built ISO to output dir (outside repo)...${NC}"
cp -v "$SRC_ISO" "$ISO_PATH"
echo -e " ${GREEN}${NC} Copied to $ISO_PATH"
echo echo
echo -e "${BLUE}Step 2: Generating versioned SHA-256 checksum...${NC}" echo -e "${BLUE}Step 2: Generating versioned SHA-256 checksum...${NC}"
sha256sum "${ISO_NAME}" > "${SHA_NAME}" sha256sum "$ISO_PATH" > "$SHA_PATH"
echo -e " ${GREEN}${NC} Generated ${SHA_NAME}" echo -e " ${GREEN}${NC} Generated $SHA_PATH"
cat "${SHA_NAME}" cat "$SHA_PATH"
echo echo
echo -e "${BLUE}Step 3: Verifying checksum...${NC}" echo -e "${BLUE}Step 3: Verifying checksum...${NC}"
sha256sum --check "${SHA_NAME}" sha256sum --check "$SHA_PATH"
echo -e " ${GREEN}${NC} Checksum verified successfully" echo -e " ${GREEN}${NC} Checksum verified successfully"
# Parse arguments for upload # Parse arguments for upload
@@ -97,7 +128,7 @@ done
if [ "$DO_UPLOAD" -eq 1 ]; then if [ "$DO_UPLOAD" -eq 1 ]; then
echo echo
echo -e "${BLUE}Step 4: Uploading to CDN...${NC}" echo -e "${BLUE}Step 4: Uploading to CDN...${NC}"
UPLOADED=0 UPLOADED=0
if [ -n "${CDN_UPLOAD_CMD:-}" ]; then if [ -n "${CDN_UPLOAD_CMD:-}" ]; then
echo -e " Running custom CDN_UPLOAD_CMD..." echo -e " Running custom CDN_UPLOAD_CMD..."
@@ -107,13 +138,13 @@ if [ "$DO_UPLOAD" -eq 1 ]; then
if [ -n "${CDN_RSYNC_TARGET:-}" ]; then if [ -n "${CDN_RSYNC_TARGET:-}" ]; then
echo -e " Uploading via rsync to ${CDN_RSYNC_TARGET}..." echo -e " Uploading via rsync to ${CDN_RSYNC_TARGET}..."
rsync -avP "${ISO_NAME}" "${SHA_NAME}" "${CDN_RSYNC_TARGET}" rsync -avP "$ISO_PATH" "$SHA_PATH" "${CDN_RSYNC_TARGET}"
UPLOADED=1 UPLOADED=1
fi fi
if [ -n "${CDN_RCLONE_REMOTE:-}" ]; then if [ -n "${CDN_RCLONE_REMOTE:-}" ]; then
echo -e " Uploading via rclone to ${CDN_RCLONE_REMOTE}..." echo -e " Uploading via rclone to ${CDN_RCLONE_REMOTE}..."
rclone copy "${ISO_NAME}" "${SHA_NAME}" "${CDN_RCLONE_REMOTE}" rclone copy "$ISO_PATH" "$SHA_PATH" "${CDN_RCLONE_REMOTE}"
UPLOADED=1 UPLOADED=1
fi fi
@@ -128,8 +159,8 @@ else
echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}" echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}║ ✅ ISO packaging & verification complete! ║${NC}" echo -e "${GREEN}║ ✅ ISO packaging & verification complete! ║${NC}"
echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}" echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}"
echo -e "Ready files:" echo -e "Ready files (in ${CYAN}${OUT_DIR}${NC}, outside the repo):"
ls -lh "${ISO_NAME}" "${SHA_NAME}" ls -lh "$ISO_PATH" "$SHA_PATH"
echo echo
echo "To upload to CDN, run:" echo "To upload to CDN, run:"
echo " ./scripts/upload-cdn.sh --upload" echo " ./scripts/upload-cdn.sh --upload"