Distribution prep on the road to public availability (plan steps 2–3a). - Cargo.toml: publish-ready (drop publish=false; homepage/keywords/ categories/exclude) + [package.metadata.binstall] with per-target overrides (linux-gnu->musl, windows-msvc->gnu/gnullvm). dry-run clean. - scripts/install.ps1: Windows `irm | iex` one-liner — written but untested here (no PowerShell; validate on Windows). README Windows block. - README.md (new); LICENSE-MIT + LICENSE-APACHE (dual, (c) Lazy Evaluation Ltd); CONTRIBUTING.md (inbound=outbound dual-license note). - ADR-0055 Amendment 1 (install.ps1), ADR-0056 (crates.io/binstall), README index + plan updates. The actual `cargo publish` remains a gated maintainer step (token, irreversible) at a new tagged release; real cargo-binstall validation pending.
4.3 KiB
ADR-0055: curl | sh install script (scripts/install.sh)
Status
Accepted — implemented 2026-06-17 (plan:
docs/plans/20260616-public-availability.md, step 2). Step 2 on the road
to public availability, building on ADR-0054 (versioned releases) and
ADR-ci-001/003 (the Gitea releases it downloads from). Tracked by the
plan + this ADR (no Gitea issue — user decision, 2026-06-17).
Context
Until now, installing meant: find the releases page, work out which of
the six assets matches your machine, download it, chmod +x, move it
onto PATH, and (on macOS) wonder about Gatekeeper. That is too much
friction for a teaching tool aimed at beginners. The Gitea releases are
publicly downloadable (confirmed), with deterministic asset names
(rdbms-playground-<tag>-<target>[.exe]) and .sha256 sidecars
(ADR-ci-003), and a releases/latest API — enough to script a one-liner
install.
Decision
Ship scripts/install.sh, run as
curl -fsSL <gitea-raw>/scripts/install.sh | sh:
- POSIX
sh(no bashisms) — it runs under theshofcurl | sh; kept shellcheck-clean (-s sh). - Platform detection from
uname→ target triple: Linux →<arch>-unknown-linux-musl(the fully-static build — one universal Linux artifact, no glibc/version coupling), macOS →<arch>-apple-darwin;x86_64/amd64andaarch64/arm64both map. Windows is rejected with a pointer to Scoop/winget/the releases page (the binary is a.exe, not acurl|shtarget). - Version: the
releases/latestAPI tag by default;RDBMS_VERSIONpins a specific tag. - Integrity: always download the
.sha256sidecar and verify (sha256sum/shasum -a 256); a mismatch aborts the install. HTTPS only. - Install location:
~/.local/binby default (user-writable, no sudo), overridable viaRDBMS_INSTALL_DIR; prints a PATH hint if the dir isn't onPATH. - macOS note: a
curldownload is not Gatekeeper-quarantined, so the binary runs as-is even while it is only ad-hoc-signed; proper Developer-ID signing + notarization (for browser downloads) is a separate, postponed task (see the plan's signing item). - Testing seams:
RDBMS_OS/RDBMS_ARCHforce detection and--print-targetprints the resolved triple and exits — so the mapping is checkable without a download.
Rejected / deferred
- Hosting the script on the website domain (Cloudflare): nicer URL, but adds a moving part; the Gitea repo raw URL is simplest and the binaries live there anyway (user decision). The website may later reference the same command.
- Uploading
install.shas a release asset for a stable link: optional; the branch raw URL is fine for now.
Amendment 1 — install.ps1 (Windows) added (2026-06-17)
Windows was originally deferred to Scoop/winget; the user opted for both
a PowerShell one-liner now and package managers later. Added
scripts/install.ps1 (irm <url> | iex): maps the host CPU to our
*-windows-gnu/-gnullvm .exe, resolves the latest release (or
-Version/RDBMS_VERSION), downloads + SHA-256-verifies, installs to
%LOCALAPPDATA%\Programs\rdbms-playground (-InstallDir/RDBMS_INSTALL_DIR
override), and adds that dir to the user PATH. Caveat: unlike
install.sh (verified end-to-end), this was written but not tested from
this environment (no PowerShell available) — validate on a real Windows
host. Scoop/winget (D3) remain the idiomatic package-manager routes.
Consequences
- A first-time user runs one line and gets a checksum-verified binary on
PATH. The website's install copy (website branch, separate agent) can point at this command. - Verified end-to-end (2026-06-17) against the live public
v0.1.0: all four Linux/macOS platform mappings + Windows/unknown-arch rejection; pinned and latest paths; checksum verification incl. a tamper-rejection check; install + run on Linux x86_64. (The installedv0.1.0predates--version, ADR-0054 — a non-issue, and the reason to cut a new release.) - No automated regression guard in CI yet: shellcheck isn't in the
flake, and there's no shell-test harness here (no bats). Recommended
follow-up: add a
shellcheck scripts/*.shgate (touches ADR-ci-002 — needs shellcheck in the devShell). For now the guard is local shellcheck + the documented end-to-end verification.