feat(evidence): publish relying-party clients with development builds - #654
Merged
jeremi merged 1 commit intoAug 6, 2026
Merged
Conversation
Until a tagged release exists there is no way to try the Python or Node client without building it, so the manual development build now produces one wheel and one npm tarball per platform beside the three binaries, smokes each from a fresh environment, and publishes them with the prerelease. Each package carries its ecosystem's own prerelease version, so a tester can tell from `pip show` or `npm ls` which build is installed. `pyo3`'s `abi3-py310` feature makes one wheel per platform cover CPython 3.10 and later, so there is no Python-version matrix. Linux wheels are built with `--compatibility linux` rather than maturin's manylinux audit, whose tag is not predictable from the source; the resulting glibc floor is stated in the release notes. The Rust client is not published: a git dependency pinned to the source commit already works without a release. Review notes (release provenance): the closed asset roster is extended by the six new names, so a missing or misnamed client artifact fails publication instead of shipping a partial toolset; SHA256SUMS covers the new assets by construction; the new job holds `contents: read` only and needs no registry credentials, since nothing is published to PyPI or npm. Signed-off-by: Jeremi Joslin <jeremi@joslin.fr>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #649: the crates this builds are not on
mainyet, so the base isfeat/evidence-client-library.evidence-dev.ymlpublishes dev builds ofevidence,evidencectl, andmintfrom protected-mainsource. It now also builds the two relying-partyclient packages, which is the only way to try them before a tagged release
exists.
What the new
clientsjob producesPer platform (
linux-amd64,linux-arm64,macos-arm64), one wheel and onenpm tarball:
registry_evidence_client-<version>.dev<run>-cp310-abi3-<plat>.whllinux_x86_64,linux_aarch64,macosx_11_0_arm64evidence-client-node-<tag>-<plat>.tgzlinux-x64-gnu,linux-arm64-gnu,darwin-arm64Each is smoked from a fresh environment (a new venv, a new
npm initproject)by installing the artifact and constructing a client: that is the failure a
prebuilt native artifact actually has. Nothing in the smokes touches the
network, and the placeholder token is a literal, not a credential.
Decisions worth reviewing
pyo3'sabi3-py310makes asingle wheel cover CPython 3.10 and later. The roster names the
cp310-abi3tag explicitly, so dropping
abi3fails publication rather than quietlyshipping wheels no documented command names.
--compatibility linux, not maturin's manylinux audit. The audit derivesa glibc floor from the compiled extension's symbols, so its tag is not
predictable from the source, and this workflow publishes a closed roster of
exactly named assets. The cost is a glibc floor of the build runner's, which
the release notes now state.
0.17.0.dev<run_id>(PEP 440, sortsbelow the real 0.17.0) and
0.17.0-dev.<run_id>, so a tester can readpip showornpm lsinstead of a file name. The run attempt has no legalPEP 440 home except a local segment some installers reject, so it appears
only in asset file names.
napi build, because the buildregenerates
index.js, which embeds the version for its own fallback check.commit already works with no release; the notes say so.
Review notes (release provenance)
The closed asset roster gains exactly the six new names, so a missing or
misnamed client artifact fails publication instead of shipping a partial
toolset.
SHA256SUMScovers them by construction. The new job holdscontents: readonly and needs no registry credentials: nothing is publishedto PyPI or npm.
Verification
actionlintclean.clientsjob's fourrunbodies were rendered out of the YAML itself(not paraphrased) and executed:
registry_evidence_client-0.17.0.dev4242-cp310-abi3-macosx_11_0_arm64.whland
evidence-client-node-v0.17.0-dev.4242.1-macos-arm64.tgz.node:22.12.0-bookwormon agit archivecopy: thewheel lands as
...-cp310-abi3-linux_aarch64.whl(the assumption macOScannot check), and the tarball carries
package/evidence-client.linux-arm64-gnu.nodeand installs.instead: the napi-generated
index.jsloads./evidence-client.linux-x64-gnu.nodeon linux/x64/glibc, so builder andloader share one platform string, and
--compatibility linuxtags a wheellinux_$(uname -m). If either is wrong, the roster fails the job rather thanpublishing something broken.
publish's roster step, also rendered from the YAML, passes against afabricated 19-asset set and refuses that set with one wheel removed.
fact correct:
tar -tzf | grep -qxunderpipefailreportstar's SIGPIPE141 when
grep -qexits early. macOS had passed on buffering luck. The checknow captures the listing instead of piping it.
The first real end-to-end run is post-merge:
evidence-dev.ymlonly dispatchesfrom
refs/heads/mainwith a successful CI push run for that exact SHA.crates/registry-evidence-client-py/README.mdsaid no CI path invokesmaturin, which this change makes false; it now names both consumers.