# End-to-end CLI smoke test, modelling "install ao on a fresh machine, then use it". # # Build context is the REPO ROOT: # docker build -f test/cli/Dockerfile -t ao-cli-smoke . # docker run --rm --init ao-cli-smoke # # Run with --init so the real daemon spawned during the `start` test (it detaches # via setsid) is reaped promptly after `stop` instead of lingering as a zombie. # The suite does NOT depend on it — the stale-daemon case uses a fabricated dead # PID — but --init keeps process accounting clean. # ---- stage 1: build the binary (the "release" a user would download) ---- FROM golang:1.25-bookworm AS build WORKDIR /src # Cache modules first. COPY backend/go.mod backend/go.sum ./backend/ RUN cd backend && go mod download COPY backend ./backend # Pure-Go SQLite (modernc) builds fine with CGO disabled -> a static binary. RUN cd backend && CGO_ENABLED=0 go build -trimpath -o /out/ao ./cmd/ao # ---- stage 2: a clean machine with NO Go toolchain, just like an end user ---- FROM debian:bookworm-slim AS run # Runtime deps a fresh user would need: git is required by `ao doctor`; curl # drives the HTTP-level guard checks; ca-certificates for good measure. Zellij is # optional for this smoke test, so doctor reports a WARN if it is absent. RUN apt-get update \ && apt-get install -y --no-install-recommends git curl ca-certificates \ && rm -rf /var/lib/apt/lists/* # "Install" the CLI the way a user would: drop the binary on PATH. COPY --from=build /out/ao /usr/local/bin/ao COPY test/cli/install-check.sh /usr/local/bin/ao-install-check.sh RUN chmod +x /usr/local/bin/ao /usr/local/bin/ao-install-check.sh # Run as an unprivileged user with a real HOME, like a normal install. RUN useradd --create-home --shell /bin/bash ao USER ao WORKDIR /home/ao # Sanity: prove the install resolved before the check runs. RUN ao version ENTRYPOINT ["/usr/local/bin/ao-install-check.sh"]