Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 48 additions & 10 deletions scripts/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -645,30 +645,68 @@ EOF
fi

# =============================================================================
# Build builder image (macOS)
# Build builder image (all platforms)
# =============================================================================

if [ "$OS" = "darwin" ]; then
info "Attempting to build builder image..."
if command -v docker >/dev/null 2>&1; then
#
# Source-to-image builds boot builder VMs from hypeman/builder:latest, and the
# API's fallback for installed (non-source) services is to find that image in
# the local Docker daemon (lib/builds/manager.go). Previously only the macOS
# source-install path built it, so a Linux release install could never run
# `hypeman build`: builder preparation retried forever and every build failed.

if command -v docker >/dev/null 2>&1; then
# `docker` needs daemon access, which the invoking user may not have on
# Linux (not in the `docker` group); the rest of the script already
# escalates privileged operations through $SUDO, so do the same here
# rather than failing the one step this script exists to make work.
DOCKER="docker"
if ! docker info >/dev/null 2>&1; then
if [ -n "$SUDO" ] && $SUDO docker info >/dev/null 2>&1; then
DOCKER="$SUDO docker"
fi
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Build continues after Docker probes fail

Low Severity

When both docker info and $SUDO docker info fail, DOCKER stays set to docker and the script still enters the build path. For release installs that means fetching the version source tarball before docker build fails for the same unreachable daemon, instead of skipping early with a clear accessibility warning.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 94163c8. Configure here.

if $DOCKER image inspect hypeman/builder:latest >/dev/null 2>&1; then
info "Builder image hypeman/builder:latest already present, skipping build"
else
info "Building builder image..."
if [ -n "$BRANCH" ] && [ -d "${TMP_DIR}/hypeman" ]; then
BUILD_CONTEXT="${TMP_DIR}/hypeman"
elif [ -n "$VERSION" ] && [ "${VERSION#v}" != "$VERSION" ]; then
# Release install: no source checkout on disk, so fetch the source
# for the exact installed version — the builder Dockerfile the API
# expects is part of the same tree.
info "Fetching source for ${VERSION} to build the builder image..."
if curl -fsSL "https://github.com/${REPO}/archive/refs/tags/${VERSION}.tar.gz" -o "${TMP_DIR}/hypeman-src.tar.gz" \
&& mkdir -p "${TMP_DIR}/hypeman-src" \
&& tar -xzf "${TMP_DIR}/hypeman-src.tar.gz" -C "${TMP_DIR}/hypeman-src" --strip-components=1; then
BUILD_CONTEXT="${TMP_DIR}/hypeman-src"
else
BUILD_CONTEXT=""
warn "Failed to fetch source for ${VERSION}; skipping builder image build"
fi
Comment thread
cursor[bot] marked this conversation as resolved.
else
BUILD_CONTEXT=""
fi

if [ -n "$BUILD_CONTEXT" ] && [ -f "${BUILD_CONTEXT}/lib/builds/images/generic/Dockerfile" ]; then
if ! docker build -t hypeman/builder:latest -f "${BUILD_CONTEXT}/lib/builds/images/generic/Dockerfile" "$BUILD_CONTEXT" 2>/dev/null; then
warn "Failed to build builder image. You can build it later manually."
BUILDER_BUILD_LOG="${TMP_DIR}/builder-image-build.log"
if ! $DOCKER build -t hypeman/builder:latest -f "${BUILD_CONTEXT}/lib/builds/images/generic/Dockerfile" "$BUILD_CONTEXT" > "$BUILDER_BUILD_LOG" 2>&1; then
# TMP_DIR is removed by the EXIT trap, so print the captured output
# now rather than naming a log path that will not survive the install.
warn "Failed to build builder image; docker build output follows:"
sed 's/^/ /' "$BUILDER_BUILD_LOG" >&2

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Build log dumped to wrong stream

Low Severity

The failure path announces that docker build output follows via warn (stdout), then prints the log with sed on stderr. Every other user-facing message and build-log dump in install.sh uses stdout, so the log can appear detached from the warning—or vanish entirely when stderr is discarded—undermining the print-before-cleanup fix.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 42cbab4. Configure here.

warn "Source builds will not work until it exists: docker build -t hypeman/builder:latest -f lib/builds/images/generic/Dockerfile <source checkout>"
else
info "Builder image built successfully"
fi
else
elif [ -z "$BUILD_CONTEXT" ]; then
warn "Builder image Dockerfile not available. Build it manually: docker build -t hypeman/builder:latest -f lib/builds/images/generic/Dockerfile ."
else
warn "Builder image Dockerfile not found in source; build it manually: docker build -t hypeman/builder:latest -f lib/builds/images/generic/Dockerfile ."
fi
else
warn "Docker not available, skipping builder image build"
fi
else
warn "Docker not available, skipping builder image build (hypeman build will not work without it)"
fi

if [ "$OS" = "darwin" ]; then
Expand Down