Repository navigation
Publish prebuilt Linux (x86_64, aarch64) and macOS arm64 binaries as release assets - #369
Conversation
Adds release-binaries.yml: on release published (or workflow_dispatch with a tag) it builds linux-x86_64, linux-aarch64 and macos-aarch64 archives natively, with --locked from the tag's commit, writes SHA256SUMS and uploads them with gh release upload. It refuses to overwrite existing assets unless dispatched with clobber: true, which then replaces the whole set. The same jobs, without the upload, run on PRs that touch anything the archives are built from. They also run each archive in a bare ubuntu:22.04 container on both architectures. Portability: glibc target built on Ubuntu 22.04, with HDF5, zlib and OpenSSL compiled in through an opt-in release-static feature. Default builds (Docker, CI, cargo build) are unchanged and keep the same native-tls/OpenSSL TLS stack. --version (all clap binaries) and params.build in every result file now name the git commit the binary was built from (build.rs, with logic in src/build_info/resolve.rs). A tree without its own .git reports it as unknown rather than guessing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The base image ships libssl3, so asserting its absence failed on a genuinely fresh host. The archive never links it (the build job rejects any binary that does), so only libhdf5's absence is asserted. The platform also goes through an env var, not an expression spliced into the shell text. Scripts are executable. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
🤖 Automated first-pass review. A human maintainer still needs to review this before merge. What I checked:
What I found: nothing worth fixing before merge. The taxonomy's main risk is a value that still runs and still reports but is wrong. Here that would be a binary naming a commit it wasn't built from, and the PR treats that as the failure to prevent:
The PR body already covers the fail-open Optional / follow-up (not blockers):
As the PR body says, Net: a large but carefully reviewed change. The new |
# Conflicts: # tests/integration_cli.rs
Blocking: - fresh-host removes the stock image's libssl3 before running the archive, and verify.sh now asserts with ldd that no binary resolves libssl, libcrypto, libhdf5 or libz (or anything "not found"). - Publishing moved to scripts/release/publish.sh. The asset listing is a plain command substitution, so a gh/API failure aborts instead of reading as an empty release. --clobber is passed only when CLOBBER=true. Also: - Clobber deletes SHA256SUMS first, deletes stale archives of the tag, replaces the archives, then uploads SHA256SUMS. - A re-run whose assets all have identical sha256 digests (a partial upload of the same build) completes the upload instead of refusing. - The release toolchain is pinned (RELEASE_RUST_TOOLCHAIN=1.99.1) and checked. - TLS is exercised in CI. tls-probe.sh makes a certificate-validating HTTPS request through the shipped binary on ubuntu:22.04 with ca-certificates (must succeed), and without them (must fail, as a negative control). - make release-selftest (scripts/release/selftest.sh) covers the tag/version policy, the checksums.sh set checks, verify.sh's unsafe-archive refusals, and every publish.sh branch against a fake gh. It runs in the PR check. - verify.sh inspects members (traversal, links) before extracting anything. - build.rs also watches logs/HEAD (commit on a packed ref). - Docker publish workflows pass VDB_BUILD_GIT_SHA=github.sha as a build arg, so images report their commit. Nothing else in them changes. - The macOS archive's LC_BUILD_VERSION minos is checked against 11.0. - LICENSE and README.md are added to the PR path filter (both are in the archive), and the Cargo.toml comment is corrected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hdf5-sys builds its bundled HDF5 only when HDF5_DIR is unset. The Makefile exports HDF5_DIR for ordinary builds, so `make release-archive` on a host with libhdf5-dev linked the system library despite --features release-static. The linkage check refused the archive (libhdf5_serial.so.103), which is how this was found. The workflow's static unit-test step unsets it too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The release-event test run failed on macOS at `rustc -vV | grep -qx`. grep exits at the match, rustc takes SIGPIPE, and pipefail reports 141. The same pattern in verify.sh's link check failed OPEN: a link member early in a listing larger than a pipe buffer made `tar tv | grep -q` exit 141, which the `if` read as "no link", and the archive was extracted. The new selftest case (link first, 3000 members) is red against the old check. Membership tests now use a pipe-free in_list helper, the tar listing is captured before it is matched, and the toolchain check compares a captured value. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…build loop Review of 33caa04 on #369: - params.build now carries `target` (the triple cargo compiled for) and `features` (["release-static"] for release archives, [] for a source build), so a result from a release archive (vendored OpenSSL, bundled HDF5) is distinguishable from a source build of the same commit. Pinned in provenance_block_mirrors_the_constants, plus a target test checked against std::env::consts. Mutations (feature always on, key dropped, target hardcoded, target key dropped) each turn a test red. - build.rs: reproduced the suspected loop. At 33caa04 every `cargo build` recompiled the crate, because `git status` rewrote .git/index, which is a watched input. git now runs with --no-optional-locks, and the dirty check is scoped to what the binaries are compiled from (build.rs, src, Cargo.toml, Cargo.lock: the same set cargo watches), so a README edit no longer marks a build dirty. Either change alone stops the loop; both are kept. - tls-probe expect-fail first proves DNS+TCP reach to the same host:port in the same container, so the negative control can only fail at TLS. Documented the intentional unauthenticated DELETE/POST to api.github.com. - install-release.sh: clear errors when there is no release, or when the latest release (today's bare 0.1.0) has no prebuilt archives. - README: params.build target/features, macOS Gatekeeper note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fcostaoliveira
left a comment
There was a problem hiding this comment.
Review from the deb/rpm packaging follow-up (#370), which is stacked on this branch. The packaging builds fine on top of it as-is (focal .deb and el8/el9 RPMs built and install-tested locally with --features release-static and the 1.99.1 pin), so nothing here blocks #369. Three things would make the stack cleaner if done here rather than after the fact:
-
pull_request.paths: 'scripts/release/**'inrelease-binaries.ymlnow also fires on packaging-only changes (build-deb.sh,build-rpm.sh,test-package.sh,publish-apt.sh,publish-yum.sh,selftest-packages.sh), so every such PR runs the three static archive builds for nothing. Narrowing it to the archive scripts (lib.sh,package.sh,verify.sh,checksums.sh,publish.sh,selftest.sh,tls-probe.sh) avoids that. INV-A4 intests/harness_invariants.rsasserts the literal'scripts/release/**', so it needs the same edit. -
RELEASE_RUST_TOOLCHAIN: '1.99.1'lives only in the workflow'senv:. #370 has to repeat the pin inrelease-packages.ymland adds an invariant that the two agree. If the pin lived inscripts/release/lib.sh(RELEASE_RUST_TOOLCHAIN="${RELEASE_RUST_TOOLCHAIN:-1.99.1}") and the workflow read it from there, both pipelines would follow one line, andmake release-archiveon a laptop would use the pinned toolchain too. -
The dirty-tree /
VDB_BUILD_GIT_SHA == HEADguard inpackage.sh(lines 54-58) is needed by the package builds as well. #370 addsrequire_clean_headandensure_release_toolchaintolib.shfor that; ifpackage.shcalled the same helpers, the "tree must be committed" policy would have one implementation. Happy to rebase #370 onto whatever shape you prefer.
🤖 Generated with Claude Code
Docker Build ValidationPlatforms tested:
Tests performed:
|
…e gate) B1 build.rs no longer watches .git/index. Any `git status` (IDE, prompt) rewrote it and recompiled the lib and every bin; reproduced at 1800bfa (1 recompile after a host `git status`), 0 now, 1 again when the watch is restored. The branch ref's directory is watched for the packed-ref + core.logAllRefUpdates=false commit case. B2 Tests that kill the reported survivors. resolve(): a dirty probe must give "dirty" and ", dirty tree". provenance_of() is a pure function of BuildFacts (the null-SHA branch is tested). features are derived in build.rs from CARGO_FEATURE_* (features_from_env, unit tested), and checked against cfg!(feature) in both builds. B3 CI coverage: - ci.yml reruns on release-binaries.yml, docker-build-pr.yml and scripts/release/**, which INV-A4 reads. INV-A4 asserts that, and also that docker-build-pr lists build.rs and passes the SHA, and that lib.sh's COMPILED_INPUTS equals build.rs's. - scripts/release/install-test.sh runs the installer against a local stub of GitHub releases: no-tag /latest install, explicit tag, no release, latest without archives, SHA256SUMS without the platform, checksum mismatch, a member outside DEST, a non-empty DEST. - selftest: package.sh's tag gate and dirty-tree refusals (modified source, untracked src file, modified README) fail before a fake cargo, with a clean-tree positive control. check_portable_linkage refuses /usr/bin/curl. verify.sh refuses a wrong --expect-tag, a wrong BUILD-INFO sha, a --version mismatch and missing release-static, against a stand-in archive that otherwise passes. - docker-build-pr builds with VDB_BUILD_GIT_SHA=github.sha (the merge commit it checks out) and requires --version to name it. B4 The plan job runs check_release_tag on the tag's Cargo.toml before building. "Cutting a release" is documented in README and AGENTS.md. 1 Release tags with '+' are refused (GitHub may rename the assets). 2 package.sh and the test step unset OPENSSL_NO_VENDOR and HDF5_VERSION. 3 GNU tar is required with a clear error (require_gnu_tar) in package.sh and selftest.sh. 4 otool -l is captured before awk (the SIGPIPE pattern again). 5 install-release.sh checks members before extracting, refuses a non-empty DEST, and dies clearly without sha256sum/shasum. 6 params.build, --describe build and BUILD-INFO.txt add profile, rustc, and the OpenSSL / HDF5 loaded at run time. verify.sh requires the host run to load what the build recorded. openssl is now a direct Linux dependency (already in the lock) so its version can be read. 7 MAX_GLIBC=2.34 (current archives need 2.34). amazonlinux:2023 runs verify.sh and the expect-ok TLS probe. 8 Docs: the by-hand line is Linux-only, a shellcheck SC2016 annotation, the GitProbe::dirty doc, the minos comment, and a README note on crypto-policies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Status of each point in the automated first-pass review (posted on Worth fixing before merge
Optional / follow-up
🤖 Generated with Claude Code |
Docker Build ValidationPlatforms tested:
Tests performed:
|
2 similar comments
Docker Build ValidationPlatforms tested:
Tests performed:
|
Docker Build ValidationPlatforms tested:
Tests performed:
|
…un docs)
B1 build.rs watches the nearest EXISTING ancestor of the branch ref's
directory (resolve::nearest_existing_ancestor, unit-tested). Before,
after `git pack-refs --all --prune` with reflogs off, a branch `feat/x`
had no ref file and no refs/heads/feat to watch, so a commit did not
re-run build.rs and the binary reported the previous commit.
Reproduced in a clone: STALE with the old watch, the new SHA with the
fix. Making the helper return the dir unconditionally fails its test.
B2 README, AGENTS.md and the workflow header: after a failed publish or
post-upload check, use "Re-run failed jobs" (same artifacts, same
digests). "Re-run all jobs" rebuilds and is refused. A deliberate
rebuild is workflow_dispatch with clobber: true.
1 publish.sh: an asset whose upload never finished (state != uploaded)
is deleted and re-uploaded without clobber. The refusal tells "no
digest reported" apart from "different digest" and points at "Re-run
failed jobs". The listing is name/state/digest, digest last, so an
empty digest cannot shift fields under tab IFS. Selftest covers it
(95 checks).
2 Exec bit restored on install-release.sh, verify.sh, install-test.sh.
3 package.sh defaults MACOSX_DEPLOYMENT_TARGET to MAX_MACOS_MINOS.
4 package.sh takes datasets/configs/LICENSE/README from `git archive
HEAD`, not the working tree.
5 lib.sh: `grep -o GLIBC_ || true`, so a binary with no GLIBC symbols
reports "none" instead of aborting under pipefail.
6 Comments no longer claim the HDF5/OpenSSL version checks catch a
system link (Ubuntu 22.04's libhdf5 is also 1.10.7). The NEEDED and
ldd checks do.
7 Stale comments: BuildSource.dirty, the install-release.sh header (HTTP
stub, not file://), the tls-probe.sh header (amazonlinux:2023).
8 install-test.sh: no "Terminated" noise, plus link-member and
old-glibc refusal cases (11 cases).
9 INV-A4 also requires docker-publish-{master,release}.yml to pass
VDB_BUILD_GIT_SHA. ci.yml lists both, since the test reads them.
10 install-release.sh refuses glibc < 2.34 (getconf) before
downloading.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Replies as of The deb/rpm follow-up review (#370, on
The automated review on
🤖 Generated with Claude Code |
Docker Build ValidationPlatforms tested:
Tests performed:
|
|
Replies to the automated review on
Seven independent review passes now approve 🤖 Generated with Claude Code |
Docker Build ValidationPlatforms tested:
Tests performed:
|
Closes #366
Each GitHub release now gets prebuilt archives and a checksum file:
vector-db-benchmark-<tag>-linux-x86_64.tar.gzvector-db-benchmark-<tag>-linux-aarch64.tar.gzvector-db-benchmark-<tag>-macos-aarch64.tar.gz(the nice-to-have)SHA256SUMSThey're built by the new
.github/workflows/release-binaries.yml. It runs onrelease: published, or onworkflow_dispatchwith ataginput and an optionalclobber. Each archive is flat, socurl -L <asset> | tar xz && ./vector-db-benchmark --helpworks in the directory you extract it into. Every archive contains:vector-db-benchmark,prepare-msmarco,generate-dataset,bench_npy,bench_jsonl, andbench_hdf5, which cargo also builds;datasets/datasets.json,experiments/configurations/and therandom-100smoke corpus, which the CLI reads from the working directory, the same set the Docker image ships;LICENSE,README.md;BUILD-INFO.txt: the tag, commit, target, features, profile, rustc, and the OpenSSL and HDF5 versions the built binary reports (its--describe buildblock), plusrustc -vV.Target and libc: glibc built on Ubuntu 22.04, with HDF5, zlib and OpenSSL statically linked
The real portability problem was HDF5, not TLS. Today every binary links the system
libhdf5_serial.so.103, which a fresh host doesn't have. I picked the simplest option that holds up:x86_64-unknown-linux-gnuandaarch64-unknown-linux-gnu, each built natively onubuntu-22.04/ubuntu-22.04-arm. Native arm runners are free for this public repo, so there's no emulation and no cross toolchain. macOS is built onmacos-14withMACOSX_DEPLOYMENT_TARGET=11.0.release-static, links HDF5, zlib and OpenSSL statically.hdf5-sys/staticandzlibcompile the HDF5 thathdf5-srcbundles, with DEFLATE.openssl/vendoredcovers OpenSSL, on Linux only.hdf5-src,openssl-src,libz-sysandcmake, and no existing version changes.cargo buildand CI don't enable the feature.libc.so.6,libm.so.6andlibgcc_s.so.1. The newest glibc symbol isGLIBC_2.34, andcheck_portable_linkagenow enforces that ceiling (MAX_GLIBC=2.34). The binaries run on Amazon Linux 2023, RHEL 9, Ubuntu 22.04+ and Debian 12+. CI runs them on bareubuntu:22.04and onamazonlinux:2023, the default AWS client image.TLS findings
cargo tree -i openssl-sysshows OpenSSL comes in throughnative-tls, from three sources:reqwest(default-tls);turbopuffer-client;elasticsearchandopensearch.qdrant-client,mongodbandtonicalready use rustls. Switching everything to rustls would change runtime behaviour for every HTTP engine (ES/OpenSearch/Milvus/Weaviate/Chroma/Turbopuffer/Vertex): the backend, the trust store and the cipher set. So I keptnative-tls/OpenSSL and vendored it in the release build only.The binaries still use the host's CA store:
native-tlsfinds it at runtime throughopenssl-probe, not at OpenSSL's compiled-in/usr/local/ssl. This is now checked in CI (see below), and I also checked it by hand with the static binary:ca-certificates/etc/pki/tls)The vendored OpenSSL ignores the host's crypto-policies, such as
/etc/crypto-policiesor a FIPS provider. The README says so.ES and OpenSearch run with
CertificateValidation::Nonehere, as they did before, which is why the probe uses the Chroma client, which validates certificates.--versionandparams.buildbuild.rsrecords the commit the binary was built from. The logic is insrc/build_info/resolve.rs, whichbuild.rscompiles via#[path]and which is unit-tested asbuild_info::resolve.vector-db-benchmark,prepare-msmarcoandgenerate-datasetnow print--versionasvector-db-benchmark 0.1.0 (git <full sha>). A build with uncommitted changes adds, dirty tree. The run banner prints the same line.params.buildblock, andvector-db-benchmark --describe buildprints the same block. It has:crate_version,git_sha(nullwhen unknown),git_tree,git_sha_source;target,profile,features,rustc;openssl(nullon macOS) andhdf5.["release-static"], OpenSSL 3.6.3, HDF5 1.10.7) and a Docker orcargo buildof the same commit ([], Debian's OpenSSL 3.0 and HDF5 1.10.8) are now distinguishable. TLS cost sits in the timed path of the managed engines, so that difference can matter.featuresis derived inbuild.rsfrom cargo'sCARGO_FEATURE_*variables, not from a hand-kept list.opensslis read fromOpenSSL_version(). That's whyopensslis now a direct Linux dependency; it was already in the lock through native-tls.provenance_of(&BuildFacts).build.rs,src/,Cargo.tomlandCargo.lock, untracked files included. That's the same set cargo watches, so the flag can't go stale, and a README or test edit doesn't mark the build dirty.package.shrefuses that same scope with the same flags (uncommitted_changesinlib.sh), plus any tracked file, because the archive also ships README, LICENSE, datasets and configs.build.rsnever writes to or watches.git/index. It runs git with--no-optional-locksand watchesHEAD,logs/HEAD,packed-refs, the branch ref, and the nearest existing ancestor of the ref's directory.git pack-refs --all --prune, a branchfeat/xhas neither a ref file norrefs/heads/feat.33caa04, everycargo buildrecompiled the crate.1800bfa, a host-sidegit status(IDE, prompt) still caused one recompile..gitof its own, as in the Docker build context, the commit is reported as unknown:VDB_BUILD_GIT_SHAcan assert the commit. It must be a full 40-character SHA, or the build fails.docker-publish-{master,release}.ymlnow pass--build-arg VDB_BUILD_GIT_SHA=${{ github.sha }}. That's the only change to them, and the DockerfileARGsits after the dependency-cache layer.docker-build-pr.ymlpassesVDB_BUILD_GIT_SHA=${{ github.sha }}too, and requires the image's--versionto end with(git <that sha>).pull_requestrun,github.shais the merge commit thatactions/checkoutbuilds the context from.head.shawould name a commit the image wasn't built from.Reproducibility and re-runs
--locked, from the tag's commit. Theplanjob resolves the tag to a commit, and each build job checks that its checkout is that commit.RELEASE_RUST_TOOLCHAIN(1.99.1).package.shrefuses a dirty tree.0.2.0,v0.2.0, or a pre-release such as0.2.0-rc.1. No+is allowed, because GitHub may rename assets named after it, which would leaveSHA256SUMSstale.planjob runscheck_release_tagagainst the tag's ownCargo.tomlbefore anything is built, so a mismatch fails in seconds. Before this, it failed only after all three builds, which left a public "latest" release with no assets.Cargo.tomlversion bump first. README and AGENTS.md now have a "Cutting a release" section.scripts/release/publish.shhandles it:SHA256SUMSlast;clobber: true;SHA256SUMSfirst, deletes stale archives, replaces the archives, then uploads the newSHA256SUMS;digests) just finishes the upload. In practice that means Re-run failed jobs, which reuses the run's artifacts. Re-run all jobs rebuilds, the digests differ, and the run refuses. README, AGENTS.md and the workflow header say so;statenotuploaded) isn't served, so it's deleted and uploaded again without clobber;package.shtakesdatasets/,experiments/configurations/, LICENSE and README fromgit archive HEAD, so a local build can't ship untracked or ignored files. On macOS it defaultsMACOSX_DEPLOYMENT_TARGETto 11.0, so HDF5's C code isn't compiled for the build host's macOS.SHA256SUMS, and installs it withinstall-release.sh.How CI exercises the archives (on every PR touching their inputs)
The same workflow runs on
pull_requestwith a path filter: Cargo files,build.rs,src/**,Makefile,scripts/release/**, the installer, the datasets and configs that get packaged,LICENSE/README.md, and the workflow itself. It does everything except the upload:make release-archive, the same command a release uses:release-staticunit tests first: a DEFLATE-compressed HDF5 round trip through the bundled HDF5, plus the build identity;check_portable_linkagerejects anyNEEDEDlibrary besides glibc and libgcc, and any glibc symbol newer than 2.34;minosabove 11.0. That catches a wrong deployment target for the link, but not a C object compiled for a newer macOS, which the linker only warns about.MACOSX_DEPLOYMENT_TARGETis exported for the cmake/cc builds for that reason;verify.shon the build host.ubuntu:22.04container with no compiler and no libhdf5, and withlibssl3removed:verify.shlists the members before extracting, refusing path traversal and links;lddresolves no libssl, libcrypto, libhdf5 or libz;<name> <version> (git <sha>)for the expected commit, and that--helpworks;--describe buildnames the commit, a clean tree andrelease-static, and that on this host it loads the same OpenSSL and HDF5 thatBUILD-INFO.txtrecorded at build time. In CI that wasOpenSSL 3.6.3and1.10.7on both architectures, andnull/1.10.7on macOS;--describe datasetsfrom the bundled json,generate-dataset→bench_npy,bench_jsonlon random-100, and HDF5 initialisation;ca-certificatesinstalled. A third container,amazonlinux:2023(glibc 2.34), runsverify.shand the positive probe. Before the negative probe, the same container must resolve the host and open TCP to port 443 (bash/dev/tcp), so the only thing left to fail is TLS, not DNS or the network. The probe's unauthenticated DELETE/POST to api.github.com is intentional and documented (GitHub returns 404; nothing is created).make release-selftestruns 95 checks of the shell logic:publish.shbranch against a fakegh, including unfinished uploads;check_release_tag, including+and version mismatch;checksums.shset checks;verify.sh's unsafe-archive refusals, plus a wrong--expect-tag, a wrong BUILD-INFO sha, a--versionmismatch and a missingrelease-static. These run against a stand-in archive that otherwise passes, as a positive control;package.sh's tag gate and dirty-tree refusals (modified source, untrackedsrc/file, modified README). Each must fail before a fake cargo runs, and a clean tree must reach it;check_portable_linkagerefusing/usr/bin/curl;make release-checksumswrites and checksSHA256SUMS, and requires it to name exactly the archives present;sha256sum -cis run too;scripts/release/install-test.shruns the installer against a local stand-in for GitHub releases (11 cases):/releases/latest;SHA256SUMSnot listing the platform;getconf, refused before downloading.harness_invariants.rs(INV-A4) fails if any of the following happens:--locked;ci.yml's two path lists stop covering what INV-A4 reads:build.rs,release-binaries.yml,docker-build-pr.ymlandscripts/release/**, whichci.ymlnow lists;docker-build-pr.ymlstops listingbuild.rsor passing the SHA, ordocker-publish-{master,release}.ymlstop passingVDB_BUILD_GIT_SHA(ci.ymllists both, since the test reads them);lib.sh'sCOMPILED_INPUTSdrifts frombuild.rs's.Test of the release workflow
workflow_dispatchonly works once a workflow file is on the default branch, so I tested therelease: publishedpath instead. A release event runs the workflow from the tag's commit.Setup:
0.1.0-ci.366, marked not-latest.releasetrigger fromdocker-publish-release.yml. That stopped the test from pushing a public Docker Hub image I couldn't delete.rustc -vV | grep -qtook SIGPIPE underpipefail(exit 141). The same pattern madeverify.sh's link check fail open on long listings. Both are fixed in33caa04, with a regression test.Run 40831018822 on the fixed head:
publish.shuploaded the three archives, thenSHA256SUMS;checksums.sh checkpassed,cmpmatched the built files, andinstall-release.shinstalled from github.com and printedvector-db-benchmark 0.1.0 (git 05e6c9a…).publishre-run: it reportedalready on the release with identical digests: SHA256SUMS …and uploaded nothing. The assets'updated_atdidn't change.linux-x86_64.tar.gzon the release with a 15-byte foreign file, then re-ranpublish. It refused withdifferent digest: vector-db-benchmark-0.1.0-ci.366-linux-x86_64.tar.gz … Refusing to mix builds, and the release was left as it was.Against the published assets, by hand:
ubuntu:22.04(aarch64, glibc 2.35) with onlycurlandca-certificatesadded, and no compiler or libhdf5:curl -L <asset> | tar xz && ./vector-db-benchmark --helpworked,--versionprinted the tag's commit, and the README installer worked.install-release.shinstalled and ran the macOS archive, which links only/usr/liband/Systemlibraries.Cleanup: I deleted the release with
--cleanup-tag, which removed its assets and tag, and both temporary branches. No release, tag or branch from the test remains; only the Actions run logs do.Not exercised live:
clobber: true. It needsworkflow_dispatch(so this workflow on master) and an existing release.make release-selftestcovers it against the fakegh:SHA256SUMSfirst;SHA256SUMSlast.After merge, a quick check would be: dispatch on a throwaway pre-release twice, the second time with
clobber: true.Install
The README has a new "Prebuilt binaries" section:
There's also a by-hand one-liner, labelled Linux, that picks
linux-$(uname -m). Before extracting, the installer checks archive members, refuses a non-empty destination, and dies clearly when no sha256 tool is present. On Linux it refuses glibc older than 2.34, viagetconf, before downloading anything.Verification
make agent-checkexits 0, unpiped, on the head commit.shellcheck -x(v0.10.0) is clean onscripts/install-release.shand everyscripts/release/*.sh.make release-selfteston stock macOS without GNU tar now fails at once with "GNU tar is required … brew install gnu-tar", instead of dying inside bsdtar.release-staticaarch64 archive passed both fresh-host steps inubuntu:22.04(glibc 2.35). CI runs the same checks plusamazonlinux:2023on every PR.build_info::resolveguards: own-checkout, override validation, HEAD validation, dirty flag;params.buildwrites;params.build.featuresforced torelease-staticor dropped, andtargethardcoded or dropped: each failsbuild_infotests;'build.rs'from the release workflow's PR paths, droppingscripts/release/**from oneci.ymllist, removing the Docker PR build's SHA, or lettinglib.sh'sCOMPILED_INPUTSdrift: each turns it red;resolve()ignoring the dirty probe (dirty: Some(false)),features_from_envfinding nothing, andbuild.rshardcodingrelease-static: each fails abuild_infotest;.git/indexagain: a hostgit statuscauses a recompile (1 against 0);feat/xkeeps the stale SHA, reproduced end to end in a clone;publish.shnot recognising unfinished uploads; the installer without its link-member or glibc checks: each is caught bymake release-selftestorinstall-test.sh;check_release_tagaccepting+,uncommitted_changesdropping either scope,verify.shignoring features: each is caught bymake release-selftest. Removing the installer's member check is caught byinstall-test.sh;--version;--lockedinvariant;publish.sh,verify.sh,checksums.shand the tag policy, all caught bymake release-selftest;HDF5_DIR,hdf5-syslinks the system HDF5 even underrelease-static.package.shnow unsets it.Left open
0.1.0, which has no archives. It now says that plainly ("the latest release, 0.1.0, has no prebuilt archive …") instead of "download failed". With no release at all, it says there is none to install.curl | tarpath is unaffected; the README notesxattr -d com.apple.quarantinefor browser downloads.compare-resultsdoesn't yet warn when two result sets come from different builds. That needs a build block in the per-queryDumpHeaderfirst: compare-results: warn when the two sides come from different builds (needs a build block in DumpHeader) #371.make_latest: falseand flipping it after the verified upload.clobber: truehasn't run live. After merge, dispatch twice on a throwaway pre-release, the second time withclobber: true.scripts/release/**, moving the toolchain pin intolib.sh, and sharing the clean-tree helper with Native .deb/.rpm packages for the Redis APT/YUM repositories (#366 follow-up) #370'srequire_clean_head.release-staticunit tests (and thehdf5 == 1.10.7,OpenSSL 3.xassertions) run only inrelease-binaries.yml.make agent-checkcovers the default build.Cargo.tomlversion bump mentioned above.🤖 Generated with Claude Code