install.sh: install the Rust maintenance worker (#10882)

* install.sh: install the Rust maintenance worker

The release publishes weed-worker but the installer only knew weed and the
Rust volume server, so the one binary that cannot be built without a Rust
toolchain was the one you had to download by hand.

--component all skips it on a platform it has no build for rather than failing
an install that already put two binaries in place; asking for it by name there
still says so.

Claude-Session: https://claude.ai/code/session_01Rkp1Mw5E89Jp6dzJFYiMrm

* install.sh: clean each component's temp directory as it finishes

The EXIT trap is per-process, so installing more than one component left every
extraction but the last behind. Cleaning at the end of the function keeps the
trap for the paths that exit early.

Claude-Session: https://claude.ai/code/session_01Rkp1Mw5E89Jp6dzJFYiMrm
This commit is contained in:
Chris Lu
2026-08-22 12:16:28 -07:00
committed by GitHub
parent 7ebf2ebac3
commit 228500fe37
+84 -2
View File
@@ -9,7 +9,7 @@
# curl -fsSL ... | bash -s -- --version 4.34 --dir /usr/local/bin # curl -fsSL ... | bash -s -- --version 4.34 --dir /usr/local/bin
# #
# Options: # Options:
# --component COMP Which binary to install: weed, volume-rust, all (default: weed) # --component COMP Which binary to install: weed, volume-rust, worker-rust, all (default: weed)
# --version VER Release version tag (default: latest) # --version VER Release version tag (default: latest)
# --large-disk Use large disk variant (5-byte offset, 8TB max volume) # --large-disk Use large disk variant (5-byte offset, 8TB max volume)
# --dir DIR Installation directory (default: /usr/local/bin) # --dir DIR Installation directory (default: /usr/local/bin)
@@ -22,6 +22,7 @@ COMPONENT="weed"
VERSION="" VERSION=""
LARGE_DISK=false LARGE_DISK=false
INSTALL_DIR="/usr/local/bin" INSTALL_DIR="/usr/local/bin"
WORKER_INSTALLED=false
# Colors (if terminal supports them) # Colors (if terminal supports them)
if [ -t 1 ]; then if [ -t 1 ]; then
@@ -128,6 +129,33 @@ rust_asset_name() {
fi fi
} }
# Does a release carry this asset? Answers 0 for yes and 1 for a 404, and stops
# the installer on anything else: a rate limit or a network blip must not read
# as "this release predates the binary" and quietly skip it.
asset_exists() {
local url="$1" code=""
if command -v curl &>/dev/null; then
code="$(curl -sL -o /dev/null -I -w '%{http_code}' "$url" || true)"
elif command -v wget &>/dev/null; then
# --spider's exit status folds 404 in with every other server error, so
# read the status line itself; -S prints one per redirect hop.
code="$(wget -S --spider -q -O /dev/null "$url" 2>&1 | awk '/^ *HTTP\// {c=$2} END {print c}')"
fi
case "$code" in
200) return 0 ;;
404) return 1 ;;
*) error "Could not check ${url} (HTTP ${code:-none}). Retry, or install components one at a time." ;;
esac
}
# Build Rust maintenance worker asset name. No large-disk variant: the worker
# maintains tables through the namespace and never opens a volume file.
worker_asset_name() {
local os="$1" arch="$2"
echo "weed-worker_${os}_${arch}.tar.gz"
}
# Install a single component # Install a single component
install_component() { install_component() {
local component="$1" os="$2" arch="$3" local component="$1" os="$2" arch="$3"
@@ -204,10 +232,48 @@ install_component() {
ok "Installed weed-volume to ${INSTALL_DIR}/${dest_name}" ok "Installed weed-volume to ${INSTALL_DIR}/${dest_name}"
;; ;;
worker-rust)
# Published for linux only: the worker runs beside the cluster it
# maintains, and its dependency tree makes every extra target an
# expensive build.
case "$os" in
linux) ;;
*) error "Rust maintenance worker is not available for ${os}. Supported: linux" ;;
esac
case "$arch" in
amd64|arm64) ;;
*) error "Rust maintenance worker is not available for ${arch}. Supported: amd64, arm64" ;;
esac
asset_name="$(worker_asset_name "$os" "$arch")"
download_url="https://github.com/${REPO}/releases/download/${VERSION}/${asset_name}"
download "$download_url" "${tmpdir}/${asset_name}"
info "Extracting ${asset_name}..."
tar xzf "${tmpdir}/${asset_name}" -C "$tmpdir"
local worker_bin
worker_bin="$(find "$tmpdir" -name 'weed-worker' -type f | head -1)"
if [ -z "$worker_bin" ]; then
error "Could not find weed-worker binary in archive"
fi
chmod +x "$worker_bin"
install_binary "$worker_bin" "weed-worker"
WORKER_INSTALLED=true
ok "Installed weed-worker to ${INSTALL_DIR}/weed-worker"
;;
*) *)
error "Unknown component: ${component}. Use: weed, volume-rust, all" error "Unknown component: ${component}. Use: weed, volume-rust, worker-rust, all"
;; ;;
esac esac
# The trap is per-process, so a later component's would replace this one and
# leave the earlier extraction behind. Clean up here and hand the trap back;
# the error paths above exit, which still fires it.
rm -rf "$tmpdir"
trap - EXIT
} }
# Copy binary to install dir, using sudo if needed # Copy binary to install dir, using sudo if needed
@@ -251,6 +317,16 @@ main() {
all) all)
install_component "weed" "$os" "$arch" install_component "weed" "$os" "$arch"
install_component "volume-rust" "$os" "$arch" install_component "volume-rust" "$os" "$arch"
# The worker is published for linux amd64/arm64 only, and only by
# releases new enough to carry it; skip either case rather than fail
# an install that has already put two binaries in place.
if [ "$os" != "linux" ] || { [ "$arch" != "amd64" ] && [ "$arch" != "arm64" ]; }; then
warn "Skipping the Rust maintenance worker: no build for ${os}/${arch}"
elif ! asset_exists "https://github.com/${REPO}/releases/download/${VERSION}/$(worker_asset_name "$os" "$arch")"; then
warn "Skipping the Rust maintenance worker: ${VERSION} does not carry one"
else
install_component "worker-rust" "$os" "$arch"
fi
;; ;;
*) *)
install_component "$COMPONENT" "$os" "$arch" install_component "$COMPONENT" "$os" "$arch"
@@ -265,11 +341,17 @@ main() {
if [ "$COMPONENT" = "volume-rust" ] || [ "$COMPONENT" = "all" ]; then if [ "$COMPONENT" = "volume-rust" ] || [ "$COMPONENT" = "all" ]; then
info " weed-volume: ${INSTALL_DIR}/weed-volume" info " weed-volume: ${INSTALL_DIR}/weed-volume"
fi fi
if [ "$WORKER_INSTALLED" = true ]; then
info " weed-worker: ${INSTALL_DIR}/weed-worker"
fi
echo "" echo ""
info "Quick start:" info "Quick start:"
info " weed master # Start master server" info " weed master # Start master server"
info " weed volume -mserver=localhost:9333 # Start Go volume server" info " weed volume -mserver=localhost:9333 # Start Go volume server"
info " weed-volume -mserver localhost:9333 # Start Rust volume server" info " weed-volume -mserver localhost:9333 # Start Rust volume server"
if [ "$WORKER_INSTALLED" = true ]; then
info " weed-worker --admin localhost:23646 # Start the Rust maintenance worker"
fi
} }
main main